main.yml 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. ---
  2. # If airgapped, all K3s artifacts are already on the node.
  3. # - name: Download K3s install script
  4. # when: airgap_dir is undefined
  5. # ansible.builtin.get_url:
  6. # url: https://get.k3s.io/
  7. # timeout: 120
  8. # dest: /usr/local/bin/k3s-install.sh
  9. # owner: root
  10. # group: root
  11. # mode: 0755
  12. #
  13. # - name: Download K3s binary
  14. # when: airgap_dir is undefined
  15. # ansible.builtin.command:
  16. # cmd: /usr/local/bin/k3s-install.sh
  17. # environment:
  18. # INSTALL_K3S_SKIP_START: "true"
  19. # INSTALL_K3S_VERSION: "{{ k3s_version }}"
  20. # changed_when: true
  21. - name: Setup optional config file
  22. include_role:
  23. name: k3s/config
  24. vars:
  25. is_k3s_server: True
  26. - name: Detect user shell
  27. shell:
  28. getent passwd "{{ ansible_user }}" | cut -d: -f7 | rev | cut -d/ -f1 | rev
  29. register: user_shell
  30. changed_when: false
  31. failed_when: false
  32. - name: Set detected shell with bash default
  33. set_fact:
  34. detected_shell: "{{ ('zsh' if (user_shell.stdout | default('')).strip() == 'zsh' else 'bash') }}"
  35. - name: Init first server node
  36. when: inventory_hostname == groups['primary_master_node'][0]
  37. block:
  38. - name: Copy K3s service file [Single]
  39. when: ('master_nodes' not in groups) or (groups['master_nodes'] | length == 0)
  40. ansible.builtin.template:
  41. src: "k3s-single.service.j2"
  42. dest: "{{ systemd_dir }}/k3s.service"
  43. owner: root
  44. group: root
  45. mode: 0644
  46. - name: Copy K3s service file [HA]
  47. when: ('master_nodes' in groups) and (groups['master_nodes'] | length > 1)
  48. ansible.builtin.template:
  49. src: "k3s-cluster-init.service.j2"
  50. dest: "{{ systemd_dir }}/k3s.service"
  51. owner: root
  52. group: root
  53. mode: 0644
  54. - name: Add service environment variables
  55. when: extra_service_envs is defined and extra_service_envs | length > 0
  56. ansible.builtin.lineinfile:
  57. path: "{{ systemd_dir }}/k3s.service.env"
  58. line: "{{ item }}"
  59. with_items: "{{ extra_service_envs }}"
  60. - name: Enable and check K3s service
  61. ansible.builtin.systemd:
  62. name: k3s
  63. daemon_reload: true
  64. state: started
  65. enabled: true
  66. # - name: Pause to allow first server startup
  67. # when: ('master_nodes' in groups) and ((groups['master_nodes'] | length) > 1)
  68. # ansible.builtin.pause:
  69. # seconds: 10
  70. #
  71. - name: Add K3s autocomplete to user shell config
  72. ansible.builtin.lineinfile:
  73. path: "~{{ ansible_user }}/.{{ detected_shell }}rc"
  74. regexp: '\.\s+<\(/usr/local/bin/k3s completion (bash|zsh)\)'
  75. line: ". <(/usr/local/bin/k3s completion {{ detected_shell }}) # Added by k3s-ansible"
  76. create: yes
  77. when: detected_shell is defined
  78. # - name: Change server to API endpoint instead of localhost
  79. # ansible.builtin.command: >-
  80. # /usr/local/bin/k3s kubectl config set-cluster default
  81. # --server=https://{{ api_endpoint }}:{{ api_port }}
  82. # --kubeconfig ~{{ ansible_user }}/.kube/config
  83. # changed_when: true
  84. - name: Copy kubectl config to local machine
  85. ansible.builtin.fetch:
  86. src: /etc/rancher/k3s/k3s.yaml
  87. dest: "{{ kubeconfig }}"
  88. flat: true
  89. - name: Check whether kubectl is installed on control node
  90. ansible.builtin.command: 'kubectl'
  91. register: kubectl_installed
  92. ignore_errors: true
  93. delegate_to: 127.0.0.1
  94. become: false
  95. changed_when: false
  96. - name: Setup kubeconfig k3s-ansible context
  97. when: kubeconfig == "~/.kube/config.new" and kubectl_installed.rc == 0
  98. ansible.builtin.replace:
  99. path: "{{ kubeconfig }}"
  100. regexp: 'name: default'
  101. replace: 'name: k3s-ansible'
  102. delegate_to: 127.0.0.1
  103. become: false
  104. - name: Merge with any existing kube config
  105. when: kubeconfig == "~/.kube/config.new" and kubectl_installed.rc == 0
  106. ansible.builtin.shell: |
  107. TFILE=$(mktemp)
  108. KUBECONFIG=~/.kube/config.new kubectl rename-context default k3s-ansible
  109. KUBECONFIG=~/.kube/config.new kubectl config set-context k3s-ansible --user=k3s-ansible --cluster=k3s-ansible
  110. KUBECONFIG=~/.kube/config.new:~/.kube/config kubectl config view --flatten > ${TFILE}
  111. mv ${TFILE} ~/.kube/config
  112. rm ~/.kube/config.new
  113. delegate_to: 127.0.0.1
  114. become: false
  115. register: mv_result
  116. changed_when:
  117. - mv_result.rc == 0
  118. - name: Start other server if any and verify status
  119. when:
  120. - ('master_nodes' in groups) and ((groups['master_nodes'] | length) > 1)
  121. - inventory_hostname != groups['primary_master_node'][0]
  122. block:
  123. - name: Copy K3s service file [HA]
  124. when: groups['master_nodes'] | length > 1
  125. ansible.builtin.template:
  126. src: "k3s-ha.service.j2"
  127. dest: "{{ systemd_dir }}/k3s.service"
  128. owner: root
  129. group: root
  130. mode: 0644
  131. - name: Add service environment variables
  132. when: extra_service_envs is defined and extra_service_envs | length > 0
  133. ansible.builtin.lineinfile:
  134. path: "{{ systemd_dir }}/k3s.service.env"
  135. line: "{{ item }}"
  136. with_items: "{{ extra_service_envs }}"
  137. - name: Enable and check K3s service
  138. ansible.builtin.systemd:
  139. name: k3s
  140. daemon_reload: true
  141. state: started
  142. enabled: true
  143. register: k3s_service_result
  144. retries: 5
  145. delay: 5
  146. until: k3s_service_result is succeeded
  147. ignore_errors: false
  148. - name: Verify that all server nodes joined
  149. when: (groups['master_nodes'] | length) > 1
  150. ansible.builtin.shell: |
  151. KUBECONFIG=/etc/rancher/k3s/k3s.yaml k3s kubectl get nodes -l "node-role.kubernetes.io/control-plane=true" -o=jsonpath="{.items[*].metadata.name}"
  152. register: nodes
  153. until: nodes.rc == 0 and (nodes.stdout.split() | length) == (groups['master_nodes'] | length + 1)
  154. retries: 20
  155. delay: 10
  156. changed_when: false
  157. - name: Setup kubectl for user
  158. when: user_kubectl
  159. block:
  160. - name: Create kubectl symlink
  161. when: lookup('fileglob', '/usr/local/bin/kubectl', errors='warn') | length == 0
  162. ansible.builtin.file:
  163. src: /usr/local/bin/k3s
  164. dest: /usr/local/bin/kubectl
  165. state: link
  166. - name: Create directory .kube
  167. ansible.builtin.file:
  168. path: ~{{ ansible_user }}/.kube
  169. state: directory
  170. owner: "{{ ansible_user }}"
  171. mode: "u=rwx,g=rx,o="
  172. - name: Copy config file to user home directory
  173. ansible.builtin.copy:
  174. src: /etc/rancher/k3s/k3s.yaml
  175. dest: ~{{ ansible_user }}/.kube/config
  176. remote_src: true
  177. owner: "{{ ansible_user }}"
  178. mode: "u=rw,g=,o="
  179. - name: Configure default KUBECONFIG for user
  180. ansible.builtin.lineinfile:
  181. path: "~{{ ansible_user }}/.{{ detected_shell }}rc"
  182. regexp: 'export KUBECONFIG=~/.kube/config'
  183. line: 'export KUBECONFIG=~/.kube/config # Added by k3s-ansible'
  184. state: present
  185. create: yes
  186. when: detected_shell is defined
  187. - name: Configure kubectl autocomplete
  188. ansible.builtin.lineinfile:
  189. path: "~{{ ansible_user }}/.{{ detected_shell }}rc"
  190. regexp: '\.\s+<\(kubectl completion (bash|zsh)\)'
  191. line: ". <({{ K3S_CMDLINE_PREFIX }} kubectl completion {{ detected_shell }}) # Added by k3s-ansible"
  192. create: yes
  193. when: detected_shell is defined