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.

253 lines
8.8 KiB

9 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
  1. ---
  2. - name: check if atomic host
  3. stat:
  4. path: /run/ostree-booted
  5. register: ostree
  6. - name: set is_atomic
  7. set_fact:
  8. is_atomic: "{{ ostree.stat.exists }}"
  9. - name: gather os specific variables
  10. include_vars: "{{ item }}"
  11. with_first_found:
  12. - files:
  13. - "{{ ansible_distribution|lower }}-{{ ansible_distribution_version|lower|replace('/', '_') }}.yml"
  14. - "{{ ansible_distribution|lower }}-{{ ansible_distribution_release|lower }}-{{ host_architecture }}.yml"
  15. - "{{ ansible_distribution|lower }}-{{ ansible_distribution_release|lower }}.yml"
  16. - "{{ ansible_distribution|lower }}-{{ ansible_distribution_major_version|lower|replace('/', '_') }}.yml"
  17. - "{{ ansible_distribution|lower }}-{{ host_architecture }}.yml"
  18. - "{{ ansible_distribution|lower }}.yml"
  19. - "{{ ansible_os_family|lower }}-{{ host_architecture }}.yml"
  20. - "{{ ansible_os_family|lower }}.yml"
  21. - defaults.yml
  22. paths:
  23. - ../vars
  24. skip: true
  25. tags:
  26. - facts
  27. # https://yum.dockerproject.org/repo/main/opensuse/ contains packages for an EOL
  28. # openSUSE version so we can't use it. The only alternative is to use the docker
  29. # packages from the distribution repositories.
  30. - name: Warn about Docker version on SUSE
  31. debug:
  32. msg: "SUSE distributions always install Docker from the distro repos"
  33. when: ansible_pkg_mgr == 'zypper'
  34. - include_tasks: set_facts_dns.yml
  35. when: dns_mode != 'none' and resolvconf_mode == 'docker_dns'
  36. tags:
  37. - facts
  38. - name: check for minimum kernel version
  39. fail:
  40. msg: >
  41. docker requires a minimum kernel version of
  42. {{ docker_kernel_min_version }} on
  43. {{ ansible_distribution }}-{{ ansible_distribution_version }}
  44. when: (not ansible_os_family in ["CoreOS", "Container Linux by CoreOS", "ClearLinux"]) and (ansible_kernel is version(docker_kernel_min_version, "<"))
  45. tags:
  46. - facts
  47. - import_tasks: pre-upgrade.yml
  48. - name: ensure docker-ce repository public key is installed
  49. action: "{{ docker_repo_key_info.pkg_key }}"
  50. args:
  51. id: "{{ item }}"
  52. url: "{{ docker_repo_key_info.url }}"
  53. state: present
  54. register: keyserver_task_result
  55. until: keyserver_task_result is succeeded
  56. retries: 4
  57. delay: "{{ retry_stagger | d(3) }}"
  58. with_items: "{{ docker_repo_key_info.repo_keys }}"
  59. when: not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS", "RedHat", "Suse", "ClearLinux"] or is_atomic)
  60. - name: ensure docker-ce repository is enabled
  61. action: "{{ docker_repo_info.pkg_repo }}"
  62. args:
  63. repo: "{{ item }}"
  64. state: present
  65. with_items: "{{ docker_repo_info.repos }}"
  66. when: not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS", "RedHat", "Suse", "ClearLinux"] or is_atomic) and (docker_repo_info.repos|length > 0)
  67. - name: ensure docker-engine repository public key is installed
  68. action: "{{ dockerproject_repo_key_info.pkg_key }}"
  69. args:
  70. id: "{{ item }}"
  71. url: "{{ dockerproject_repo_key_info.url }}"
  72. state: present
  73. register: keyserver_task_result
  74. until: keyserver_task_result is succeeded
  75. retries: 4
  76. delay: "{{ retry_stagger | d(3) }}"
  77. with_items: "{{ dockerproject_repo_key_info.repo_keys }}"
  78. when:
  79. - not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS", "RedHat", "Suse", "ClearLinux"] or is_atomic)
  80. - use_docker_engine is defined and use_docker_engine
  81. - name: ensure docker-engine repository is enabled
  82. action: "{{ dockerproject_repo_info.pkg_repo }}"
  83. args:
  84. repo: "{{ item }}"
  85. state: present
  86. with_items: "{{ dockerproject_repo_info.repos }}"
  87. when:
  88. - use_docker_engine is defined and use_docker_engine
  89. - not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS", "RedHat", "Suse", "ClearLinux"] or is_atomic) and (dockerproject_repo_info.repos|length > 0)
  90. - name: Configure docker repository on Fedora
  91. template:
  92. src: "fedora_docker.repo.j2"
  93. dest: "{{ yum_repo_dir }}/docker.repo"
  94. when: ansible_distribution == "Fedora" and not is_atomic
  95. - name: Configure docker repository on RedHat/CentOS/Oracle Linux
  96. template:
  97. src: "rh_docker.repo.j2"
  98. dest: "{{ yum_repo_dir }}/docker.repo"
  99. when: ansible_distribution in ["CentOS","RedHat","OracleLinux"] and not is_atomic
  100. - name: check if container-selinux is available
  101. yum:
  102. list: "container-selinux"
  103. register: yum_result
  104. when: ansible_distribution in ["CentOS","RedHat"] and not is_atomic
  105. - name: Configure extras repository on RedHat/CentOS if container-selinux is not available in current repos
  106. yum_repository:
  107. name: extras
  108. description: "CentOS-7 - Extras"
  109. state: present
  110. baseurl: "{{ extras_rh_repo_base_url }}"
  111. file: "extras"
  112. gpgcheck: yes
  113. gpgkey: "{{ extras_rh_repo_gpgkey }}"
  114. keepcache: "{{ docker_rpm_keepcache | default('1') }}"
  115. proxy: " {{ http_proxy | default('_none_') }}"
  116. when:
  117. - ansible_distribution in ["CentOS","RedHat"] and not is_atomic
  118. - yum_result.results | length == 0
  119. - name: Copy yum.conf for editing
  120. copy:
  121. src: "{{ yum_conf }}"
  122. dest: "{{ docker_yum_conf }}"
  123. remote_src: yes
  124. when: ansible_distribution in ["CentOS","RedHat","OracleLinux"] and not is_atomic
  125. - name: Edit copy of yum.conf to set obsoletes=0
  126. lineinfile:
  127. path: "{{ docker_yum_conf }}"
  128. state: present
  129. regexp: '^obsoletes='
  130. line: 'obsoletes=0'
  131. when: ansible_distribution in ["CentOS","RedHat","OracleLinux"] and not is_atomic
  132. - name: ensure docker packages are installed
  133. action: "{{ docker_package_info.pkg_mgr }}"
  134. args:
  135. pkg: "{{ item.name }}"
  136. force: "{{ item.force|default(omit) }}"
  137. conf_file: "{{ item.yum_conf|default(omit) }}"
  138. state: "{{ item.state | default('present') }}"
  139. update_cache: "{{ omit if ansible_distribution == 'Fedora' else True }}"
  140. register: docker_task_result
  141. until: docker_task_result is succeeded
  142. retries: 4
  143. delay: "{{ retry_stagger | d(3) }}"
  144. with_items: "{{ docker_package_info.pkgs }}"
  145. notify: restart docker
  146. when: not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS", "ClearLinux"] or is_atomic) and (docker_package_info.pkgs|length > 0)
  147. ignore_errors: true
  148. - name: Ensure docker packages are installed
  149. action: "{{ docker_package_info.pkg_mgr }}"
  150. args:
  151. name: "{{ item.name }}"
  152. state: "{{ item.state | default('present') }}"
  153. with_items: "{{ docker_package_info.pkgs }}"
  154. register: docker_task_result
  155. until: docker_task_result is succeeded
  156. retries: 4
  157. delay: "{{ retry_stagger | d(3) }}"
  158. notify: restart docker
  159. ignore_errors: true
  160. when: ansible_os_family in ["ClearLinux"]
  161. - name: get available packages on Ubuntu
  162. command: apt-cache policy docker-ce
  163. when:
  164. - docker_task_result is failed
  165. - ansible_distribution == 'Ubuntu'
  166. register: available_packages
  167. - name: show available packages on ubuntu
  168. fail:
  169. msg: "{{ available_packages }}"
  170. when:
  171. - docker_task_result is failed
  172. - ansible_distribution == 'Ubuntu'
  173. # This is required to ensure any apt upgrade will not break kubernetes
  174. - name: Tell Debian hosts not to change the docker version with apt upgrade
  175. dpkg_selections:
  176. name: docker-ce
  177. selection: hold
  178. when: ansible_os_family in ["Debian"]
  179. - name: ensure docker started, remove our config if docker start failed and try again
  180. block:
  181. - name: ensure service is started if docker packages are already present
  182. service:
  183. name: docker
  184. state: started
  185. when: docker_task_result is not changed
  186. rescue:
  187. - debug:
  188. msg: "Docker start failed. Try to remove our config"
  189. - name: remove kubespray generated config
  190. file:
  191. path: "{{ item }}"
  192. state: absent
  193. with_items:
  194. - /etc/systemd/system/docker.service.d/http-proxy.conf
  195. - /etc/systemd/system/docker.service.d/docker-options.conf
  196. - /etc/systemd/system/docker.service.d/docker-dns.conf
  197. - /etc/systemd/system/docker.service.d/docker-orphan-cleanup.conf
  198. notify: restart docker
  199. - name: flush handlers so we can wait for docker to come up
  200. meta: flush_handlers
  201. - name: set fact for docker_version
  202. command: "docker version -f '{{ '{{' }}.Client.Version{{ '}}' }}'"
  203. register: installed_docker_version
  204. changed_when: false
  205. - name: check minimum docker version for docker_dns mode. You need at least docker version >= 1.12 for resolvconf_mode=docker_dns
  206. fail:
  207. msg: "You need at least docker version >= 1.12 for resolvconf_mode=docker_dns"
  208. when: >
  209. dns_mode != 'none' and
  210. resolvconf_mode == 'docker_dns' and
  211. installed_docker_version.stdout is version('1.12', '<')
  212. # Install each plugin using a looped include to make error handling in the included task simpler.
  213. - include_tasks: docker_plugin.yml
  214. loop: "{{ docker_plugins }}"
  215. loop_control:
  216. loop_var: docker_plugin
  217. - name: Set docker systemd config
  218. import_tasks: systemd.yml
  219. - name: ensure docker service is started and enabled
  220. service:
  221. name: "{{ item }}"
  222. enabled: yes
  223. state: started
  224. with_items:
  225. - docker