mirror of
https://github.com/natelandau/ansible-homelab-config.git
synced 2025-11-17 09:23:40 -05:00
Initial commit
This commit is contained in:
47
tasks/backups.yml
Normal file
47
tasks/backups.yml
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Nomad jobs which can not run with NFS storage use pre-start and post-stop tasks to invoke
|
||||
# shell scripts which keep the job's filesystem in sync. This task does the following:
|
||||
#
|
||||
# 1. Copies a backup and restore shellscript to /usr/local/bin
|
||||
# 2. Edits the sudoers file to allow the script to be invoked with sudo privileges
|
||||
|
||||
- name: copy backup shellscript to server
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: scripts/service_backups.sh.j2
|
||||
dest: /usr/local/bin/service_backups
|
||||
mode: 0755
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server
|
||||
|
||||
- name: copy restore shellscript to server
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: scripts/service_restore.sh.j2
|
||||
dest: /usr/local/bin/service_restore
|
||||
mode: 0755
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server
|
||||
|
||||
- name: ensure nomad user can run sudo with the restore script
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
path: /etc/sudoers
|
||||
state: present
|
||||
line: "nomad ALL=(ALL) NOPASSWD: /usr/local/bin/service_backups, /usr/local/bin/service_restore"
|
||||
validate: "/usr/sbin/visudo -cf %s"
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server
|
||||
- "'pis' in group_names"
|
||||
|
||||
- name: ensure my user can run sudo with the restore script
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
path: /etc/sudoers
|
||||
state: present
|
||||
line: "{{ ansible_user }} ALL=(ALL) NOPASSWD: /usr/local/bin/service_backups, /usr/local/bin/service_restore"
|
||||
validate: "/usr/sbin/visudo -cf %s"
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server
|
||||
- "'pis' in group_names"
|
||||
163
tasks/cluster_storage.yml
Normal file
163
tasks/cluster_storage.yml
Normal file
@@ -0,0 +1,163 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Adds mount points to shared NFS storage to servers working in the homelab cluster.
|
||||
|
||||
# --------------------------------- Mount on Raspberry Pis
|
||||
- name: "Mount storage on Raspberry Pis"
|
||||
when: "'pis' in group_names"
|
||||
block:
|
||||
- name: ensure local mount points exist
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ item.local }}"
|
||||
state: directory
|
||||
mode: 0777
|
||||
# owner: "{{ ansible_user_uid }}"
|
||||
# group: "{{ ansible_user_gid }}"
|
||||
loop: "{{ rpi_nfs_mounts_list }}"
|
||||
|
||||
- name: remove old nfs drives
|
||||
become: true
|
||||
ansible.posix.mount:
|
||||
path: "{{ item.local }}"
|
||||
src: "{{ item.src }}"
|
||||
fstype: nfs
|
||||
opts: defaults,hard,intr,timeo=14
|
||||
state: absent
|
||||
loop: "{{ rpi_nfs_mounts_remove }}"
|
||||
|
||||
- name: mount all nfs drives
|
||||
become: true
|
||||
ansible.posix.mount:
|
||||
path: "{{ item.local }}"
|
||||
src: "{{ item.src }}"
|
||||
fstype: nfs
|
||||
opts: defaults,hard,intr,timeo=14
|
||||
state: mounted
|
||||
loop: "{{ rpi_nfs_mounts_list }}"
|
||||
|
||||
# --------------------------------- Mount on Macs
|
||||
# https://gist.github.com/l422y/8697518
|
||||
- name: "Mount storage on Macs"
|
||||
when: "'macs' in group_names"
|
||||
block:
|
||||
- name: create mount_point
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ mac_storage_mount_point }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
|
||||
# I ran into problems getting this to run successfully. If errors occur, add the line manually using:
|
||||
# $ sudo nano /private/etc/auto_master
|
||||
|
||||
- name: add NFS shared drives to macs
|
||||
when: mac_autofs_type == 'nfs'
|
||||
block:
|
||||
- name: add auto_nfs to "/private/etc/auto_master"
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
path: /private/etc/auto_master
|
||||
regexp: "auto_nfs"
|
||||
line: "/- auto_nfs -nobrowse,nosuid"
|
||||
unsafe_writes: true
|
||||
|
||||
- name: add mounts to /etc/auto_nfs
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
create: true
|
||||
path: /private/etc/auto_nfs
|
||||
regexp: "{{ item.src }}"
|
||||
line: "{{ item.local }} -fstype=nfs,bg,intr,noowners,rw,vers=4 nfs://{{ item.src }}"
|
||||
state: present
|
||||
unsafe_writes: true
|
||||
mode: 0644
|
||||
loop: "{{ mac_nfs_mounts_list if mac_nfs_mounts_list is iterable else [] }}"
|
||||
notify: mac_run_automount
|
||||
|
||||
- name: remove old mounts from /etc/auto_nfs
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
create: true
|
||||
path: /private/etc/auto_nfs
|
||||
regexp: "{{ item.src }}"
|
||||
line: "{{ item.local }} -fstype=nfs,bg,intr,noowners,rw,vers=4 nfs://{{ item.src }}"
|
||||
state: absent
|
||||
unsafe_writes: true
|
||||
mode: 0644
|
||||
notify: mac_run_automount_unmount
|
||||
loop: "{{ mac_nfs_mounts_remove if mac_nfs_mounts_remove is iterable else [] }}"
|
||||
|
||||
- name: add AFP shared drives to macs
|
||||
when: mac_autofs_type == 'afp'
|
||||
block:
|
||||
- name: add auto_afp to "/private/etc/auto_master"
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
path: /private/etc/auto_master
|
||||
regexp: "auto_afp"
|
||||
line: "/- auto_afp -nobrowse,nosuid"
|
||||
unsafe_writes: true
|
||||
|
||||
- name: add mounts to /etc/auto_afp
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
create: true
|
||||
path: /private/etc/auto_afp
|
||||
regexp: "{{ item.src }}"
|
||||
line: "{{ item.local }} -fstype=afp,rw afp://{{ item.src }}"
|
||||
state: present
|
||||
unsafe_writes: true
|
||||
mode: 0644
|
||||
loop: "{{ mac_afp_or_smb_mounts_list if mac_afp_or_smb_mounts_list is iterable else [] }}"
|
||||
notify: mac_run_automount
|
||||
|
||||
- name: remove mounts from /etc/auto_afp
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
create: true
|
||||
path: /private/etc/auto_afp
|
||||
regexp: "{{ item.src }}"
|
||||
line: "{{ item.local }} -fstype=afp,rw afp://{{ item.src }}"
|
||||
state: present
|
||||
unsafe_writes: true
|
||||
mode: 0644
|
||||
loop: "{{ mac_afp_or_smb_mounts_remove if mac_afp_or_smb_mounts_remove is iterable else [] }}"
|
||||
notify: mac_run_automount_unmount
|
||||
|
||||
- name: add SMB shared drives to macs
|
||||
when: mac_autofs_type == 'smb'
|
||||
block:
|
||||
- name: add auto_smb to "/private/etc/auto_master"
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
path: /private/etc/auto_master
|
||||
regexp: "auto_smb"
|
||||
line: "/- auto_smb -noowners,nosuid"
|
||||
unsafe_writes: true
|
||||
|
||||
- name: add mounts to /etc/auto_smb
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
create: true
|
||||
path: /private/etc/auto_smb
|
||||
regexp: "{{ item.src }}"
|
||||
line: "{{ item.local }} -fstype=smbfs,soft,noowners,nosuid,rw ://{{ smb_username }}:{{ smb_password }}@{{ item.src }}"
|
||||
state: present
|
||||
unsafe_writes: true
|
||||
mode: 0644
|
||||
loop: "{{ mac_afp_or_smb_mounts_list if mac_afp_or_smb_mounts_list is iterable else [] }}"
|
||||
notify: mac_run_automount
|
||||
|
||||
- name: remove mounts from /etc/auto_smb
|
||||
become: true
|
||||
ansible.builtin.lineinfile:
|
||||
create: true
|
||||
path: /private/etc/auto_smb
|
||||
regexp: "{{ item.src }}"
|
||||
line: "{{ item.local }} -fstype=afp,rw afp://{{ item.src }}"
|
||||
state: present
|
||||
unsafe_writes: true
|
||||
mode: 0644
|
||||
loop: "{{ mac_afp_or_smb_mounts_remove if mac_afp_or_smb_mounts_remove is iterable else [] }}"
|
||||
notify: mac_run_automount_unmount
|
||||
327
tasks/consul.yml
Normal file
327
tasks/consul.yml
Normal file
@@ -0,0 +1,327 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Downloads, installs, and configures Hashicorp Consul.
|
||||
|
||||
- name: Set variables needed to install consul
|
||||
block:
|
||||
- name: "set variable: check if we have a mounted USB drive (Debian)"
|
||||
ansible.builtin.stat:
|
||||
path: "{{ rpi_usb_drive_mount_point }}"
|
||||
register: have_usb_drive
|
||||
changed_when: false
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: "set variable: Use USB drive for consul /opt (Debian)"
|
||||
ansible.builtin.set_fact:
|
||||
consul_opt_dir: "{{ rpi_usb_drive_mount_point }}/opt/consul"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- have_usb_drive.stat.exists
|
||||
|
||||
- name: "set variable: Use root disk for consul /opt (Debian)"
|
||||
ansible.builtin.set_fact:
|
||||
consul_opt_dir: "/opt/consul"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- not have_usb_drive.stat.exists
|
||||
|
||||
- name: "set variable: Use ~/library for /opt files (macOSX)"
|
||||
ansible.builtin.set_fact:
|
||||
consul_opt_dir: "/Users/{{ ansible_user }}/Library/consul"
|
||||
when:
|
||||
- mac_intel or mac_arm
|
||||
|
||||
- name: "set variable: Use ~/volume1/docker/consul/data for /opt files (synology)"
|
||||
ansible.builtin.set_fact:
|
||||
consul_opt_dir: "/volume1/docker/consul/data"
|
||||
when:
|
||||
- inventory_hostname == 'synology'
|
||||
|
||||
- name: "set variable: Set Consul download Binary (armv7l)"
|
||||
ansible.builtin.set_fact:
|
||||
consul_download_uri: "https://releases.hashicorp.com/consul/{{ consul_version }}/consul_{{ consul_version }}_linux_arm.zip"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- ansible_architecture == 'armv7l'
|
||||
|
||||
- name: "set variable: Set Consul download Binary (MacOSX)"
|
||||
ansible.builtin.set_fact:
|
||||
consul_download_uri: "https://releases.hashicorp.com/consul/{{ consul_version }}/consul_{{ consul_version }}_darwin_amd64.zip"
|
||||
when: mac_intel
|
||||
|
||||
- name: Assert that we can install Consul
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- consul_download_uri is defined
|
||||
- consul_opt_dir is defined
|
||||
fail_msg: "Unable to install consul on this host"
|
||||
when: inventory_hostname != 'synology'
|
||||
|
||||
- name: "Stop Consul"
|
||||
block:
|
||||
- name: "stop consul systemd service (Debian)"
|
||||
become: true
|
||||
ansible.builtin.systemd:
|
||||
name: consul
|
||||
state: stopped
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- ansible_facts.services["consul.service"] is defined
|
||||
|
||||
- name: "check if plist file exists (MacOSX)"
|
||||
ansible.builtin.stat:
|
||||
path: "{{ consul_plist_macos }}"
|
||||
register: consul_file
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
|
||||
- name: "unload consul agent (MacOSX)"
|
||||
become: true
|
||||
ansible.builtin.command:
|
||||
cmd: "launchctl unload {{ consul_plist_macos }}"
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
- consul_file.stat.exists
|
||||
|
||||
- name: "Create 'consul' user and group"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
block:
|
||||
- name: "Ensure group 'consul' exists (Debian)"
|
||||
become: true
|
||||
ansible.builtin.group:
|
||||
name: consul
|
||||
state: present
|
||||
|
||||
- name: "Add the user 'consul' with group 'consul' (Debian)"
|
||||
become: true
|
||||
ansible.builtin.user:
|
||||
name: consul
|
||||
group: consul
|
||||
|
||||
- name: "Create Consul /opt storage and copy certificates"
|
||||
block:
|
||||
- name: "create {{ consul_opt_dir }} directories"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ item }}"
|
||||
state: directory
|
||||
recurse: true
|
||||
mode: 0755
|
||||
loop:
|
||||
- "{{ consul_opt_dir }}"
|
||||
- "{{ consul_opt_dir }}/logs"
|
||||
- "{{ consul_opt_dir }}/plugins"
|
||||
- "{{ consul_opt_dir }}/certs"
|
||||
|
||||
- name: Copy certs to servers
|
||||
become: true
|
||||
ansible.builtin.copy:
|
||||
src: "{{ item.src }}"
|
||||
dest: "{{ item.dest }}"
|
||||
mode: 0755
|
||||
loop:
|
||||
- { src: "certs/consul/consul-agent-ca.pem", dest: "{{ consul_opt_dir }}/certs/consul-agent-ca.pem" }
|
||||
- { src: "certs/consul/{{ datacenter_name }}-server-consul-0.pem", dest: "{{ consul_opt_dir }}/certs/{{ datacenter_name }}-server-consul-0.pem" }
|
||||
- { src: "certs/consul/{{ datacenter_name }}-server-consul-0-key.pem", dest: "{{ consul_opt_dir }}/certs/{{ datacenter_name }}-server-consul-0-key.pem" }
|
||||
when:
|
||||
- is_consul_server
|
||||
|
||||
- name: Copy certs to clients
|
||||
become: true
|
||||
ansible.builtin.copy:
|
||||
src: certs/consul/consul-agent-ca.pem
|
||||
dest: "{{ consul_opt_dir }}/certs/consul-agent-ca.pem"
|
||||
mode: 0755
|
||||
when:
|
||||
- is_consul_client
|
||||
- not is_consul_server
|
||||
|
||||
- name: "set owner of files to consul:consul (debian)"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ consul_opt_dir }}"
|
||||
owner: consul
|
||||
group: consul
|
||||
recurse: true
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: "set owner of files to {{ ansible_user_uid }}:{{ ansible_user_gid }} (MacOSX)"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ consul_opt_dir }}"
|
||||
owner: "{{ ansible_user_uid }}"
|
||||
group: "{{ ansible_user_gid }}"
|
||||
recurse: true
|
||||
when:
|
||||
- ansible_os_family != 'Debian'
|
||||
|
||||
- name: "Template out Consul configuration file"
|
||||
block:
|
||||
- name: "create {{ interpolated_consul_configuration_dir }}"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ interpolated_consul_configuration_dir }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
|
||||
- name: copy consul base config file
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: consul.hcl.j2
|
||||
dest: "{{ interpolated_consul_configuration_dir }}/consul.hcl"
|
||||
mode: 0644
|
||||
|
||||
- name: "set owner of files to consul:consul (Debian)"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ interpolated_consul_configuration_dir }}"
|
||||
owner: consul
|
||||
group: consul
|
||||
recurse: true
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: "Install Consul binary"
|
||||
block:
|
||||
- name: "set fact: need install consul?"
|
||||
set_fact:
|
||||
need_consul_install: false
|
||||
when:
|
||||
- consul_download_uri is defined
|
||||
|
||||
- name: Check if Consul is installed
|
||||
ansible.builtin.stat:
|
||||
path: /usr/local/bin/consul
|
||||
register: consul_binary_file_location
|
||||
when:
|
||||
- consul_download_uri is defined
|
||||
|
||||
- name: "set fact: need consul install?"
|
||||
set_fact:
|
||||
need_consul_install: true
|
||||
when:
|
||||
- consul_download_uri is defined
|
||||
- not consul_binary_file_location.stat.exists
|
||||
|
||||
- name: Check current version of Consul
|
||||
ansible.builtin.command:
|
||||
cmd: /usr/local/bin/consul --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+'
|
||||
ignore_errors: true
|
||||
changed_when: false
|
||||
register: installed_consul_version
|
||||
check_mode: false
|
||||
when:
|
||||
- consul_download_uri is defined
|
||||
- not need_consul_install
|
||||
|
||||
- name: "set fact: need consul install?"
|
||||
set_fact:
|
||||
need_consul_install: true
|
||||
when:
|
||||
- consul_download_uri is defined
|
||||
- not need_consul_install
|
||||
- installed_consul_version.stdout != consul_version
|
||||
|
||||
- name: install Consul
|
||||
become: true
|
||||
ansible.builtin.unarchive:
|
||||
src: "{{ consul_download_uri }}"
|
||||
dest: /usr/local/bin
|
||||
remote_src: true
|
||||
when:
|
||||
- consul_download_uri is defined
|
||||
- need_consul_install
|
||||
|
||||
- name: "validate consul config"
|
||||
ansible.builtin.command:
|
||||
cmd: "/usr/local/bin/consul validate {{ interpolated_consul_configuration_dir }}"
|
||||
register: consul_config_valid
|
||||
changed_when: false
|
||||
failed_when: consul_config_valid.rc != 0
|
||||
when:
|
||||
- inventory_hostname != 'synology'
|
||||
|
||||
- name: "Copy system.d or launchctl service files"
|
||||
block:
|
||||
- name: ensure /Library/LaunchAgents exists (MacOSX)
|
||||
ansible.builtin.file:
|
||||
path: "{{ consul_plist_macos | dirname }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
|
||||
- name: create Consul launchd service (MacOSX)
|
||||
ansible.builtin.template:
|
||||
src: consul.launchd.j2
|
||||
dest: "{{ consul_plist_macos }}"
|
||||
mode: 0644
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
|
||||
- name: create Consul service (Debian)
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: consul.service.j2
|
||||
dest: /etc/systemd/system/consul.service
|
||||
mode: 0644
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: "Start Consul"
|
||||
block:
|
||||
- name: load the Consul agent (MacOSX)
|
||||
ansible.builtin.command:
|
||||
cmd: "launchctl load -w {{ consul_plist_macos }}"
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
- "'nostart' not in ansible_run_tags"
|
||||
|
||||
- name: start Consul (Debian)
|
||||
become: true
|
||||
ansible.builtin.systemd:
|
||||
name: consul
|
||||
enabled: true
|
||||
state: started
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- "'nostart' not in ansible_run_tags"
|
||||
|
||||
- name: make sure Consul service is really running
|
||||
ansible.builtin.command:
|
||||
cmd: systemctl is-active consul
|
||||
register: is_consul_really_running
|
||||
changed_when: false
|
||||
failed_when: is_consul_really_running.rc != 0
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- "'nostart' not in ansible_run_tags"
|
||||
|
||||
- name: "Copy Consul service checks to synology"
|
||||
when:
|
||||
- inventory_hostname == 'synology'
|
||||
block:
|
||||
- name: copy config file
|
||||
ansible.builtin.template:
|
||||
src: consul_services/consul_synology_checks.json.j2
|
||||
dest: "{{ interpolated_consul_configuration_dir }}/service_checks.json"
|
||||
mode: 0644
|
||||
|
||||
- name: Reload configuration file
|
||||
ansible.builtin.uri:
|
||||
url: "http://{{ synology_second_ip }}:8500/v1/agent/reload"
|
||||
method: PUT
|
||||
status_code: 200
|
||||
ignore_errors: true
|
||||
check_mode: false
|
||||
register: consul_agent_reload_http_response
|
||||
failed_when: consul_agent_reload_http_response.status != 200
|
||||
|
||||
- name: debug when consul agent reload fails
|
||||
ansible.builtin.debug:
|
||||
var: consul_agent_reload_http_response.msg
|
||||
check_mode: false
|
||||
when: consul_agent_reload_http_response.status != 200
|
||||
37
tasks/debug.yml
Normal file
37
tasks/debug.yml
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
# - name: architecture
|
||||
# debug:
|
||||
# var: ansible_facts['architecture']
|
||||
|
||||
# - name: distribution
|
||||
# debug:
|
||||
# var: ansible_facts['distribution']
|
||||
|
||||
# - name: distribution_file_variety
|
||||
# debug:
|
||||
# var: ansible_facts['distribution_file_variety']
|
||||
|
||||
# - name: service_mgr
|
||||
# debug:
|
||||
# var: ansible_facts['service_mgr']
|
||||
|
||||
# - name: os_family
|
||||
# debug:
|
||||
# var: ansible_facts['os_family']
|
||||
|
||||
# - debug:
|
||||
# msg: "{{ ansible_os_family }}"
|
||||
|
||||
# - debug:
|
||||
# msg: "pass: {{ ansible_become_pass }}"
|
||||
|
||||
# - debug:
|
||||
# var: ansible_facts['nodename']
|
||||
|
||||
# - debug:
|
||||
# var: ansible_facts['system_vendor']
|
||||
# when:
|
||||
# - ansible_facts['system_vendor'] is search("Synology")
|
||||
|
||||
- name: "end play"
|
||||
ansible.builtin.meta: end_play
|
||||
88
tasks/docker.yml
Normal file
88
tasks/docker.yml
Normal file
@@ -0,0 +1,88 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Installs Docker on specified server
|
||||
|
||||
- name: Check if Docker is already present
|
||||
ansible.builtin.command:
|
||||
cmd: docker --version
|
||||
register: docker_command_result
|
||||
changed_when: docker_command_result.rc == 1
|
||||
failed_when: false
|
||||
|
||||
- name: install docker on Debian
|
||||
when: ansible_os_family == 'Debian'
|
||||
block:
|
||||
- name: "Add docker local filesystem storage directory"
|
||||
ansible.builtin.file:
|
||||
path: "{{ rpi_localfs_storage }}"
|
||||
mode: 0755
|
||||
state: directory
|
||||
|
||||
- name: Download Docker install convenience script
|
||||
ansible.builtin.get_url:
|
||||
url: "https://get.docker.com/"
|
||||
dest: /tmp/get-docker.sh
|
||||
mode: 0775
|
||||
when: docker_command_result.rc == 1
|
||||
|
||||
- name: Run Docker install convenience script
|
||||
ansible.builtin.command: /tmp/get-docker.sh
|
||||
environment:
|
||||
CHANNEL: stable
|
||||
when: docker_command_result.rc == 1
|
||||
|
||||
- name: Make sure Docker CE is the version specified
|
||||
ansible.builtin.apt:
|
||||
name: "docker-ce"
|
||||
state: present
|
||||
when: docker_command_result.rc == 1
|
||||
|
||||
- name: Ensure Docker is started
|
||||
ansible.builtin.service:
|
||||
name: docker
|
||||
state: started
|
||||
enabled: true
|
||||
|
||||
- name: Ensure docker users are added to the docker group
|
||||
become: true
|
||||
ansible.builtin.user:
|
||||
name: "{{ ansible_user }}"
|
||||
groups: docker
|
||||
append: true
|
||||
when: docker_command_result.rc == 1
|
||||
|
||||
- name: install docker on macOS
|
||||
when: "'macs' in group_names"
|
||||
block:
|
||||
- name: "Add docker directory to ~/Library"
|
||||
ansible.builtin.file:
|
||||
path: "{{ mac_localfs_storage }}"
|
||||
mode: 0755
|
||||
state: directory
|
||||
|
||||
- name: install base homebrew packages
|
||||
community.general.homebrew:
|
||||
name: docker
|
||||
state: present
|
||||
update_homebrew: false
|
||||
upgrade_all: false
|
||||
when: docker_command_result.rc == 1
|
||||
|
||||
- name: open docker application
|
||||
ansible.builtin.command:
|
||||
cmd: open /Applications/Docker.app
|
||||
when: docker_command_result.rc == 1
|
||||
|
||||
- name: Must install Docker manually
|
||||
ansible.builtin.debug:
|
||||
msg: |
|
||||
Docker must be installed manually on MacOS. Log in to mac to install then rerun playbook
|
||||
|
||||
Be certain to configure the following:
|
||||
- run on login
|
||||
- add '{{ mac_storage_mount_point }}' to mountable file system directories
|
||||
when: docker_command_result.rc == 1
|
||||
|
||||
- name: end play
|
||||
ansible.builtin.meta: end_play
|
||||
when: docker_command_result.rc == 1
|
||||
53
tasks/interpolated_variables.yml
Normal file
53
tasks/interpolated_variables.yml
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Creates variables based on other variables and Ansible facts
|
||||
#
|
||||
# Variables created:
|
||||
# - interpolated_localfs_service_storage: [dir]
|
||||
# - interpolated_consul_configuration_dir: [dir]
|
||||
|
||||
- name: "Set local filesystem location (pis)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_localfs_service_storage: "{{ rpi_localfs_service_storage }}"
|
||||
changed_when: false
|
||||
when:
|
||||
- "'pis' in group_names"
|
||||
|
||||
- name: "Set local filesystem location (macs)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_localfs_service_storage: "{{ mac_localfs_service_storage }}"
|
||||
changed_when: false
|
||||
when:
|
||||
- "'macs' in group_names"
|
||||
|
||||
- name: "Set NFS mount location (pis)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_nfs_service_storage: "{{ rpi_nfs_mount_point }}"
|
||||
changed_when: false
|
||||
when:
|
||||
- "'pis' in group_names"
|
||||
|
||||
- name: "Set NFS mount location location (macs)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_nfs_service_storage: "{{ mac_storage_mount_point }}"
|
||||
changed_when: false
|
||||
when:
|
||||
- "'macs' in group_names"
|
||||
|
||||
- name: "set consul configuration directory (synology)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_consul_configuration_dir: "{{ synology_consul_configuration_dir }}"
|
||||
when:
|
||||
- inventory_hostname == 'synology'
|
||||
|
||||
- name: "set consul configuration directory (pis)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_consul_configuration_dir: "{{ rpi_consul_configuration_dir }}"
|
||||
when:
|
||||
- "'pis' in group_names"
|
||||
|
||||
- name: "set consul configuration directory (macs)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_consul_configuration_dir: "{{ mac_consul_configuration_dir }}"
|
||||
when:
|
||||
- "'macs' in group_names"
|
||||
32
tasks/logrotate.yml
Normal file
32
tasks/logrotate.yml
Normal file
@@ -0,0 +1,32 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Insalls logrotate and associated rotation jobs
|
||||
#
|
||||
# NOTE: This task exists due to the arillso.logrotate failing completely on macOS
|
||||
|
||||
- name: add service_backups.log to logrotate
|
||||
become: true
|
||||
vars:
|
||||
logrotate_applications:
|
||||
- name: service_backups
|
||||
definitions:
|
||||
- logs:
|
||||
- "{{ rpi_nfs_mount_point }}/pi-cluster/logs/service_backups.log"
|
||||
options:
|
||||
- rotate 1
|
||||
- size 100k
|
||||
- missingok
|
||||
- notifempty
|
||||
- su root root
|
||||
- extension .log
|
||||
- compress
|
||||
- nodateext
|
||||
- nocreate
|
||||
- delaycompress
|
||||
import_role:
|
||||
name: arillso.logrotate
|
||||
failed_when: false
|
||||
ignore_errors: true
|
||||
when:
|
||||
- "'macs' not in group_names"
|
||||
- is_cluster_leader
|
||||
242
tasks/nomad.yml
Normal file
242
tasks/nomad.yml
Normal file
@@ -0,0 +1,242 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Downloads, installs, and configures Hashicorp Nomad.
|
||||
|
||||
- name: "Set variables needed to install Nomad"
|
||||
block:
|
||||
- name: "set variable: check if we have a mounted USB drive (Debian)"
|
||||
ansible.builtin.stat:
|
||||
path: "{{ rpi_usb_drive_mount_point }}"
|
||||
register: have_usb_drive
|
||||
changed_when: false
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: "set variable: Use USB drive for nomad /opt (Debian)"
|
||||
ansible.builtin.set_fact:
|
||||
nomad_opt_dir_location: "{{ rpi_usb_drive_mount_point }}/opt/nomad"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- have_usb_drive.stat.exists
|
||||
|
||||
- name: "set variable: Use root dist for nomad /opt (Debian)"
|
||||
ansible.builtin.set_fact:
|
||||
nomad_opt_dir_location: "/opt/nomad"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- not have_usb_drive.stat.exists
|
||||
|
||||
- name: "set variable: Use ~/library for /opt files (macOSX)"
|
||||
ansible.builtin.set_fact:
|
||||
nomad_opt_dir_location: "/Users/{{ ansible_user }}/Library/nomad"
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
|
||||
- name: "set variable: Set Nomad download Binary (armv7l)"
|
||||
ansible.builtin.set_fact:
|
||||
nomad_download_file_uri: "https://releases.hashicorp.com/nomad/{{ nomad_version }}/nomad_{{ nomad_version }}_linux_arm.zip"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- ansible_architecture == 'armv7l'
|
||||
|
||||
- name: "set variable: Set Nomad download Binary (MacOSX)"
|
||||
ansible.builtin.set_fact:
|
||||
nomad_download_file_uri: "https://releases.hashicorp.com/nomad/{{ nomad_version }}/nomad_{{ nomad_version }}_darwin_amd64.zip"
|
||||
when:
|
||||
- mac_intel
|
||||
|
||||
- name: Assert that we can install Nomad
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- nomad_download_file_uri is defined
|
||||
- nomad_opt_dir_location is defined
|
||||
fail_msg: "Unable to install Nomad on this host"
|
||||
|
||||
- name: "Create Nomad user and group (Debian)"
|
||||
when: ansible_os_family == 'Debian'
|
||||
block:
|
||||
- name: "Ensure group 'nomad' exists (Debian)"
|
||||
become: true
|
||||
ansible.builtin.group:
|
||||
name: nomad
|
||||
state: present
|
||||
|
||||
- name: "Add the user 'nomad' with group 'nomad' (Debian)"
|
||||
become: true
|
||||
ansible.builtin.user:
|
||||
name: nomad
|
||||
group: nomad
|
||||
|
||||
- name: "Add user 'nomad' to docker and sudo groups (Debian)"
|
||||
become: true
|
||||
ansible.builtin.user:
|
||||
user: nomad
|
||||
groups: docker,sudo
|
||||
append: true
|
||||
|
||||
- name: "Create Nomad /opt storage"
|
||||
block:
|
||||
- name: "create {{ nomad_opt_dir_location }} directories"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ item }}"
|
||||
state: directory
|
||||
recurse: true
|
||||
mode: 0755
|
||||
loop:
|
||||
- "{{ nomad_opt_dir_location }}/logs"
|
||||
- "{{ nomad_opt_dir_location }}/plugins"
|
||||
- "{{ nomad_opt_dir_location }}/certs"
|
||||
|
||||
- name: Copy server certs
|
||||
become: true
|
||||
ansible.builtin.copy:
|
||||
src: "{{ item.src }}"
|
||||
dest: "{{ item.dest }}"
|
||||
mode: 0755
|
||||
loop:
|
||||
- { src: certs/nomad/nomad-ca.pem, dest: "{{ nomad_opt_dir_location }}/certs/nomad-ca.pem" }
|
||||
- { src: certs/nomad/server.pem, dest: "{{ nomad_opt_dir_location }}/certs/server.pem" }
|
||||
- { src: certs/nomad/server-key.pem, dest: "{{ nomad_opt_dir_location }}/certs/server-key.pem" }
|
||||
notify: "restart nomad"
|
||||
when: is_nomad_server
|
||||
|
||||
- name: Copy client certs
|
||||
become: true
|
||||
ansible.builtin.copy:
|
||||
src: "{{ item.src }}"
|
||||
dest: "{{ item.dest }}"
|
||||
mode: 0755
|
||||
loop:
|
||||
- { src: certs/nomad/nomad-ca.pem, dest: "{{ nomad_opt_dir_location }}/certs/nomad-ca.pem" }
|
||||
- { src: certs/nomad/client.pem, dest: "{{ nomad_opt_dir_location }}/certs/client.pem" }
|
||||
- { src: certs/nomad/client-key.pem, dest: "{{ nomad_opt_dir_location }}/certs/client-key.pem" }
|
||||
notify: "restart nomad"
|
||||
when: is_nomad_client
|
||||
|
||||
- name: "set owner of files to nomad:nomad (debian)"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ nomad_opt_dir_location }}"
|
||||
owner: nomad
|
||||
group: nomad
|
||||
recurse: true
|
||||
when: ansible_os_family == 'Debian'
|
||||
|
||||
- name: "set owner of files to {{ ansible_user_uid }}:{{ ansible_user_gid }} (MacOSX)"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ nomad_opt_dir_location }}"
|
||||
owner: "{{ ansible_user_uid }}"
|
||||
group: "{{ ansible_user_gid }}"
|
||||
recurse: true
|
||||
when: ansible_os_family != 'Debian'
|
||||
|
||||
- name: "Template out the configuration file"
|
||||
block:
|
||||
- name: "create {{ nomad_configuration_dir }}"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ nomad_configuration_dir }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
|
||||
- name: copy base config file
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: nomad.hcl.j2
|
||||
dest: "{{ nomad_configuration_dir }}/nomad.hcl"
|
||||
mode: 0644
|
||||
notify: "restart nomad"
|
||||
|
||||
- name: "set owner of files to nomad:nomad (Debian)"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ nomad_configuration_dir }}"
|
||||
owner: nomad
|
||||
group: nomad
|
||||
recurse: true
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: Install or Update Nomad
|
||||
block:
|
||||
- name: "set fact: do we need a nomad install?"
|
||||
set_fact:
|
||||
need_nomad_install: false
|
||||
|
||||
- name: Check if nomad is installed
|
||||
ansible.builtin.stat:
|
||||
path: /usr/local/bin/nomad
|
||||
register: nomad_binary_file_location
|
||||
|
||||
- name: "set fact: do we need a nomad install"
|
||||
set_fact:
|
||||
need_nomad_install: true
|
||||
when:
|
||||
- not nomad_binary_file_location.stat.exists
|
||||
|
||||
- name: Check current version of Nomad
|
||||
ansible.builtin.shell: /usr/local/bin/nomad --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+'
|
||||
ignore_errors: true
|
||||
register: current_nomad_version
|
||||
check_mode: false
|
||||
changed_when: false
|
||||
when:
|
||||
- not need_nomad_install
|
||||
|
||||
- name: "set fact: do we need a nomad install"
|
||||
set_fact:
|
||||
need_nomad_install: true
|
||||
when:
|
||||
- not need_nomad_install
|
||||
- current_nomad_version.stdout != nomad_version
|
||||
|
||||
- name: install Nomad
|
||||
become: true
|
||||
unarchive:
|
||||
src: "{{ nomad_download_file_uri }}"
|
||||
dest: /usr/local/bin
|
||||
remote_src: true
|
||||
notify: "restart nomad"
|
||||
when:
|
||||
- need_nomad_install
|
||||
|
||||
- name: "Copy system.d or launchctrl service files"
|
||||
block:
|
||||
- name: ensure /Library/LaunchAgents exists (MacOSX)
|
||||
ansible.builtin.file:
|
||||
path: "{{ nomad_plist_macos | dirname }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
|
||||
- name: create nomad launchd service (MacOSX)
|
||||
ansible.builtin.template:
|
||||
src: nomad.launchd.j2
|
||||
dest: "{{ nomad_plist_macos }}"
|
||||
mode: 0644
|
||||
notify: "restart nomad"
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
|
||||
- name: create nomad service (Debian)
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: nomad.service.j2
|
||||
dest: /etc/systemd/system/nomad.service
|
||||
mode: 0644
|
||||
notify: "restart nomad"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: "start nomad, if stopped"
|
||||
ansible.builtin.shell:
|
||||
cmd: "/usr/local/bin/nomad node status -self -short | grep {{ inventory_hostname }}"
|
||||
register: node_status_response
|
||||
ignore_errors: true
|
||||
failed_when: false
|
||||
changed_when: node_status_response.rc > 0
|
||||
notify: "restart nomad"
|
||||
when: "'nostart' not in ansible_run_tags"
|
||||
76
tasks/orchestration_jobs.yml
Normal file
76
tasks/orchestration_jobs.yml
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Keeps Nomad jobs and docker-compose-files in sync. All job and docker-compose files are written as Jinja2 templates. Performs the following:
|
||||
#
|
||||
# - Syncs Nomad jobs
|
||||
# - Syncs docker-compose files
|
||||
# - Ensures we have directories on the local filesystem for jobs which can't function with networked
|
||||
# storage. (I'm looking at you, 'arr' apps). These folders must be created, even if empty, to
|
||||
# allow mounting nomad local storage end-points
|
||||
|
||||
- name: "Sync Nomad Jobs"
|
||||
block:
|
||||
- name: Remove nomad jobs directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ nomad_jobfile_location }}"
|
||||
state: absent
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server or ("'macs' in group_names")
|
||||
- clean_nomad_jobs
|
||||
|
||||
- name: (Re)Create nomad jobs directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ nomad_jobfile_location }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server or ("'macs' in group_names")
|
||||
- "'nas' not in group_names"
|
||||
|
||||
- name: synchronize nomad job templates (jinja)
|
||||
ansible.builtin.template:
|
||||
src: "{{ item }}"
|
||||
dest: "{{ nomad_jobfile_location }}/{{ item | basename | regex_replace('.j2$', '') }}"
|
||||
mode: 0644
|
||||
with_fileglob: "templates/nomad_jobs/*.j2"
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server or ("'macs' in group_names")
|
||||
- "'nas' not in group_names"
|
||||
|
||||
- name: synchronize nomad job templates (hcl)
|
||||
ansible.builtin.template:
|
||||
src: "{{ item }}"
|
||||
dest: "{{ nomad_jobfile_location }}/{{ item | basename }}"
|
||||
mode: 0644
|
||||
with_fileglob: "templates/nomad_jobs/*.hcl"
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server or ("'macs' in group_names")
|
||||
- "'nas' not in group_names"
|
||||
|
||||
- name: Ensure we have local storage folders
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ interpolated_localfs_service_storage }}/{{ item }}"
|
||||
state: directory
|
||||
mode: 0777
|
||||
group: "{{ ansible_user_gid }}"
|
||||
owner: "{{ ansible_user_uid }}"
|
||||
when:
|
||||
- is_nomad_client or is_nomad_server
|
||||
loop: "{{ service_localfs_dirs }}"
|
||||
|
||||
- name: "Sync docker compose files"
|
||||
when: is_docker_compose_client
|
||||
block:
|
||||
- name: confirm compose file dir exists
|
||||
ansible.builtin.file:
|
||||
path: "{{ docker_compose_file_location }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
|
||||
- name: synchronize docker-compose files
|
||||
ansible.builtin.template:
|
||||
src: "{{ item }}"
|
||||
dest: "{{ docker_compose_file_location }}/{{ item | basename | regex_replace('.j2$', '') }}"
|
||||
mode: 0644
|
||||
with_fileglob: "../templates/docker_compose_files/*.j2"
|
||||
67
tasks/packages.yml
Normal file
67
tasks/packages.yml
Normal file
@@ -0,0 +1,67 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Ensures all packages are installed and updated. apt on Debian. Homebrew on Mac.
|
||||
|
||||
- name: "Update and install APT packages"
|
||||
when:
|
||||
- ansible_os_family != 'Darwin'
|
||||
- manage_apt_packages_list
|
||||
block:
|
||||
- name: update APT package cache
|
||||
become: true
|
||||
ansible.builtin.apt:
|
||||
update_cache: true
|
||||
cache_valid_time: 3600
|
||||
|
||||
- name: "upgrade APT to the latest packages (this may take a while)"
|
||||
become: true
|
||||
ansible.builtin.apt:
|
||||
upgrade: safe
|
||||
|
||||
- name: "install/upgrade APT packages (this may take a while)"
|
||||
become: true
|
||||
ansible.builtin.apt:
|
||||
pkg: "{{ item }}"
|
||||
state: present
|
||||
loop: "{{ apt_packages_list }}"
|
||||
register: apt_output
|
||||
|
||||
- name: "Update and install Homebrew packages"
|
||||
when:
|
||||
- manage_homebrew_package_list
|
||||
- ansible_os_family == 'Darwin'
|
||||
block:
|
||||
- name: upgrade homebrew and all packages
|
||||
community.general.homebrew:
|
||||
update_homebrew: true
|
||||
upgrade_all: true
|
||||
register: homebrew_output
|
||||
ignore_errors: true
|
||||
|
||||
- name: install base homebrew packages
|
||||
community.general.homebrew:
|
||||
name: "{{ homebrew_package_list | join(',') }}"
|
||||
state: present
|
||||
update_homebrew: false
|
||||
upgrade_all: false
|
||||
register: homebrew_output
|
||||
|
||||
- name: homebrew packages updated or installed
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ homebrew_output.changed_pkgs }}"
|
||||
|
||||
- name: unchanged homebrew packages
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ homebrew_output.unchanged_pkgs }}"
|
||||
|
||||
- name: install homebrew casks
|
||||
community.general.homebrew_cask:
|
||||
name: "{{ item }}"
|
||||
state: present
|
||||
install_options: "appdir=/Applications"
|
||||
accept_external_apps: true
|
||||
upgrade_all: false
|
||||
update_homebrew: false
|
||||
greedy: false
|
||||
loop: "{{ homebrew_casks_list }}"
|
||||
ignore_errors: true
|
||||
40
tasks/pull_repositories.yml
Normal file
40
tasks/pull_repositories.yml
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Runs a git pull against all repositories in ~/repos by running a shellscript named 'pull_all_repos'.
|
||||
# NOTE: This shellscript is not part of this repository.
|
||||
|
||||
- name: "Check if pull_all_repos exists"
|
||||
ansible.builtin.stat:
|
||||
path: "~/bin/pull_all_repos"
|
||||
check_mode: false
|
||||
register: pull_script_check
|
||||
|
||||
- name: "Check if ~/repos exists"
|
||||
ansible.builtin.stat:
|
||||
path: "~/repos"
|
||||
check_mode: false
|
||||
register: repos_directory_check
|
||||
|
||||
- name: "run pull_all_repos script"
|
||||
ansible.builtin.command:
|
||||
cmd: "~/bin/pull_all_repos --directory ~/repos"
|
||||
register: pull_script_output
|
||||
when:
|
||||
- not ansible_check_mode
|
||||
- pull_script_check.stat.exists
|
||||
- pull_script_check.stat.executable
|
||||
- repos_directory_check.stat.isdir is defined
|
||||
- repos_directory_check.stat.isdir
|
||||
- repos_directory_check.stat.writeable
|
||||
failed_when: pull_script_output.rc > 1
|
||||
|
||||
- name: "Output from pull_all_repos"
|
||||
debug:
|
||||
msg: "{{ pull_script_output.stdout }}"
|
||||
when:
|
||||
- not ansible_check_mode
|
||||
- pull_script_check.stat.exists
|
||||
- pull_script_check.stat.executable
|
||||
- repos_directory_check.stat.isdir is defined
|
||||
- repos_directory_check.stat.isdir
|
||||
- repos_directory_check.stat.writeable
|
||||
12
tasks/sanity.yml
Normal file
12
tasks/sanity.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Always runs fist. Confirms we can actually use Ansible
|
||||
- name: sanity - user mode
|
||||
become: false
|
||||
ansible.builtin.debug:
|
||||
msg: "sanity check: user mode"
|
||||
|
||||
- name: sanity - become mode
|
||||
become: true
|
||||
ansible.builtin.debug:
|
||||
msg: "sanity check: become mode"
|
||||
93
tasks/service_prometheus_nodeExporter.yml
Normal file
93
tasks/service_prometheus_nodeExporter.yml
Normal file
@@ -0,0 +1,93 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Downloads, installs, and configures Prometheus Node Exporter.
|
||||
#
|
||||
# NOTE: This is depreciated, I no longer use Prometheus and have migrated to Telegraf
|
||||
|
||||
- name: populate service facts
|
||||
service_facts:
|
||||
|
||||
- name: stop node_exporter
|
||||
become: true
|
||||
ansible.builtin.systemd:
|
||||
name: node_exporter
|
||||
state: stopped
|
||||
when: ansible_facts.services["node_exporter.service"] is defined
|
||||
|
||||
- name: Ensure group "prometheus" exists
|
||||
become: true
|
||||
ansible.builtin.group:
|
||||
name: prometheus
|
||||
state: present
|
||||
|
||||
- name: Add the user 'prometheus' with group 'prometheus'
|
||||
become: true
|
||||
ansible.builtin.user:
|
||||
name: prometheus
|
||||
group: prometheus
|
||||
groups: docker
|
||||
append: true
|
||||
|
||||
# --------------- Install or Update Prometheus
|
||||
- name: "set fact: need to install Prometheus?"
|
||||
set_fact:
|
||||
need_prometheus_install: false
|
||||
|
||||
- name: Check if node_exporter is installed
|
||||
ansible.builtin.stat:
|
||||
path: /usr/local/bin/node_exporter
|
||||
register: prometheus_binary_file_location
|
||||
|
||||
- name: "set fact: need to install Prometheus?"
|
||||
set_fact:
|
||||
need_prometheus_install: true
|
||||
when:
|
||||
- not prometheus_binary_file_location.stat.exists
|
||||
|
||||
- name: Check current version of Prometheus
|
||||
ansible.builtin.shell: /usr/local/bin/node_exporter --version 3>&1 1>&2 2>&3 | head -n1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+'
|
||||
ignore_errors: true
|
||||
register: current_prometheus_version
|
||||
check_mode: false
|
||||
when:
|
||||
- need_prometheus_install is false
|
||||
|
||||
- name: "set fact: need to install Prometheus?"
|
||||
set_fact:
|
||||
need_prometheus_install: true
|
||||
when:
|
||||
- need_prometheus_install is false
|
||||
- current_prometheus_version.stdout != prometheus_verssion
|
||||
|
||||
- name: install node_exporter
|
||||
become: true
|
||||
ansible.builtin.unarchive:
|
||||
src: "https://github.com/prometheus/node_exporter/releases/download/v{{ prometheus_verssion }}/node_exporter-{{ prometheus_verssion }}.linux-armv7.tar.gz"
|
||||
dest: /usr/local/bin
|
||||
group: prometheus
|
||||
owner: prometheus
|
||||
# reference for extra_opts: https://github.com/ansible/ansible/issues/27081
|
||||
extra_opts:
|
||||
- --strip=1
|
||||
- --no-anchored
|
||||
- "node_exporter"
|
||||
remote_src: true
|
||||
when:
|
||||
- need_prometheus_install is true
|
||||
|
||||
- name: create node_exporter service
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: node_exporter.service.j2
|
||||
dest: /etc/systemd/system/node_exporter.service
|
||||
mode: 0644
|
||||
|
||||
- name: start node_exporter
|
||||
become: true
|
||||
ansible.builtin.systemd:
|
||||
name: node_exporter
|
||||
daemon_reload: true
|
||||
enabled: true
|
||||
state: started
|
||||
when:
|
||||
- "'nostart' not in ansible_run_tags"
|
||||
189
tasks/tdarr.yml
Normal file
189
tasks/tdarr.yml
Normal file
@@ -0,0 +1,189 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Downloads, installs, and configures Tdarr/
|
||||
|
||||
- name: "Set variables"
|
||||
block:
|
||||
- name: "Set tdarr local filesystem location (pis)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_tdarr_dir: "{{ rpi1_tdarr_file_location }}"
|
||||
changed_when: false
|
||||
when:
|
||||
- "'pis' in group_names"
|
||||
|
||||
- name: "Set tdarr local filesystem location (macs)"
|
||||
ansible.builtin.set_fact:
|
||||
interpolated_tdarr_dir: "{{ mac_tdarr_file_location }}"
|
||||
changed_when: false
|
||||
when:
|
||||
- "'macs' in group_names"
|
||||
|
||||
- name: "set variable: Set tdarr download Binary (armv7l)"
|
||||
ansible.builtin.set_fact:
|
||||
tdarr_download_uri: "https://f000.backblazeb2.com/file/tdarrs/versions/{{ tdarr_installer_version }}/linux_arm/Tdarr_Updater.zip"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- ansible_architecture == 'armv7l'
|
||||
|
||||
- name: "set variable: Set tdarr download Binary (MacOSX) - Intel"
|
||||
ansible.builtin.set_fact:
|
||||
tdarr_download_uri: "https://f000.backblazeb2.com/file/tdarrs/versions/{{ tdarr_installer_version }}/darwin_x64/Tdarr_Updater.zip"
|
||||
when:
|
||||
- mac_intel
|
||||
|
||||
- name: "set variable: Set tdarr download Binary (MacOSX) - ARM"
|
||||
ansible.builtin.set_fact:
|
||||
tdarr_download_uri: "https://f000.backblazeb2.com/file/tdarrs/versions/{{ tdarr_installer_version }}/darwin_arm64/Tdarr_Updater.zip"
|
||||
when:
|
||||
- mac_arm
|
||||
|
||||
- name: "set fact: do we need a tdarr install?"
|
||||
set_fact:
|
||||
need_tdarr_install: false
|
||||
|
||||
- name: Assert that we can install Tdarr
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- tdarr_download_uri is defined
|
||||
- interpolated_tdarr_dir is defined
|
||||
fail_msg: "Unable to install Tdarr on this host"
|
||||
|
||||
- name: "Install ffmpeg and HandbrakeCLI"
|
||||
block:
|
||||
- name: "ensure ffmpeg and handbrake are installed (Debian)"
|
||||
become: true
|
||||
ansible.builtin.apt:
|
||||
pkg: "{{ item }}"
|
||||
state: present
|
||||
loop:
|
||||
- ffmpeg
|
||||
- handbrake
|
||||
when: "'pis' in group_names"
|
||||
|
||||
- name: "ensure ffmpeg and handbrake are installed (MacOS)"
|
||||
community.general.homebrew:
|
||||
name: "{{ item }}"
|
||||
state: present
|
||||
update_homebrew: false
|
||||
upgrade_all: false
|
||||
loop:
|
||||
- ffmpeg
|
||||
- handbrake
|
||||
when: "'macs' in group_names"
|
||||
|
||||
- name: "ensure tdarr directory exists"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ interpolated_tdarr_dir }}"
|
||||
mode: 0755
|
||||
owner: "{{ ansible_user_uid }}"
|
||||
group: "{{ ansible_user_gid }}"
|
||||
state: directory
|
||||
|
||||
- name: "Install tdarr"
|
||||
block:
|
||||
- name: "set_fact: need Tdarr install?"
|
||||
ansible.builtin.stat:
|
||||
path: "{{ interpolated_tdarr_dir }}/configs"
|
||||
register: tdarr_exists
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
|
||||
- name: "set fact: do we need a tdarr install?"
|
||||
set_fact:
|
||||
need_tdarr_install: true
|
||||
when: not tdarr_exists.stat.exists
|
||||
|
||||
- name: Download tdarr
|
||||
ansible.builtin.unarchive:
|
||||
src: "{{ tdarr_download_uri }}"
|
||||
dest: "{{ interpolated_tdarr_dir }}"
|
||||
remote_src: true
|
||||
when: need_tdarr_install
|
||||
|
||||
- name: Did tdarr download?
|
||||
ansible.builtin.stat:
|
||||
path: "{{ interpolated_tdarr_dir }}/Tdarr_Updater"
|
||||
register: tdarr_installer_exists
|
||||
failed_when: not tdarr_installer_exists.stat.exists
|
||||
when: need_tdarr_install
|
||||
|
||||
- name: Ensure correct permissions on Tdarr_Updater
|
||||
ansible.builtin.file:
|
||||
path: "{{ interpolated_tdarr_dir }}/Tdarr_Updater"
|
||||
mode: 0755
|
||||
when: need_tdarr_install
|
||||
|
||||
- name: Install tdarr
|
||||
ansible.builtin.command:
|
||||
cmd: "{{ interpolated_tdarr_dir }}/Tdarr_Updater"
|
||||
register: tdarr_install
|
||||
failed_when: tdarr_install.rc > 0
|
||||
when: need_tdarr_install
|
||||
|
||||
- name: Ensure correct permissions on server/node executables
|
||||
ansible.builtin.file:
|
||||
path: "{{ interpolated_tdarr_dir }}/{{ item }}"
|
||||
mode: 0755
|
||||
loop:
|
||||
- Tdarr_Server/Tdarr_Server
|
||||
- Tdarr_Node/Tdarr_Node
|
||||
when: need_tdarr_install
|
||||
|
||||
- name: "configure tdarr"
|
||||
block:
|
||||
- name: update server configuration file
|
||||
ansible.builtin.template:
|
||||
src: Tdarr_Server_Config.json.j2
|
||||
dest: "{{ interpolated_tdarr_dir }}/configs/Tdarr_Server_Config.json"
|
||||
mode: 0644
|
||||
when: is_tdarr_server
|
||||
|
||||
- name: update node configuration file
|
||||
ansible.builtin.template:
|
||||
src: Tdarr_Node_Config.json.j2
|
||||
dest: "{{ interpolated_tdarr_dir }}/configs/Tdarr_Node_Config.json"
|
||||
mode: 0644
|
||||
when: is_tdarr_node
|
||||
|
||||
- name: check if consul is installed?
|
||||
ansible.builtin.stat:
|
||||
path: "{{ interpolated_consul_configuration_dir }}"
|
||||
register: consul_installed
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
when:
|
||||
- is_tdarr_server
|
||||
|
||||
- name: move consul service config into place
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: consul_services/tdarr_service.json.j2
|
||||
dest: "{{ interpolated_consul_configuration_dir }}/tdarr_service.json"
|
||||
mode: 0644
|
||||
when:
|
||||
- is_tdarr_server
|
||||
- consul_installed.stat.exists
|
||||
|
||||
- name: Reload consul agent
|
||||
ansible.builtin.uri:
|
||||
url: "http://{{ ansible_host }}:8500/v1/agent/reload"
|
||||
method: PUT
|
||||
status_code: 200
|
||||
ignore_errors: true
|
||||
register: consul_agent_reload_http_response
|
||||
failed_when: consul_agent_reload_http_response.status != 200
|
||||
when:
|
||||
- is_tdarr_server
|
||||
- consul_installed.stat.exists
|
||||
|
||||
- name: debug when consul agent reload fails
|
||||
ansible.builtin.debug:
|
||||
var: consul_agent_reload_http_response.msg
|
||||
when:
|
||||
- is_tdarr_server
|
||||
- consul_installed.stat.exists
|
||||
- consul_agent_reload_http_response.status != 200
|
||||
|
||||
- name: mount shared storage
|
||||
import_tasks: cluster_storage.yml
|
||||
192
tasks/telegraf.yml
Normal file
192
tasks/telegraf.yml
Normal file
@@ -0,0 +1,192 @@
|
||||
---
|
||||
# TASK DESCRIPTION:
|
||||
# Downloads, installs, and configures Telegraf
|
||||
|
||||
# --------------------------------- Set variables depending on system type
|
||||
- name: "Configure variables"
|
||||
block:
|
||||
- name: "set variable: telegraph_binary_location (Debian)"
|
||||
ansible.builtin.set_fact:
|
||||
telegraph_binary_location: "/usr/bin/telegraf"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: "set variable: telegraph_binary_location (MacOS)"
|
||||
ansible.builtin.set_fact:
|
||||
telegraph_binary_location: "/usr/local/bin/telegraf"
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
|
||||
- name: "set fact: telegraph_config_location (Debian)"
|
||||
ansible.builtin.set_fact:
|
||||
telegraph_config_location: "/etc/telegraf"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
|
||||
- name: "set fact: telegraph_config_location (macOS)"
|
||||
ansible.builtin.set_fact:
|
||||
telegraph_config_location: "/usr/local/etc"
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
|
||||
- name: "set fact: telegraph_config_location (macOS)"
|
||||
ansible.builtin.set_fact:
|
||||
telegraph_config_location: "/volume1/docker/telegraf/config"
|
||||
when:
|
||||
- inventory_hostname == 'synology'
|
||||
|
||||
- name: "Fail if arm Mac (need to update task) or variables not defined"
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- telegraph_binary_location is defined
|
||||
- telegraph_config_location is defined
|
||||
- not mac_arm
|
||||
fail_msg: "Unable to install Telegraf on this host"
|
||||
|
||||
- name: "Install/upgrade Telegraf"
|
||||
block:
|
||||
- name: "set fact: Need telegraf install?"
|
||||
ansible.builtin.set_fact:
|
||||
need_telegraf_install: false
|
||||
when: telegraph_binary_location is defined
|
||||
|
||||
- name: Check if telegraf is installed
|
||||
ansible.builtin.stat:
|
||||
path: "{{ telegraph_binary_location }}"
|
||||
check_mode: false
|
||||
register: telegraf_binary_exists
|
||||
when: telegraph_binary_location is defined
|
||||
|
||||
- name: "set fact: Need telegraf install?"
|
||||
ansible.builtin.set_fact:
|
||||
need_telegraf_install: true
|
||||
check_mode: false
|
||||
when:
|
||||
- telegraph_binary_location is defined
|
||||
- not telegraf_binary_exists.stat.exists
|
||||
|
||||
- name: Check current version of telegraf
|
||||
ansible.builtin.shell: "{{ telegraph_binary_location }} --version | grep -oE '[0-9]+\\.[0-9]+\\.[0-9]+'"
|
||||
ignore_errors: true
|
||||
register: current_telegraf_version
|
||||
check_mode: false
|
||||
changed_when: current_telegraf_version.stdout != telegraf_version
|
||||
when:
|
||||
- telegraph_binary_location is defined
|
||||
- not need_telegraf_install
|
||||
|
||||
- name: "set fact: Need telegraf install?"
|
||||
ansible.builtin.set_fact:
|
||||
need_telegraf_install: true
|
||||
when:
|
||||
- telegraph_binary_location is defined
|
||||
- not need_telegraf_install
|
||||
- current_telegraf_version.stdout != telegraf_version
|
||||
|
||||
- name: install telegraf (MacOS)
|
||||
community.general.homebrew:
|
||||
name: telegraf
|
||||
state: present
|
||||
notify: restart_telegraf
|
||||
when:
|
||||
- ansible_os_family == 'Darwin'
|
||||
- need_telegraf_install
|
||||
|
||||
- name: install base apt-transport (Debian)
|
||||
become: true
|
||||
ansible.builtin.apt:
|
||||
pkg: apt-transport-https
|
||||
state: present
|
||||
update_cache: true
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- need_telegraf_install
|
||||
|
||||
- name: Download telegraf GPG key (Debian)
|
||||
become: true
|
||||
ansible.builtin.apt_key:
|
||||
state: present
|
||||
url: "https://repos.influxdata.com/influxdb.key"
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- need_telegraf_install
|
||||
|
||||
- name: Add telegraf repository to apt (Debian)
|
||||
become: true
|
||||
ansible.builtin.apt_repository:
|
||||
repo: deb https://repos.influxdata.com/debian buster stable
|
||||
state: present
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- need_telegraf_install
|
||||
|
||||
- name: install telegraf (Debian)
|
||||
become: true
|
||||
ansible.builtin.apt:
|
||||
pkg: telegraf
|
||||
update_cache: true
|
||||
notify: restart_telegraf
|
||||
when:
|
||||
- ansible_os_family == 'Debian'
|
||||
- need_telegraf_install
|
||||
|
||||
# - name: give telegraf access to docker
|
||||
# become: true
|
||||
# ansible.builtin.user:
|
||||
# name: telegraf
|
||||
# groups: docker
|
||||
# append: true
|
||||
# state: present
|
||||
# create_home: false
|
||||
# when:
|
||||
# - ansible_os_family == 'Debian'
|
||||
# - need_telegraf_install
|
||||
|
||||
# -------------------------------------------------- Add Telegraf Configs
|
||||
- name: "Configure Telegraf"
|
||||
block:
|
||||
- name: "Ensure {{ telegraph_config_location }} exists"
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ item }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
loop:
|
||||
- "{{ telegraph_config_location }}"
|
||||
- "{{ telegraph_config_location }}/telegraf.d"
|
||||
|
||||
- name: template config files to server
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: "{{ item.src }}"
|
||||
dest: "{{ item.dest }}"
|
||||
mode: "644"
|
||||
loop:
|
||||
- { src: "telegraf/base_config.conf.j2", dest: "{{ telegraph_config_location }}/telegraf.conf" }
|
||||
- { src: "telegraf/temperature.conf.j2", dest: "{{ telegraph_config_location }}/telegraf.d/temperature.conf" }
|
||||
- { src: "telegraf/nomad.conf.j2", dest: "{{ telegraph_config_location }}/telegraf.d/nomad.conf" }
|
||||
- { src: "telegraf/docker.conf.j2", dest: "{{ telegraph_config_location }}/telegraf.d/docker.conf" }
|
||||
notify: restart_telegraf
|
||||
|
||||
- name: template leader configs (ie, configs that should be placed on a single server)
|
||||
become: true
|
||||
ansible.builtin.template:
|
||||
src: "{{ item.src }}"
|
||||
dest: "{{ item.dest }}"
|
||||
mode: "644"
|
||||
loop:
|
||||
- { src: "telegraf/leader.conf.j2", dest: "{{ telegraph_config_location }}/telegraf.d/leader.conf" }
|
||||
- { src: "telegraf/pingHosts.conf.j2", dest: "{{ telegraph_config_location }}/telegraf.d/pingHosts.conf" }
|
||||
when:
|
||||
- is_cluster_leader
|
||||
notify: restart_telegraf
|
||||
|
||||
- name: Reset file ownership (macOS)
|
||||
become: true
|
||||
ansible.builtin.file:
|
||||
path: "{{ telegraph_config_location }}"
|
||||
owner: "{{ ansible_user_uid }}"
|
||||
group: "{{ ansible_user_gid }}"
|
||||
recurse: true
|
||||
when:
|
||||
- (ansible_os_family == 'Darwin') or (inventory_hostname == 'synology')
|
||||
Reference in New Issue
Block a user