Merge branch 'ansiblelint' into 'main'
Ansiblelint See merge request developerdurp/k3s!17
This commit is contained in:
@@ -6,7 +6,7 @@ stages:
|
|||||||
|
|
||||||
include:
|
include:
|
||||||
- project: 'developerdurp/jobtemplates'
|
- project: 'developerdurp/jobtemplates'
|
||||||
ref: release/1.0.0
|
ref: main
|
||||||
file:
|
file:
|
||||||
- 'terraform.yml'
|
- 'terraform.yml'
|
||||||
- 'ansible.yml'
|
- 'ansible.yml'
|
||||||
@@ -32,6 +32,19 @@ validate:
|
|||||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||||
when: always
|
when: always
|
||||||
- when: never
|
- when: never
|
||||||
|
|
||||||
|
ansible:
|
||||||
|
stage: lint
|
||||||
|
variables:
|
||||||
|
WORKDIR: $CI_PROJECT_DIR/ansible
|
||||||
|
REQUIREMENTS: requirements.yml
|
||||||
|
FILE: main.yml
|
||||||
|
allow_failure: false
|
||||||
|
extends: .ansible_lint
|
||||||
|
rules:
|
||||||
|
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||||
|
when: always
|
||||||
|
- when: never
|
||||||
|
|
||||||
plan:
|
plan:
|
||||||
stage: lint
|
stage: lint
|
||||||
@@ -156,3 +169,4 @@ k3s-destroy:
|
|||||||
- 'ansible/*'
|
- 'ansible/*'
|
||||||
when: always
|
when: always
|
||||||
- when: never
|
- when: never
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
roles:
|
roles:
|
||||||
- cloudflare
|
- cloudflare
|
||||||
vars:
|
vars:
|
||||||
DNS:
|
dns:
|
||||||
- {record: 'bitwarden', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: 'bitwarden', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
- {record: 'nextcloud', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: 'nextcloud', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
- {record: 'grafana', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: 'grafana', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
- {record: 'kong', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: 'kong', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
- {record: '@', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: '@', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
@@ -16,5 +16,4 @@
|
|||||||
- {record: 'docker', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: 'docker', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
- {record: 'authentik', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: 'authentik', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
- {record: 'plex', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: 'plex', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
- {record: 'vault', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
- {record: 'vault', zone: 'durp.info', proxied: 'yes', state: 'present'}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ flannel_iface: "eth0"
|
|||||||
apiserver_endpoint: "192.168.20.120"
|
apiserver_endpoint: "192.168.20.120"
|
||||||
|
|
||||||
# k3s_token is required masters can talk together securely
|
# k3s_token is required masters can talk together securely
|
||||||
k3s_token: "{{ lookup('env','k3s_token') }}"
|
k3s_token: "{{ lookup('env', 'k3s_token') }}"
|
||||||
|
|
||||||
# The IP on which the node is reachable in the cluster.
|
# The IP on which the node is reachable in the cluster.
|
||||||
# Here, a sensible default is provided, you can still override
|
# Here, a sensible default is provided, you can still override
|
||||||
@@ -42,7 +42,7 @@ extra_server_args: >-
|
|||||||
--kubelet-arg containerd=/run/k3s/containerd/containerd.sock
|
--kubelet-arg containerd=/run/k3s/containerd/containerd.sock
|
||||||
--feature-gates RemoveSelfLink=false
|
--feature-gates RemoveSelfLink=false
|
||||||
extra_agent_args: >-
|
extra_agent_args: >-
|
||||||
{{ extra_args }}
|
{{ extra_args }}
|
||||||
--kubelet-arg node-status-update-frequency=5s
|
--kubelet-arg node-status-update-frequency=5s
|
||||||
|
|
||||||
# image tag for kube-vip
|
# image tag for kube-vip
|
||||||
|
|||||||
@@ -1,33 +1,32 @@
|
|||||||
- hosts: all
|
- hosts: all
|
||||||
gather_facts: yes
|
gather_facts: true
|
||||||
become: yes
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- base
|
- base
|
||||||
|
|
||||||
- hosts: k3s_cluster
|
- hosts: k3s_cluster
|
||||||
gather_facts: yes
|
gather_facts: true
|
||||||
become: yes
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- k3s/prereq
|
- k3s/prereq
|
||||||
- k3s/download
|
- k3s/download
|
||||||
|
|
||||||
- hosts: master
|
- hosts: master
|
||||||
become: yes
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- k3s/master
|
- k3s/master
|
||||||
|
|
||||||
- hosts: node
|
- hosts: node
|
||||||
become: yes
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- k3s/node
|
- k3s/node
|
||||||
|
|
||||||
- hosts: master
|
- hosts: master
|
||||||
become: yes
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- role: k3s/post
|
- role: k3s/post
|
||||||
|
|
||||||
- hosts: master[0]
|
- hosts: master[0]
|
||||||
become: yes
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- k3s/argocd
|
- k3s/argocd
|
||||||
|
|
||||||
|
|||||||
@@ -1,58 +1,57 @@
|
|||||||
---
|
|
||||||
- name: Run Package tasks
|
- name: Run Package tasks
|
||||||
include_tasks:
|
ansible.builtin.include_tasks:
|
||||||
file: ./templates/packages.yml
|
file: ./templates/packages.yml
|
||||||
|
|
||||||
- name: Create user account
|
- name: Create user account
|
||||||
user:
|
ansible.builtin.user:
|
||||||
name: "{{ username }}"
|
name: "{{ username }}"
|
||||||
password: "{{ userpassword }}"
|
password: "{{ userpassword }}"
|
||||||
groups: sudo
|
groups: sudo
|
||||||
shell: /bin/bash
|
shell: /bin/bash
|
||||||
state: present
|
state: present
|
||||||
createhome: yes
|
createhome: true
|
||||||
when: ansible_os_family == "Debian"
|
when: ansible_os_family == "Debian"
|
||||||
|
|
||||||
- name: Create user account
|
- name: Create user account
|
||||||
user:
|
ansible.builtin.user:
|
||||||
name: "{{ username }}"
|
name: "{{ username }}"
|
||||||
password: "{{ userpassword }}"
|
password: "{{ userpassword }}"
|
||||||
shell: /bin/bash
|
shell: /bin/bash
|
||||||
groups: wheel
|
groups: wheel
|
||||||
state: present
|
state: present
|
||||||
createhome: yes
|
createhome: true
|
||||||
when: ansible_os_family == "RedHat"
|
when: ansible_os_family == "RedHat"
|
||||||
|
|
||||||
- name: Run SSH tasks
|
- name: Run SSH tasks
|
||||||
include_tasks:
|
ansible.builtin.include_tasks:
|
||||||
file: ssh.yml
|
file: ssh.yml
|
||||||
|
|
||||||
- name: Copy unattended-upgrades file
|
- name: Copy unattended-upgrades file
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
src: files/10periodic
|
src: files/10periodic
|
||||||
dest: /etc/apt/apt.conf.d/10periodic
|
dest: /etc/apt/apt.conf.d/10periodic
|
||||||
owner: root
|
owner: root
|
||||||
group: root
|
group: root
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
force: yes
|
force: true
|
||||||
when: ansible_os_family == "Debian"
|
when: ansible_os_family == "Debian"
|
||||||
|
|
||||||
- name: Remove undesirable packages
|
- name: Remove undesirable packages
|
||||||
package:
|
ansible.builtin.package:
|
||||||
name: "{{ unnecessary_software }}"
|
name: "{{ unnecessary_software }}"
|
||||||
state: absent
|
state: absent
|
||||||
when: ansible_os_family == "Debian"
|
when: ansible_os_family == "Debian"
|
||||||
|
|
||||||
- name: Stop and disable unnecessary services
|
- name: Stop and disable unnecessary services
|
||||||
service:
|
ansible.builtin.service:
|
||||||
name: "{{ item }}"
|
name: "{{ item }}"
|
||||||
state: stopped
|
state: stopped
|
||||||
enabled: no
|
enabled: false
|
||||||
with_items: "{{ unnecessary_services }}"
|
with_items: "{{ unnecessary_services }}"
|
||||||
ignore_errors: yes
|
ignore_errors: "{{ ansible_check_mode }}"
|
||||||
|
|
||||||
- name: Set a message of the day
|
- name: Set a message of the day
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
dest: /etc/motd
|
dest: /etc/motd
|
||||||
src: files/motd
|
src: files/motd
|
||||||
owner: root
|
owner: root
|
||||||
@@ -60,7 +59,7 @@
|
|||||||
mode: 0644
|
mode: 0644
|
||||||
|
|
||||||
- name: Set a login banner
|
- name: Set a login banner
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
dest: "{{ item }}"
|
dest: "{{ item }}"
|
||||||
src: files/issue
|
src: files/issue
|
||||||
owner: root
|
owner: root
|
||||||
@@ -70,13 +69,14 @@
|
|||||||
- /etc/issue
|
- /etc/issue
|
||||||
- /etc/issue.net
|
- /etc/issue.net
|
||||||
|
|
||||||
- name: set timezone
|
- name: Set timezone
|
||||||
shell: timedatectl set-timezone America/Chicago
|
ansible.builtin.command: timedatectl set-timezone America/Chicago
|
||||||
|
changed_when: my_output.rc != 0
|
||||||
|
|
||||||
- name: Enable cockpit
|
- name: Enable cockpit
|
||||||
systemd:
|
ansible.builtin.systemd:
|
||||||
name: cockpit
|
name: cockpit
|
||||||
daemon_reload: yes
|
daemon_reload: true
|
||||||
state: restarted
|
state: restarted
|
||||||
enabled: yes
|
enabled: true
|
||||||
when: ansible_os_family == "RedHat"
|
when: ansible_os_family == "RedHat"
|
||||||
|
|||||||
@@ -1,47 +1,50 @@
|
|||||||
- name: Deploy SSH Key (administrator)
|
- name: Deploy SSH Key (administrator)
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
dest: /home/administrator/.ssh/authorized_keys
|
dest: /home/administrator/.ssh/authorized_keys
|
||||||
src: files/authorized_keys_administrator
|
src: files/authorized_keys_administrator
|
||||||
force: true
|
mode: "0600"
|
||||||
|
force: true
|
||||||
|
|
||||||
- name: ensure ssh folder exists for user
|
- name: Ensure ssh folder exists for user
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: /home/user/.ssh
|
path: /home/user/.ssh
|
||||||
|
mode: "0600"
|
||||||
state: directory
|
state: directory
|
||||||
|
|
||||||
- name: Deploy SSH Key (user)
|
- name: Deploy SSH Key (user)
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
dest: /home/user/.ssh/authorized_keys
|
dest: /home/user/.ssh/authorized_keys
|
||||||
src: files/authorized_keys_user
|
src: files/authorized_keys_user
|
||||||
force: true
|
mode: "0600"
|
||||||
|
force: true
|
||||||
|
|
||||||
- name: Remove Root SSH Configuration
|
- name: Remove Root SSH Configuration
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: /root/.ssh
|
path: /root/.ssh
|
||||||
state: absent
|
state: absent
|
||||||
|
|
||||||
- name: Copy Secured SSHD Configuration
|
- name: Copy Secured SSHD Configuration
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
src: files/sshd_config_secured
|
src: files/sshd_config_secured
|
||||||
dest: /etc/ssh/sshd_config
|
dest: /etc/ssh/sshd_config
|
||||||
owner: root
|
owner: root
|
||||||
group: root
|
group: root
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
when: ansible_os_family == "Debian"
|
when: ansible_os_family == "Debian"
|
||||||
|
|
||||||
- name: Copy Secured SSHD Configuration
|
- name: Copy Secured SSHD Configuration
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
src: files/sshd_config_secured_redhat
|
src: files/sshd_config_secured_redhat
|
||||||
dest: /etc/ssh/sshd_config
|
dest: /etc/ssh/sshd_config
|
||||||
owner: root
|
owner: root
|
||||||
group: root
|
group: root
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
when: ansible_os_family == "RedHat"
|
when: ansible_os_family == "RedHat"
|
||||||
|
|
||||||
- name: Restart SSHD
|
- name: Restart SSHD
|
||||||
systemd:
|
ansible.builtin.systemd:
|
||||||
name: sshd
|
name: sshd
|
||||||
daemon_reload: yes
|
daemon_reload: true
|
||||||
state: restarted
|
state: restarted
|
||||||
enabled: yes
|
enabled: true
|
||||||
ignore_errors: yes
|
ignore_errors: "{{ ansible_check_mode }}"
|
||||||
|
|||||||
@@ -10,16 +10,14 @@ required_packages:
|
|||||||
|
|
||||||
redhat_required_packages:
|
redhat_required_packages:
|
||||||
- qemu-guest-agent
|
- qemu-guest-agent
|
||||||
- cockpit
|
- cockpit
|
||||||
- iscsi-initiator-utils
|
- iscsi-initiator-utils
|
||||||
|
|
||||||
unnecessary_services:
|
unnecessary_services:
|
||||||
- postfix
|
- postfix
|
||||||
- telnet
|
- telnet
|
||||||
|
|
||||||
unnecessary_software:
|
unnecessary_software:
|
||||||
- tcpdump
|
- tcpdump
|
||||||
- nmap-ncat
|
- nmap-ncat
|
||||||
- wpa_supplicant
|
- wpa_supplicant
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,6 @@
|
|||||||
state: "{{ item.state }}"
|
state: "{{ item.state }}"
|
||||||
type: A
|
type: A
|
||||||
proxied: "{{ item.proxied }}"
|
proxied: "{{ item.proxied }}"
|
||||||
value: "{{ lookup('env','external_ip') }}"
|
value: "{{ lookup('env', 'external_ip') }}"
|
||||||
api_token: "{{ lookup('env','cloudflareapi') }}"
|
api_token: "{{ lookup('env', 'external_ip') }}"
|
||||||
with_items: "{{ DNS }}"
|
with_items: "{{ dns }}"
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
---
|
- name: Copy configs
|
||||||
- name: copy configs
|
ansible.builtin.copy:
|
||||||
copy:
|
|
||||||
src: ./roles/k3s/argocd/templates/
|
src: ./roles/k3s/argocd/templates/
|
||||||
dest: /opt/argocd
|
dest: /opt/argocd
|
||||||
owner: administrator
|
owner: administrator
|
||||||
group: administrator
|
group: administrator
|
||||||
mode: "0664"
|
mode: "0664"
|
||||||
force: yes
|
force: true
|
||||||
|
|
||||||
- name: copy configs
|
- name: Copy configs
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
src: "{{ lookup('env','kubeseal') }}"
|
src: "{{ lookup('env', 'kubeseal') }}"
|
||||||
dest: /opt/kubeseal.yaml
|
dest: /opt/kubeseal.yaml
|
||||||
owner: administrator
|
owner: administrator
|
||||||
group: administrator
|
group: administrator
|
||||||
mode: "0600"
|
mode: "0600"
|
||||||
force: yes
|
force: true
|
||||||
|
|
||||||
- name: Apply Kubeseal master key
|
- name: Apply Kubeseal master key
|
||||||
command: k3s kubectl apply -f /opt/kubeseal.yaml --force
|
ansible.builtin.command: k3s kubectl apply -f /opt/kubeseal.yaml --force
|
||||||
|
changed_when: my_output.rc != 0
|
||||||
|
|
||||||
- name: Apply ArgoCD
|
- name: Apply ArgoCD
|
||||||
command: k3s kubectl apply -f /opt/argocd/argocd.yaml -n argocd
|
ansible.builtin.command: k3s kubectl apply -f /opt/argocd/argocd.yaml -n argocd
|
||||||
|
changed_when: my_output.rc != 0
|
||||||
|
|
||||||
- name: Apply ArgoCD Apps
|
- name: Apply ArgoCD Apps
|
||||||
command: k3s kubectl apply -f /opt/argocd/apps.yaml -n argocd
|
ansible.builtin.command: k3s kubectl apply -f /opt/argocd/apps.yaml -n argocd
|
||||||
|
changed_when: my_output.rc != 0
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
- name: Download k3s binary x64
|
- name: Download k3s binary x64
|
||||||
get_url:
|
ansible.builtin.get_url:
|
||||||
url: https://github.com/k3s-io/k3s/releases/download/{{ k3s_version }}/k3s
|
url: https://github.com/k3s-io/k3s/releases/download/{{ k3s_version }}/k3s
|
||||||
checksum: sha256:https://github.com/k3s-io/k3s/releases/download/{{ k3s_version }}/sha256sum-amd64.txt
|
checksum: sha256:https://github.com/k3s-io/k3s/releases/download/{{ k3s_version }}/sha256sum-amd64.txt
|
||||||
dest: /usr/local/bin/k3s
|
dest: /usr/local/bin/k3s
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
---
|
|
||||||
- name: Create manifests directory on first master
|
- name: Create manifests directory on first master
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: /var/lib/rancher/k3s/server/manifests
|
path: /var/lib/rancher/k3s/server/manifests
|
||||||
state: directory
|
state: directory
|
||||||
owner: root
|
owner: root
|
||||||
@@ -9,7 +8,7 @@
|
|||||||
when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname']
|
when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname']
|
||||||
|
|
||||||
- name: Copy vip rbac manifest to first master
|
- name: Copy vip rbac manifest to first master
|
||||||
template:
|
ansible.builtin.template:
|
||||||
src: "vip.rbac.yaml.j2"
|
src: "vip.rbac.yaml.j2"
|
||||||
dest: "/var/lib/rancher/k3s/server/manifests/vip-rbac.yaml"
|
dest: "/var/lib/rancher/k3s/server/manifests/vip-rbac.yaml"
|
||||||
owner: root
|
owner: root
|
||||||
@@ -18,7 +17,7 @@
|
|||||||
when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname']
|
when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname']
|
||||||
|
|
||||||
- name: Copy vip manifest to first master
|
- name: Copy vip manifest to first master
|
||||||
template:
|
ansible.builtin.template:
|
||||||
src: "vip.yaml.j2"
|
src: "vip.yaml.j2"
|
||||||
dest: "/var/lib/rancher/k3s/server/manifests/vip.yaml"
|
dest: "/var/lib/rancher/k3s/server/manifests/vip.yaml"
|
||||||
owner: root
|
owner: root
|
||||||
@@ -28,7 +27,7 @@
|
|||||||
|
|
||||||
# these will be copied and installed now, then tested later and apply config
|
# these will be copied and installed now, then tested later and apply config
|
||||||
- name: Copy metallb namespace to first master
|
- name: Copy metallb namespace to first master
|
||||||
template:
|
ansible.builtin.template:
|
||||||
src: "metallb.namespace.j2"
|
src: "metallb.namespace.j2"
|
||||||
dest: "/var/lib/rancher/k3s/server/manifests/metallb-namespace.yaml"
|
dest: "/var/lib/rancher/k3s/server/manifests/metallb-namespace.yaml"
|
||||||
owner: root
|
owner: root
|
||||||
@@ -37,7 +36,7 @@
|
|||||||
when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname']
|
when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname']
|
||||||
|
|
||||||
- name: Copy metallb namespace to first master
|
- name: Copy metallb namespace to first master
|
||||||
template:
|
ansible.builtin.template:
|
||||||
src: "metallb.crds.j2"
|
src: "metallb.crds.j2"
|
||||||
dest: "/var/lib/rancher/k3s/server/manifests/metallb-crds.yaml"
|
dest: "/var/lib/rancher/k3s/server/manifests/metallb-crds.yaml"
|
||||||
owner: root
|
owner: root
|
||||||
@@ -46,7 +45,7 @@
|
|||||||
when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname']
|
when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname']
|
||||||
|
|
||||||
- name: Init cluster inside the transient k3s-init service
|
- name: Init cluster inside the transient k3s-init service
|
||||||
command:
|
ansible.builtin.command:
|
||||||
cmd: "systemd-run -p RestartSec=2 \
|
cmd: "systemd-run -p RestartSec=2 \
|
||||||
-p Restart=on-failure \
|
-p Restart=on-failure \
|
||||||
--unit=k3s-init \
|
--unit=k3s-init \
|
||||||
@@ -56,9 +55,10 @@
|
|||||||
warn: false # The ansible systemd module does not support transient units
|
warn: false # The ansible systemd module does not support transient units
|
||||||
|
|
||||||
- name: Verification
|
- name: Verification
|
||||||
|
when: not ansible_check_mode
|
||||||
block:
|
block:
|
||||||
- name: Verify that all nodes actually joined (check k3s-init.service if this fails)
|
- name: Verify that all nodes actually joined (check k3s-init.service if this fails)
|
||||||
command:
|
ansible.builtin.command:
|
||||||
cmd: k3s kubectl get nodes -l "node-role.kubernetes.io/master=true" -o=jsonpath="{.items[*].metadata.name}"
|
cmd: k3s kubectl get nodes -l "node-role.kubernetes.io/master=true" -o=jsonpath="{.items[*].metadata.name}"
|
||||||
register: nodes
|
register: nodes
|
||||||
until: nodes.rc == 0 and (nodes.stdout.split() | length) == (groups['master'] | length)
|
until: nodes.rc == 0 and (nodes.stdout.split() | length) == (groups['master'] | length)
|
||||||
@@ -67,21 +67,20 @@
|
|||||||
changed_when: false
|
changed_when: false
|
||||||
always:
|
always:
|
||||||
- name: Save logs of k3s-init.service
|
- name: Save logs of k3s-init.service
|
||||||
include_tasks: fetch_k3s_init_logs.yml
|
ansible.builtin.include_tasks: fetch_k3s_init_logs.yml
|
||||||
when: log_destination
|
when: log_destination
|
||||||
vars:
|
vars:
|
||||||
log_destination: >-
|
log_destination: >-
|
||||||
{{ lookup('ansible.builtin.env', 'ANSIBLE_K3S_LOG_DIR', default=False) }}
|
{{ lookup('ansible.builtin.env', 'ANSIBLE_K3S_LOG_DIR', default=False) }}
|
||||||
- name: Kill the temporary service used for initialization
|
- name: Kill the temporary service used for initialization
|
||||||
systemd:
|
ansible.builtin.systemd:
|
||||||
name: k3s-init
|
name: k3s-init
|
||||||
state: stopped
|
state: stopped
|
||||||
failed_when: false
|
failed_when: false
|
||||||
when: not ansible_check_mode
|
|
||||||
|
|
||||||
- name: Copy K3s service file
|
- name: Copy K3s service file
|
||||||
register: k3s_service
|
register: k3s_service
|
||||||
template:
|
ansible.builtin.template:
|
||||||
src: "k3s.service.j2"
|
src: "k3s.service.j2"
|
||||||
dest: "{{ systemd_dir }}/k3s.service"
|
dest: "{{ systemd_dir }}/k3s.service"
|
||||||
owner: root
|
owner: root
|
||||||
@@ -89,55 +88,55 @@
|
|||||||
mode: 0644
|
mode: 0644
|
||||||
|
|
||||||
- name: Enable and check K3s service
|
- name: Enable and check K3s service
|
||||||
systemd:
|
ansible.builtin.systemd:
|
||||||
name: k3s
|
name: k3s
|
||||||
daemon_reload: yes
|
daemon_reload: true
|
||||||
state: restarted
|
state: restarted
|
||||||
enabled: yes
|
enabled: true
|
||||||
|
|
||||||
- name: Wait for node-token
|
- name: Wait for node-token
|
||||||
wait_for:
|
ansible.builtin.wait_for:
|
||||||
path: /var/lib/rancher/k3s/server/node-token
|
path: /var/lib/rancher/k3s/server/node-token
|
||||||
|
|
||||||
- name: Register node-token file access mode
|
- name: Register node-token file access mode
|
||||||
stat:
|
ansible.builtin.stat:
|
||||||
path: /var/lib/rancher/k3s/server
|
path: /var/lib/rancher/k3s/server
|
||||||
register: p
|
register: p
|
||||||
|
|
||||||
- name: Change file access node-token
|
- name: Change file access node-token
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: /var/lib/rancher/k3s/server
|
path: /var/lib/rancher/k3s/server
|
||||||
mode: "g+rx,o+rx"
|
mode: "g+rx,o+rx"
|
||||||
|
|
||||||
- name: Read node-token from master
|
- name: Read node-token from master
|
||||||
slurp:
|
ansible.builtin.slurp:
|
||||||
src: /var/lib/rancher/k3s/server/node-token
|
src: /var/lib/rancher/k3s/server/node-token
|
||||||
register: node_token
|
register: node_token
|
||||||
|
|
||||||
- name: Store Master node-token
|
- name: Store Master node-token
|
||||||
set_fact:
|
ansible.builtin.set_fact:
|
||||||
token: "{{ node_token.content | b64decode | regex_replace('\n', '') }}"
|
token: "{{ node_token.content | b64decode | regex_replace('\n', '') }}"
|
||||||
|
|
||||||
- name: Restore node-token file access
|
- name: Restore node-token file access
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: /var/lib/rancher/k3s/server
|
path: /var/lib/rancher/k3s/server
|
||||||
mode: "{{ p.stat.mode }}"
|
mode: "{{ p.stat.mode }}"
|
||||||
|
|
||||||
- name: Create directory .kube
|
- name: Create directory .kube
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: ~{{ item }}/.kube
|
path: ~{{ item }}/.kube
|
||||||
state: directory
|
state: directory
|
||||||
owner: "{{ item }}"
|
owner: "{{ item }}"
|
||||||
mode: "u=rwx,g=rx,o="
|
mode: "u=rwx,g=rx,o="
|
||||||
loop:
|
loop:
|
||||||
- "{{ ansible_user }}"
|
- "{{ ansible_user }}"
|
||||||
- "{{ username }}"
|
- "{{ username }}"
|
||||||
|
|
||||||
- name: Copy config file to user home directory
|
- name: Copy config file to user home directory
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
src: /etc/rancher/k3s/k3s.yaml
|
src: /etc/rancher/k3s/k3s.yaml
|
||||||
dest: ~{{ item }}/.kube/config
|
dest: ~{{ item }}/.kube/config
|
||||||
remote_src: yes
|
remote_src: true
|
||||||
owner: "{{ item }}"
|
owner: "{{ item }}"
|
||||||
mode: "u=rw,g=,o="
|
mode: "u=rw,g=,o="
|
||||||
loop:
|
loop:
|
||||||
@@ -145,48 +144,44 @@
|
|||||||
- "{{ username }}"
|
- "{{ username }}"
|
||||||
|
|
||||||
- name: Configure kubectl cluster to {{ endpoint_url }}
|
- name: Configure kubectl cluster to {{ endpoint_url }}
|
||||||
command: >-
|
ansible.builtin.command: >-
|
||||||
k3s kubectl config set-cluster default
|
k3s kubectl config set-cluster default
|
||||||
--server={{ endpoint_url }}
|
--server={{ endpoint_url }}
|
||||||
--kubeconfig ~{{ item }}/.kube/config
|
--kubeconfig ~{{ item }}/.kube/config
|
||||||
changed_when: true
|
changed_when: true
|
||||||
loop:
|
loop:
|
||||||
- "{{ ansible_user }}"
|
- "{{ ansible_user }}"
|
||||||
- "{{ username }}"
|
- "{{ username }}"
|
||||||
vars:
|
vars:
|
||||||
endpoint_url: >-
|
endpoint_url: >-
|
||||||
https://{{ apiserver_endpoint | ansible.utils.ipwrap }}:6443
|
https://{{ "apiserver_endpoint | ansible.utils.ipwrap" }}:6443
|
||||||
# Deactivated linter rules:
|
|
||||||
# - jinja[invalid]: As of version 6.6.0, ansible-lint complains that the input to ipwrap
|
|
||||||
# would be undefined. This will not be the case during playbook execution.
|
|
||||||
# noqa jinja[invalid]
|
|
||||||
|
|
||||||
- name: Create kubectl symlink
|
- name: Create kubectl symlink
|
||||||
file:
|
ansible.builtin.file:
|
||||||
src: /usr/local/bin/k3s
|
src: /usr/local/bin/k3s
|
||||||
dest: /usr/local/bin/kubectl
|
dest: /usr/local/bin/kubectl
|
||||||
state: link
|
state: link
|
||||||
|
|
||||||
- name: Create crictl symlink
|
- name: Create crictl symlink
|
||||||
file:
|
ansible.builtin.file:
|
||||||
src: /usr/local/bin/k3s
|
src: /usr/local/bin/k3s
|
||||||
dest: /usr/local/bin/crictl
|
dest: /usr/local/bin/crictl
|
||||||
state: link
|
state: link
|
||||||
|
|
||||||
- name: Get contents of manifests folder
|
- name: Get contents of manifests folder
|
||||||
find:
|
ansible.builtin.find:
|
||||||
paths: /var/lib/rancher/k3s/server/manifests
|
paths: /var/lib/rancher/k3s/server/manifests
|
||||||
file_type: file
|
file_type: file
|
||||||
register: k3s_server_manifests
|
register: k3s_server_manifests
|
||||||
|
|
||||||
- name: Get sub dirs of manifests folder
|
- name: Get sub dirs of manifests folder
|
||||||
find:
|
ansible.builtin.find:
|
||||||
paths: /var/lib/rancher/k3s/server/manifests
|
paths: /var/lib/rancher/k3s/server/manifests
|
||||||
file_type: directory
|
file_type: directory
|
||||||
register: k3s_server_manifests_directories
|
register: k3s_server_manifests_directories
|
||||||
|
|
||||||
- name: Remove manifests and folders that are only needed for bootstrapping cluster so k3s doesn't auto apply on start
|
- name: Remove manifests and folders that are only needed for bootstrapping cluster so k3s doesn't auto apply on start
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: "{{ item.path }}"
|
path: "{{ item.path }}"
|
||||||
state: absent
|
state: absent
|
||||||
with_items:
|
with_items:
|
||||||
@@ -194,4 +189,3 @@
|
|||||||
- "{{ k3s_server_manifests_directories.files }}"
|
- "{{ k3s_server_manifests_directories.files }}"
|
||||||
loop_control:
|
loop_control:
|
||||||
label: "{{ item.path }}"
|
label: "{{ item.path }}"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
---
|
|
||||||
|
|
||||||
- name: Copy K3s service file
|
- name: Copy K3s service file
|
||||||
template:
|
ansible.builtin.template:
|
||||||
src: "k3s.service.j2"
|
src: "k3s.service.j2"
|
||||||
dest: "{{ systemd_dir }}/k3s-node.service"
|
dest: "{{ systemd_dir }}/k3s-node.service"
|
||||||
owner: root
|
owner: root
|
||||||
@@ -9,8 +7,8 @@
|
|||||||
mode: 0755
|
mode: 0755
|
||||||
|
|
||||||
- name: Enable and check K3s service
|
- name: Enable and check K3s service
|
||||||
systemd:
|
ansible.builtin.systemd:
|
||||||
name: k3s-node
|
name: k3s-node
|
||||||
daemon_reload: yes
|
daemon_reload: true
|
||||||
state: restarted
|
state: restarted
|
||||||
enabled: yes
|
enabled: true
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
- name: Create manifests directory for temp configuration
|
- name: Create manifests directory for temp configuration
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: /tmp/k3s
|
path: /tmp/k3s
|
||||||
state: directory
|
state: directory
|
||||||
owner: "{{ ansible_user }}"
|
owner: "{{ ansible_user }}"
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
run_once: true
|
run_once: true
|
||||||
|
|
||||||
- name: Copy metallb CRs manifest to first master
|
- name: Copy metallb CRs manifest to first master
|
||||||
template:
|
ansible.builtin.template:
|
||||||
src: "metallb.crs.j2"
|
src: "metallb.crs.j2"
|
||||||
dest: "/tmp/k3s/metallb-crs.yaml"
|
dest: "/tmp/k3s/metallb-crs.yaml"
|
||||||
owner: "{{ ansible_user }}"
|
owner: "{{ ansible_user }}"
|
||||||
@@ -18,14 +18,14 @@
|
|||||||
run_once: true
|
run_once: true
|
||||||
|
|
||||||
- name: Test metallb-system namespace
|
- name: Test metallb-system namespace
|
||||||
command: >-
|
ansible.builtin.command: >-
|
||||||
k3s kubectl -n metallb-system
|
k3s kubectl -n metallb-system
|
||||||
changed_when: false
|
changed_when: false
|
||||||
with_items: "{{ groups['master'] }}"
|
with_items: "{{ groups['master'] }}"
|
||||||
run_once: true
|
run_once: true
|
||||||
|
|
||||||
- name: Wait for MetalLB resources
|
- name: Wait for MetalLB resources
|
||||||
command: >-
|
ansible.builtin.command: >-
|
||||||
k3s kubectl wait {{ item.resource }}
|
k3s kubectl wait {{ item.resource }}
|
||||||
--namespace='metallb-system'
|
--namespace='metallb-system'
|
||||||
{% if item.name | default(False) -%}{{ item.name }}{%- endif %}
|
{% if item.name | default(False) -%}{{ item.name }}{%- endif %}
|
||||||
@@ -63,14 +63,14 @@
|
|||||||
label: "{{ item.description }}"
|
label: "{{ item.description }}"
|
||||||
|
|
||||||
- name: Test metallb-system webhook-service endpoint
|
- name: Test metallb-system webhook-service endpoint
|
||||||
command: >-
|
ansible.builtin.command: >-
|
||||||
k3s kubectl -n metallb-system get endpoints webhook-service
|
k3s kubectl -n metallb-system get endpoints webhook-service
|
||||||
changed_when: false
|
changed_when: false
|
||||||
with_items: "{{ groups['master'] }}"
|
with_items: "{{ groups['master'] }}"
|
||||||
run_once: true
|
run_once: true
|
||||||
|
|
||||||
- name: Apply metallb CRs
|
- name: Apply metallb CRs
|
||||||
command: >-
|
ansible.builtin.command: >-
|
||||||
k3s kubectl apply -f /tmp/k3s/metallb-crs.yaml
|
k3s kubectl apply -f /tmp/k3s/metallb-crs.yaml
|
||||||
--timeout='{{ metal_lb_available_timeout }}'
|
--timeout='{{ metal_lb_available_timeout }}'
|
||||||
register: this
|
register: this
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
- name: Test metallb-system resources
|
- name: Test metallb-system resources
|
||||||
command: >-
|
ansible.builtin.command: >-
|
||||||
k3s kubectl -n metallb-system get {{ item }}
|
k3s kubectl -n metallb-system get {{ item }}
|
||||||
changed_when: false
|
changed_when: false
|
||||||
run_once: true
|
run_once: true
|
||||||
@@ -89,6 +89,6 @@
|
|||||||
- L2Advertisement
|
- L2Advertisement
|
||||||
|
|
||||||
- name: Remove tmp directory used for manifests
|
- name: Remove tmp directory used for manifests
|
||||||
file:
|
ansible.builtin.file:
|
||||||
path: /tmp/k3s
|
path: /tmp/k3s
|
||||||
state: absent
|
state: absent
|
||||||
|
|||||||
@@ -1,61 +1,60 @@
|
|||||||
---
|
|
||||||
- name: Set same timezone on every Server
|
- name: Set same timezone on every Server
|
||||||
timezone:
|
community.general.timezone:
|
||||||
name: "{{ system_timezone }}"
|
name: "{{ system_timezone }}"
|
||||||
when: (system_timezone is defined) and (system_timezone != "Your/Timezone")
|
when: (system_timezone is defined) and (system_timezone != "Your/Timezone")
|
||||||
|
|
||||||
- name: Set SELinux to disabled state
|
- name: Set SELinux to disabled state
|
||||||
selinux:
|
ansible.posix.selinux:
|
||||||
state: disabled
|
state: disabled
|
||||||
when: ansible_os_family == "RedHat"
|
when: ansible_os_family == "RedHat"
|
||||||
|
|
||||||
- name: Enable IPv4 forwarding
|
- name: Enable IPv4 forwarding
|
||||||
sysctl:
|
ansible.posix.sysctl:
|
||||||
name: net.ipv4.ip_forward
|
name: net.ipv4.ip_forward
|
||||||
value: "1"
|
value: "1"
|
||||||
state: present
|
state: present
|
||||||
reload: yes
|
reload: true
|
||||||
|
|
||||||
- name: Enable IPv6 forwarding
|
- name: Enable IPv6 forwarding
|
||||||
sysctl:
|
ansible.posix.sysctl:
|
||||||
name: net.ipv6.conf.all.forwarding
|
name: net.ipv6.conf.all.forwarding
|
||||||
value: "1"
|
value: "1"
|
||||||
state: present
|
state: present
|
||||||
reload: yes
|
reload: true
|
||||||
|
|
||||||
- name: Enable IPv6 router advertisements
|
- name: Enable IPv6 router advertisements
|
||||||
sysctl:
|
ansible.posix.sysctl:
|
||||||
name: net.ipv6.conf.all.accept_ra
|
name: net.ipv6.conf.all.accept_ra
|
||||||
value: "2"
|
value: "2"
|
||||||
state: present
|
state: present
|
||||||
reload: yes
|
reload: true
|
||||||
|
|
||||||
- name: Add br_netfilter to /etc/modules-load.d/
|
- name: Add br_netfilter to /etc/modules-load.d/
|
||||||
copy:
|
ansible.builtin.copy:
|
||||||
content: "br_netfilter"
|
content: "br_netfilter"
|
||||||
dest: /etc/modules-load.d/br_netfilter.conf
|
dest: /etc/modules-load.d/br_netfilter.conf
|
||||||
mode: "u=rw,g=,o="
|
mode: "u=rw,g=,o="
|
||||||
when: ansible_os_family == "RedHat"
|
when: ansible_os_family == "RedHat"
|
||||||
|
|
||||||
- name: Load br_netfilter
|
- name: Load br_netfilter
|
||||||
modprobe:
|
community.general.modprobe:
|
||||||
name: br_netfilter
|
name: br_netfilter
|
||||||
state: present
|
state: present
|
||||||
when: ansible_os_family == "RedHat"
|
when: ansible_os_family == "RedHat"
|
||||||
|
|
||||||
- name: Set bridge-nf-call-iptables (just to be sure)
|
- name: Set bridge-nf-call-iptables (just to be sure)
|
||||||
sysctl:
|
ansible.posix.sysctl:
|
||||||
name: "{{ item }}"
|
name: "{{ item }}"
|
||||||
value: "1"
|
value: "1"
|
||||||
state: present
|
state: present
|
||||||
reload: yes
|
reload: true
|
||||||
when: ansible_os_family == "RedHat"
|
when: ansible_os_family == "RedHat"
|
||||||
loop:
|
loop:
|
||||||
- net.bridge.bridge-nf-call-iptables
|
- net.bridge.bridge-nf-call-iptables
|
||||||
- net.bridge.bridge-nf-call-ip6tables
|
- net.bridge.bridge-nf-call-ip6tables
|
||||||
|
|
||||||
- name: Add /usr/local/bin to sudo secure_path
|
- name: Add /usr/local/bin to sudo secure_path
|
||||||
lineinfile:
|
ansible.builtin.lineinfile:
|
||||||
line: 'Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin'
|
line: 'Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin'
|
||||||
regexp: "Defaults(\\s)*secure_path(\\s)*="
|
regexp: "Defaults(\\s)*secure_path(\\s)*="
|
||||||
state: present
|
state: present
|
||||||
|
|||||||
@@ -1,46 +1,49 @@
|
|||||||
- name: check packages for updates
|
- name: Check packages for updates
|
||||||
shell: yum list updates | awk 'f;/Updated Packages/{f=1;}' | awk '{ print $1 }'
|
ansible.builtin.shell: set -o pipefail && yum list updates | awk 'f;/Updated Packages/{f=1;}' | awk '{ print $1 }'
|
||||||
changed_when: updates.stdout_lines | length > 0
|
changed_when: updates.stdout_lines | length > 0
|
||||||
args:
|
args:
|
||||||
warn: false
|
warn: false
|
||||||
register: updates
|
register: updates
|
||||||
|
|
||||||
- name: display count
|
- name: Display count
|
||||||
debug:
|
ansible.builtin.debug:
|
||||||
msg: "Found {{ updates.stdout_lines | length }} packages to be updated:\n\n{{ updates.stdout }}"
|
msg: "Found {{ updates.stdout_lines | length }} packages to be updated:\n\n{{ updates.stdout }}"
|
||||||
- when: updates.stdout_lines | length > 0
|
- name: Update if needed
|
||||||
|
when: updates.stdout_lines | length > 0
|
||||||
block:
|
block:
|
||||||
|
|
||||||
- name: install updates using yum
|
|
||||||
yum:
|
|
||||||
name: "*"
|
|
||||||
state: latest
|
|
||||||
|
|
||||||
- name: install yum-utils
|
- name: Install updates using yum
|
||||||
package:
|
ansible.builtin.yum:
|
||||||
|
name: "*"
|
||||||
|
state: present
|
||||||
|
update_only: true
|
||||||
|
|
||||||
|
- name: Install yum-utils
|
||||||
|
ansible.builtin.package:
|
||||||
name: yum-utils
|
name: yum-utils
|
||||||
|
|
||||||
- name: check if reboot is required
|
- name: Check if reboot is required
|
||||||
shell: needs-restarting -r
|
ansible.builtin.command: needs-restarting -r
|
||||||
failed_when: false
|
failed_when: false
|
||||||
register: reboot_required
|
register: reboot_required
|
||||||
changed_when: false
|
changed_when: false
|
||||||
|
|
||||||
- when: updates.stdout_lines | length > 0 and reboot_required.rc != 0
|
- name: Reboot if required
|
||||||
|
when: updates.stdout_lines | length > 0 and reboot_required.rc != 0
|
||||||
block:
|
block:
|
||||||
|
|
||||||
- name: reboot the server if required
|
- name: Reboot the server if required
|
||||||
shell: sleep 3; reboot
|
ansible.builtin.shell: sleep 3; reboot
|
||||||
ignore_errors: true
|
ignore_errors: "{{ ansible_check_mode }}"
|
||||||
changed_when: false
|
changed_when: false
|
||||||
async: 1
|
async: 1
|
||||||
poll: 0
|
poll: 0
|
||||||
|
|
||||||
- name: wait for server to come back after reboot
|
- name: Wait for server to come back after reboot
|
||||||
wait_for_connection:
|
ansible.builtin.wait_for_connection:
|
||||||
timeout: 600
|
timeout: 600
|
||||||
delay: 20
|
delay: 20
|
||||||
register: reboot_result
|
register: reboot_result
|
||||||
- name: reboot time
|
- name: Reboot time
|
||||||
debug:
|
ansible.builtin.debug:
|
||||||
msg: "The system rebooted in {{ reboot_result.elapsed }} seconds."
|
msg: "The system rebooted in {{ reboot_result.elapsed }} seconds."
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
- hosts: all
|
- hosts: all
|
||||||
gather_facts: yes
|
gather_facts: true
|
||||||
become: yes
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- update
|
- update
|
||||||
|
|||||||
Reference in New Issue
Block a user