Playbooks to a new Lilik
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
6.1 KiB

  1. ---
  2. - name: check for lxc container dir
  3. stat:
  4. path: '/var/lib/lxc/{{ vm_name }}'
  5. register: lxc_existance
  6. - name: check for lxc container existance
  7. container_exists:
  8. name: "{{ vm_name }}"
  9. register: container_exists
  10. - name: Check debian release
  11. assert:
  12. that: distro in [ 'wheezy', 'jessie', 'stretch', 'sid', ]
  13. msg: "release {{ distro }} not supported by debian template"
  14. - block:
  15. - name: create the lxc container
  16. lxc_container:
  17. name: "{{ vm_name }}"
  18. backing_store: lvm
  19. fs_size: "{{ vm_size }}"
  20. vg_name: "{{ inventory_hostname }}vg"
  21. lv_name: "vm_{{ vm_name }}"
  22. fs_type: xfs
  23. container_log: true
  24. template: debian
  25. template_options: --release {{ distro }} --packages=ssh,python
  26. state: stopped
  27. # suppress messages related to file descriptors
  28. # leaking when lvm is invoked
  29. environment:
  30. LVM_SUPPRESS_FD_WARNINGS: 1
  31. - name: deploy container config
  32. template:
  33. src: config.j2
  34. dest: "/var/lib/lxc/{{ vm_name }}/config"
  35. - name: start container
  36. lxc_container:
  37. name: "{{ vm_name }}"
  38. state: started
  39. when: auto_start|bool
  40. when: not (container_exists.exists and lxc_existance.stat.isdir)
  41. - name: update container config
  42. template:
  43. src: config.j2
  44. dest: "/var/lib/lxc/{{ vm_name }}/config"
  45. register: container_config
  46. notify: restart container
  47. - name: set container running state
  48. lxc_container:
  49. name: "{{ vm_name }}"
  50. state: "{{ container_state }}"
  51. register: container_running_state
  52. - name: Read container DNS configuration
  53. container_file_read:
  54. name: "{{ vm_name }}"
  55. path: /etc/resolv.conf
  56. register: vm_resolv_conf
  57. - debug:
  58. var: vm_resolv_conf
  59. verbosity: 2
  60. - name: update container DNS configuration
  61. shell: lxc-attach -n {{ vm_name }} --clear-env -e -- bash -c "grep '^nameserver {{ hostvars[ext_gateway].ansible_host }}$' /etc/resolv.conf || echo 'nameserver {{ hostvars[ext_gateway].ansible_host }}' > /etc/resolv.conf"
  62. register: container_dns_configuration
  63. changed_when: "container_dns_configuration.stdout != 'nameserver {{ hostvars[ext_gateway].ansible_host }}'"
  64. - name: Check if host certificate exists
  65. container_file_exists:
  66. name: "{{ vm_name }}"
  67. path: "/etc/ssh/ssh_host_ed25519_key-cert.pub"
  68. register: vm_ssh_certificate_exists
  69. - debug:
  70. var: vm_ssh_certificate_exists
  71. verbosity: 2
  72. - block:
  73. - name: Read host public key
  74. container_file_read:
  75. name: "{{ vm_name }}"
  76. path: "/etc/ssh/ssh_host_ed25519_key.pub"
  77. register: vm_public_key
  78. - debug:
  79. var: vm_public_key
  80. verbosity: 2
  81. - name: generate host request
  82. set_fact:
  83. cert_request:
  84. type: 'sign_request'
  85. request:
  86. keyType: 'ssh_host'
  87. hostName: '{{ vm_name }}'
  88. keyData: '{{ vm_public_key.text }}'
  89. - debug:
  90. var: cert_request
  91. verbosity: 2
  92. - name: start sign request
  93. raw: "{{ cert_request | to_json }}"
  94. delegate_to: ca_request
  95. delegate_facts: True
  96. register: request_result
  97. failed_when: "( request_result.stdout | from_json ).failed"
  98. - debug:
  99. var: request_result
  100. verbosity: 2
  101. - set_fact:
  102. request_output: "{{ request_result.results[0].stdout | from_json }}"
  103. - debug:
  104. var: request_output
  105. verbosity: 2
  106. - name: generate get request
  107. set_fact:
  108. get_request:
  109. type: 'get_certificate'
  110. requestID: '{{ request_output.requestID }}'
  111. - debug:
  112. var: get_request
  113. verbosity: 2
  114. - debug:
  115. msg: "Please manualy confirm sign request with id {{ request_output.requestID }}"
  116. - name: wait for cert
  117. raw: "{{ get_request | to_json }}"
  118. delegate_to: ca_request
  119. delegate_facts: True
  120. register: cert_result
  121. failed_when: "(cert_result.stdout | from_json).failed"
  122. - debug:
  123. var: cert_result
  124. verbosity: 2
  125. - set_fact:
  126. cert_key: "{{ cert_result.results[0].stdout | string | from_json }}"
  127. - name: Write certificate to container
  128. container_file_write:
  129. name: "{{ vm_name }}"
  130. path: "/etc/ssh/ssh_host_ed25519_key-cert.pub"
  131. text: "{{ cert_key.result }}"
  132. register: set_pub_key
  133. notify: restart container
  134. when: "not vm_ssh_certificate_exists.exists"
  135. - name: update container network configuration
  136. shell: lxc-attach -n {{ vm_name }} --clear-env -e -- bash -c "grep -F 'iface eth0 inet manual' /etc/network/interfaces || sed -i 's/iface eth0 inet dhcp/iface eth0 inet manual/' /etc/network/interfaces"
  137. register: container_network
  138. changed_when: "container_network.stdout != 'iface eth0 inet manual'"
  139. notify: restart container
  140. - name: install packages
  141. shell: lxc-attach -n {{ vm_name }} --clear-env -e -- bash -c "apt-get install python ssh -y"
  142. register: install_packages
  143. changed_when: "install_packages.stdout.find('0 newly installed') == -1"
  144. notify: restart container
  145. - name: lookup user ca key
  146. set_fact:
  147. user_ca_key: "{{ lookup('file', 'test_ssh_ca.pub') }}"
  148. - name: Update container user CA key
  149. container_file_write:
  150. name: "{{ vm_name }}"
  151. path: "/etc/ssh/user_ca.pub"
  152. text: "ssh-rsa {{ user_ca_key }}"
  153. - name: trust user ca key
  154. shell: lxc-attach -n {{ vm_name }} --clear-env -e -- bash -c "grep -F 'TrustedUserCAKeys /etc/ssh/user_ca.pub' /etc/ssh/sshd_config || echo 'TrustedUserCAKeys /etc/ssh/user_ca.pub' >> /etc/ssh/sshd_config"
  155. register: trust_ca_key
  156. changed_when: "trust_ca_key.stdout != 'TrustedUserCAKeys /etc/ssh/user_ca.pub'"
  157. notify: restart container
  158. # Restart container when one in
  159. # - container_dns_configuration
  160. # - network conf has changed
  161. # - set_pub_key
  162. # - install_packages
  163. # - trust_ca_key
  164. # - container_network
  165. # is changed by executing handlers now
  166. - meta: flush_handlers
  167. - name: "waiting for ssh on {{ vm_name }} vm to start"
  168. wait_for:
  169. host: "{{ hostvars[vm_name]['ansible_host'] }}"
  170. port: 22
  171. timeout: 30
  172. delegate_to: "{{ inventory_hostname }}"
  173. delegate_facts: True
  174. - pause: seconds=20