|
|
@@ -0,0 +1,318 @@
|
|
|
+---
|
|
|
+- name: Setup Prerequisites To Install Kubernetes
|
|
|
+ hosts: instance
|
|
|
+ become: true
|
|
|
+ vars:
|
|
|
+ kube_prereq_packages: [curl, ca-certificates, apt-transport-https]
|
|
|
+ kube_packages: [kubeadm, kubectl, kubelet]
|
|
|
+
|
|
|
+ tasks:
|
|
|
+ - name: Test Reacheability
|
|
|
+ ansible.builtin.ping:
|
|
|
+
|
|
|
+ - name: Update Cache
|
|
|
+ ansible.builtin.apt:
|
|
|
+ update_cache: true
|
|
|
+ autoclean: true
|
|
|
+
|
|
|
+ - name: 1. Upgrade All the Packages to the latest
|
|
|
+ ansible.builtin.apt:
|
|
|
+ upgrade: "full"
|
|
|
+
|
|
|
+ - name: 2. Install Qemu-Guest-Agent
|
|
|
+ ansible.builtin.apt:
|
|
|
+ name:
|
|
|
+ - qemu-guest-agent
|
|
|
+ state: present
|
|
|
+
|
|
|
+ - name: 3. Setup a Container Runtime
|
|
|
+ ansible.builtin.apt:
|
|
|
+ name:
|
|
|
+ - containerd
|
|
|
+ state: present
|
|
|
+
|
|
|
+ - name: 4. Start Containerd If Stopped
|
|
|
+ ansible.builtin.service:
|
|
|
+ name: containerd
|
|
|
+ state: started
|
|
|
+
|
|
|
+ - name: 5. Create Containerd Directory
|
|
|
+ ansible.builtin.file:
|
|
|
+ path: /etc/containerd
|
|
|
+ state: directory
|
|
|
+ mode: '0755'
|
|
|
+
|
|
|
+ - name: 6. Check config.toml Exists
|
|
|
+ ansible.builtin.stat:
|
|
|
+ path: /etc/containerd/config.toml
|
|
|
+ register: pre_file_exist_result
|
|
|
+
|
|
|
+ - name: 6.1 Delete config.toml Exists
|
|
|
+ ansible.builtin.file:
|
|
|
+ path: /etc/containerd/config.toml
|
|
|
+ state: absent
|
|
|
+ when: pre_file_exist_result.stat.exists
|
|
|
+
|
|
|
+ - name: 7. Place Default Containerd Config Inside It
|
|
|
+ ansible.builtin.shell: |
|
|
|
+ set -o pipefail
|
|
|
+ containerd config default | sudo tee /etc/containerd/config.toml
|
|
|
+ register: output
|
|
|
+ changed_when: output.rc != 0
|
|
|
+ args:
|
|
|
+ executable: /bin/bash
|
|
|
+ tags:
|
|
|
+ - containerd_config
|
|
|
+
|
|
|
+ - name: 7.1 Check If New config.toml Exists Now
|
|
|
+ ansible.builtin.stat:
|
|
|
+ path: /etc/containerd/config.toml
|
|
|
+ register: post_file_exist_result
|
|
|
+ tags:
|
|
|
+ - containerd_config
|
|
|
+
|
|
|
+ - name: 7.2 Exit The Play If config.toml Does Not Exist
|
|
|
+ ansible.builtin.meta: end_play
|
|
|
+ when: not post_file_exist_result.stat.exists
|
|
|
+ tags:
|
|
|
+ - containerd_config
|
|
|
+
|
|
|
+ - name: 8.1 Disable Swap
|
|
|
+ ansible.builtin.command: sudo swapoff -a
|
|
|
+ register: output
|
|
|
+ changed_when: output.rc != 0
|
|
|
+ tags:
|
|
|
+ - disable_swap
|
|
|
+
|
|
|
+ - name: 8.2 Disable Swap permanently
|
|
|
+ ansible.builtin.replace:
|
|
|
+ path: /etc/fstab
|
|
|
+ regexp: '^([^#].*?\sswap\s+sw\s+.*)$'
|
|
|
+ replace: '# \1'
|
|
|
+ tags:
|
|
|
+ - disable_swap
|
|
|
+
|
|
|
+ - name: 9. Edit config.toml
|
|
|
+ ansible.builtin.replace:
|
|
|
+ path: /etc/containerd/config.toml
|
|
|
+ after: \[plugins\."io\.containerd\.grpc\.v1\.cri"\.containerd\.runtimes\.runc\.options\]
|
|
|
+ regexp: SystemdCgroup = false
|
|
|
+ replace: SystemdCgroup = true
|
|
|
+
|
|
|
+ - name: 10. Enable Ipv4 Bridging
|
|
|
+ ansible.builtin.replace:
|
|
|
+ path: /etc/sysctl.conf
|
|
|
+ regexp: ^#net\.ipv4\.ip_forward=1$
|
|
|
+ replace: net.ipv4.ip_forward=1
|
|
|
+
|
|
|
+ - name: 11.1 Delete k8s Config If Exists
|
|
|
+ ansible.builtin.file:
|
|
|
+ path: /etc/modules-load.d/k8s.conf
|
|
|
+ state: absent
|
|
|
+ tags:
|
|
|
+ - kube_config
|
|
|
+
|
|
|
+ - name: 11.2 Add k8s.config and Edit It
|
|
|
+ ansible.builtin.lineinfile:
|
|
|
+ path: /etc/modules-load.d/k8s.conf
|
|
|
+ line: br_netfilter
|
|
|
+ create: true
|
|
|
+ mode: '0755'
|
|
|
+ tags:
|
|
|
+ - kube_config
|
|
|
+
|
|
|
+ - name: 12.1 Reboot
|
|
|
+ ansible.builtin.reboot:
|
|
|
+ register: system_reboot
|
|
|
+
|
|
|
+ - name: 12.2 Verify Reboot Success
|
|
|
+ ansible.builtin.ping:
|
|
|
+ when: system_reboot.rebooted
|
|
|
+
|
|
|
+ - name: 13.1 Update Cache
|
|
|
+ ansible.builtin.apt:
|
|
|
+ update_cache: true
|
|
|
+ autoclean: true
|
|
|
+ tags:
|
|
|
+ - install_pre_kube_packages
|
|
|
+
|
|
|
+ - name: 13.2 Remove apt lock file
|
|
|
+ ansible.builtin.file:
|
|
|
+ state: absent
|
|
|
+ path: "/var/lib/dpkg/lock"
|
|
|
+ tags:
|
|
|
+ - install_pre_kube_packages
|
|
|
+
|
|
|
+ - name: 13.3 Install Prerequisite Packages
|
|
|
+ ansible.builtin.apt:
|
|
|
+ name: '{{ kube_prereq_packages }}'
|
|
|
+ tags:
|
|
|
+ - install_pre_kube_packages
|
|
|
+
|
|
|
+ - name: 13.4 Remove GPG Keys If They Exist
|
|
|
+ ansible.builtin.file:
|
|
|
+ path: "{{ item }}"
|
|
|
+ state: absent
|
|
|
+ with_items:
|
|
|
+ - /usr/share/keyrings/kubernetes-apt-keyring.gpg
|
|
|
+ - /usr/share/keyrings/kubernetes-apt-keyring.gpg_armored
|
|
|
+ tags:
|
|
|
+ - install_pre_kube_packages
|
|
|
+
|
|
|
+ - name: 13.5 Download Kubernetes APT Key
|
|
|
+ ansible.builtin.get_url:
|
|
|
+ url: https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key
|
|
|
+ dest: /usr/share/keyrings/kubernetes-apt-keyring.gpg_armored
|
|
|
+ mode: '0755'
|
|
|
+ tags:
|
|
|
+ - install_pre_kube_packages
|
|
|
+
|
|
|
+ - name: 13.6 De-Armor Kubernetes APT Key
|
|
|
+ ansible.builtin.shell: gpg --dearmor < /usr/share/keyrings/kubernetes-apt-keyring.gpg_armored > /etc/apt/keyrings/kubernetes-apt-keyring.gpg
|
|
|
+ no_log: true
|
|
|
+ args:
|
|
|
+ creates: /etc/apt/keyrings/kubernetes-apt-keyring.gpg
|
|
|
+ tags:
|
|
|
+ - install_pre_kube_packages
|
|
|
+
|
|
|
+ - name: 13.7 Add Kubernetes APT Key
|
|
|
+ ansible.builtin.shell: |
|
|
|
+ set -o pipefail
|
|
|
+ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' \
|
|
|
+ | sudo tee /etc/apt/sources.list.d/kubernetes.list
|
|
|
+ register: apt_output
|
|
|
+ changed_when: apt_output.rc != 0
|
|
|
+ args:
|
|
|
+ executable: /bin/bash
|
|
|
+ tags:
|
|
|
+ - install_pre_kube_packages
|
|
|
+
|
|
|
+ - name: 14.1 Update Cache
|
|
|
+ ansible.builtin.apt:
|
|
|
+ update_cache: true
|
|
|
+ autoclean: true
|
|
|
+ tags:
|
|
|
+ - install_kube_packages
|
|
|
+
|
|
|
+ - name: 14.2 Remove apt lock file
|
|
|
+ ansible.builtin.file:
|
|
|
+ state: absent
|
|
|
+ path: "/var/lib/dpkg/lock"
|
|
|
+ tags:
|
|
|
+ - install_kube_packages
|
|
|
+
|
|
|
+ - name: 14.3 Install Required Packages
|
|
|
+ ansible.builtin.apt:
|
|
|
+ name: '{{ kube_packages }}'
|
|
|
+ tags:
|
|
|
+ - install_kube_packages
|
|
|
+
|
|
|
+ - name: 14.4 Hold Packages
|
|
|
+ ansible.builtin.dpkg_selections:
|
|
|
+ name: '{{ item }}'
|
|
|
+ selection: hold
|
|
|
+ with_items: '{{ kube_packages }}'
|
|
|
+ tags:
|
|
|
+ - install_kube_packages
|
|
|
+
|
|
|
+ - name: Prompt To Continue On To Configuring Control Nodes
|
|
|
+ ansible.builtin.pause:
|
|
|
+ prompt: Press RETURN when you want to continue configuring the Control nodes!
|
|
|
+
|
|
|
+- name: Setup Controller Nodes
|
|
|
+ gather_facts: true
|
|
|
+ hosts: controllers
|
|
|
+ become: true
|
|
|
+
|
|
|
+ tasks:
|
|
|
+ - name: 1. Initialize Cluster
|
|
|
+ ansible.builtin.shell: |
|
|
|
+ set -o pipefail
|
|
|
+ sudo kubeadm init --control-plane-endpoint={{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }} --pod-network-cidr=10.244.0.0/16
|
|
|
+ register: init_cluster_output
|
|
|
+ changed_when: init_cluster_output.rc != 0
|
|
|
+ args:
|
|
|
+ executable: /bin/bash
|
|
|
+
|
|
|
+ - name: 2.1 Create .kube Directory
|
|
|
+ ansible.builtin.file:
|
|
|
+ path: .kube
|
|
|
+ state: directory
|
|
|
+ mode: '0755'
|
|
|
+ tags:
|
|
|
+ - kube_admin_config
|
|
|
+
|
|
|
+ - name: 2.2 Copy Kubernetes Admin Config
|
|
|
+ ansible.builtin.copy:
|
|
|
+ remote_src: true
|
|
|
+ src: /etc/kubernetes/admin.conf
|
|
|
+ dest: .kube/config
|
|
|
+ mode: '0755'
|
|
|
+ tags:
|
|
|
+ - kube_admin_config
|
|
|
+
|
|
|
+ - name: 2.3 Change Config File Permission
|
|
|
+ ansible.builtin.command: chown {{ ansible_env.USER }}:{{ ansible_env.USER }} ".kube/config"
|
|
|
+ changed_when: false
|
|
|
+ when: not ansible_env.HOME is undefined
|
|
|
+ tags:
|
|
|
+ - kube_admin_config
|
|
|
+
|
|
|
+ - name: 3. Install An Overlay Network
|
|
|
+ ansible.builtin.shell: |
|
|
|
+ set -o pipefail
|
|
|
+ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
|
|
|
+ register: init_cluster_output
|
|
|
+ become: false
|
|
|
+ changed_when: init_cluster_output.rc != 0
|
|
|
+ args:
|
|
|
+ executable: /bin/bash
|
|
|
+
|
|
|
+ - name: 4.1 Execute Join String Generation Command
|
|
|
+ ansible.builtin.command: kubeadm token create --print-join-command
|
|
|
+ become: false
|
|
|
+ register: join_output
|
|
|
+ changed_when: false
|
|
|
+ tags:
|
|
|
+ - join_string
|
|
|
+
|
|
|
+ - name: 4.2 Display Join String
|
|
|
+ ansible.builtin.debug:
|
|
|
+ msg: 'Join Command : {{ join_output.stdout }}'
|
|
|
+ tags:
|
|
|
+ - join_string
|
|
|
+
|
|
|
+ - name: Copy Connection String To A Remote File
|
|
|
+ ansible.builtin.template:
|
|
|
+ src: k8s_worker_node_connection.j2
|
|
|
+ dest: worker_conn_string
|
|
|
+ mode: '0755'
|
|
|
+
|
|
|
+ - name: Check Connection String File Exists
|
|
|
+ ansible.builtin.stat:
|
|
|
+ path: worker_conn_string
|
|
|
+ register: conn_file_path_remote
|
|
|
+
|
|
|
+ - name: Fetch The Remote File
|
|
|
+ ansible.builtin.fetch:
|
|
|
+ src: worker_conn_string
|
|
|
+ dest: Remote_Files/worker_conn_string
|
|
|
+ flat: true
|
|
|
+ when: conn_file_path_remote.stat.exists
|
|
|
+
|
|
|
+ - name: Prompt To Continue On To Configuring Worker Nodes
|
|
|
+ ansible.builtin.pause:
|
|
|
+ prompt: Press RETURN when you want to continue configuring the Worker nodes!
|
|
|
+
|
|
|
+- name: Join Worker Nodes
|
|
|
+ gather_facts: true
|
|
|
+ hosts: nodes
|
|
|
+ become: true
|
|
|
+ vars:
|
|
|
+ node_conn_string: "{{ lookup('ansible.builtin.file', 'Remote_Files/worker_conn_string') }}"
|
|
|
+
|
|
|
+ tasks:
|
|
|
+ - name: 1. Add Worker Nodes To The Controller
|
|
|
+ ansible.builtin.command: '{{ node_conn_string }}'
|
|
|
+ changed_when: false
|
|
|
+ throttle: 1
|