main.yml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. ---
  2. # TODO: add ability to configure certificates given either a local file to
  3. # point to or certificate contents, set in default cert locations.
  4. # Authentication Variable Validation
  5. # TODO: validate the different identity provider kinds as well
  6. - fail:
  7. msg: >
  8. Invalid OAuth grant method: {{ openshift_master_oauth_grant_method }}
  9. when: openshift_master_oauth_grant_method is defined and openshift_master_oauth_grant_method not in openshift_master_valid_grant_methods
  10. # Session Options Validation
  11. - fail:
  12. msg: >
  13. Both openshift_master_session_auth_secrets and openshift_master_session_encryption_secrets must be provided if either variable is set
  14. when: (openshift_master_session_auth_secrets is defined and openshift_master_session_encryption_secrets is not defined) or (openshift_master_session_encryption_secrets is defined and openshift_master_session_auth_secrets is not defined)
  15. - fail:
  16. msg: >
  17. openshift_master_session_auth_secrets and openshift_master_encryption_secrets must be equal length
  18. when: (openshift_master_session_auth_secrets is defined and openshift_master_session_encryption_secrets is defined) and (openshift_master_session_auth_secrets | length != openshift_master_session_encryption_secrets | length)
  19. - fail:
  20. msg: >
  21. Invalid secret length in openshift_master_session_auth_secrets: secrets must be at least 32 characters
  22. when: openshift_master_session_auth_secrets is defined and not openshift_master_session_auth_secrets | validate_auth_secrets | bool
  23. - fail:
  24. msg: >
  25. Invalid secret length in openshift_master_session_encryption_secrets: secrets must be 16, 24, or 32 characters
  26. when: openshift_master_session_encryption_secrets is defined and not openshift_master_session_encryption_secrets | validate_encryption_secrets | bool
  27. # HA Variable Validation
  28. - fail:
  29. msg: "openshift_master_cluster_method must be set to either 'native' or 'pacemaker' for multi-master installations"
  30. when: openshift_master_ha | bool and ((openshift_master_cluster_method is not defined) or (openshift_master_cluster_method is defined and openshift_master_cluster_method not in ["native", "pacemaker"]))
  31. - fail:
  32. msg: "'native' high availability is not supported for the requested OpenShift version"
  33. when: openshift_master_ha | bool and openshift_master_cluster_method == "native" and not openshift.common.version_greater_than_3_1_or_1_1 | bool
  34. - fail:
  35. msg: "openshift_master_cluster_password must be set for multi-master installations"
  36. when: openshift_master_ha | bool and openshift_master_cluster_method == "pacemaker" and (openshift_master_cluster_password is not defined or not openshift_master_cluster_password)
  37. - fail:
  38. msg: "Pacemaker based HA is not supported at this time when used with containerized installs"
  39. when: openshift_master_ha | bool and openshift_master_cluster_method == "pacemaker" and openshift.common.is_containerized | bool
  40. - name: Set master facts
  41. openshift_facts:
  42. role: master
  43. local_facts:
  44. cluster_method: "{{ openshift_master_cluster_method | default(None) }}"
  45. cluster_hostname: "{{ openshift_master_cluster_hostname | default(None) }}"
  46. cluster_public_hostname: "{{ openshift_master_cluster_public_hostname | default(None) }}"
  47. debug_level: "{{ openshift_master_debug_level | default(openshift.common.debug_level) }}"
  48. api_port: "{{ openshift_master_api_port | default(None) }}"
  49. api_url: "{{ openshift_master_api_url | default(None) }}"
  50. api_use_ssl: "{{ openshift_master_api_use_ssl | default(None) }}"
  51. public_api_url: "{{ openshift_master_public_api_url | default(None) }}"
  52. console_path: "{{ openshift_master_console_path | default(None) }}"
  53. console_port: "{{ openshift_master_console_port | default(None) }}"
  54. console_url: "{{ openshift_master_console_url | default(None) }}"
  55. console_use_ssl: "{{ openshift_master_console_use_ssl | default(None) }}"
  56. public_console_url: "{{ openshift_master_public_console_url | default(None) }}"
  57. logging_public_url: "{{ openshift_master_logging_public_url | default(None) }}"
  58. metrics_public_url: "{{ openshift_master_metrics_public_url | default(None) }}"
  59. etcd_hosts: "{{ openshift_master_etcd_hosts | default(None)}}"
  60. etcd_port: "{{ openshift_master_etcd_port | default(None) }}"
  61. etcd_use_ssl: "{{ openshift_master_etcd_use_ssl | default(None) }}"
  62. etcd_urls: "{{ openshift_master_etcd_urls | default(None) }}"
  63. embedded_etcd: "{{ openshift_master_embedded_etcd | default(None) }}"
  64. embedded_kube: "{{ openshift_master_embedded_kube | default(None) }}"
  65. embedded_dns: "{{ openshift_master_embedded_dns | default(None) }}"
  66. dns_port: "{{ openshift_master_dns_port | default(None) }}"
  67. bind_addr: "{{ openshift_master_bind_addr | default(None) }}"
  68. portal_net: "{{ openshift_master_portal_net | default(None) }}"
  69. session_max_seconds: "{{ openshift_master_session_max_seconds | default(None) }}"
  70. session_name: "{{ openshift_master_session_name | default(None) }}"
  71. session_secrets_file: "{{ openshift_master_session_secrets_file | default(None) }}"
  72. session_auth_secrets: "{{ openshift_master_session_auth_secrets | default(None) }}"
  73. session_encryption_secrets: "{{ openshift_master_session_encryption_secrets | default(None) }}"
  74. access_token_max_seconds: "{{ openshift_master_access_token_max_seconds | default(None) }}"
  75. auth_token_max_seconds: "{{ openshift_master_auth_token_max_seconds | default(None) }}"
  76. identity_providers: "{{ openshift_master_identity_providers | default(None) }}"
  77. registry_url: "{{ oreg_url | default(None) }}"
  78. oauth_grant_method: "{{ openshift_master_oauth_grant_method | default(None) }}"
  79. sdn_cluster_network_cidr: "{{ osm_cluster_network_cidr | default(None) }}"
  80. sdn_host_subnet_length: "{{ osm_host_subnet_length | default(None) }}"
  81. default_subdomain: "{{ osm_default_subdomain | default(None) }}"
  82. custom_cors_origins: "{{ osm_custom_cors_origins | default(None) }}"
  83. default_node_selector: "{{ osm_default_node_selector | default(None) }}"
  84. project_request_message: "{{ osm_project_request_message | default(None) }}"
  85. project_request_template: "{{ osm_project_request_template | default(None) }}"
  86. mcs_allocator_range: "{{ osm_mcs_allocator_range | default(None) }}"
  87. mcs_labels_per_project: "{{ osm_mcs_labels_per_project | default(None) }}"
  88. uid_allocator_range: "{{ osm_uid_allocator_range | default(None) }}"
  89. router_selector: "{{ openshift_router_selector | default(None) }}"
  90. registry_selector: "{{ openshift_registry_selector | default(None) }}"
  91. api_server_args: "{{ osm_api_server_args | default(None) }}"
  92. controller_args: "{{ osm_controller_args | default(None) }}"
  93. infra_nodes: "{{ num_infra | default(None) }}"
  94. disabled_features: "{{ osm_disabled_features | default(None) }}"
  95. master_count: "{{ openshift_master_count | default(None) }}"
  96. controller_lease_ttl: "{{ osm_controller_lease_ttl | default(None) }}"
  97. master_image: "{{ osm_image | default(None) }}"
  98. - name: Install Master package
  99. action: "{{ ansible_pkg_mgr }} name={{ openshift.common.service_type }}-master{{ openshift_version }} state=present"
  100. when: not openshift.common.is_containerized | bool
  101. - name: Get docker images
  102. command: docker images
  103. changed_when: false
  104. when: openshift.common.is_containerized | bool
  105. register: docker_images
  106. - name: Pull master image
  107. command: >
  108. docker pull {{ openshift.master.master_image }}
  109. when: openshift.common.is_containerized | bool and openshift.master.master_image not in docker_images.stdout
  110. - name: Wait for master image
  111. command: >
  112. docker images
  113. register: docker_images
  114. until: openshift.master.master_image in docker_images.stdout
  115. retries: 30
  116. delay: 10
  117. changed_when: false
  118. when: openshift.common.is_containerized | bool
  119. - name: Install Master docker service file
  120. template:
  121. dest: "/etc/systemd/system/{{ openshift.common.service_type }}-master.service"
  122. src: master.docker.service.j2
  123. register: install_result
  124. when: openshift.common.is_containerized | bool and not openshift_master_ha | bool
  125. - name: Create openshift.common.data_dir
  126. file:
  127. path: "{{ openshift.common.data_dir }}"
  128. state: directory
  129. mode: 0755
  130. owner: root
  131. group: root
  132. when: openshift.common.is_containerized | bool
  133. - name: Reload systemd units
  134. command: systemctl daemon-reload
  135. when: openshift.common.is_containerized | bool and install_result | changed
  136. - name: Re-gather package dependent master facts
  137. openshift_facts:
  138. - name: Create config parent directory if it does not exist
  139. file:
  140. path: "{{ openshift_master_config_dir }}"
  141. state: directory
  142. - name: Create the policy file if it does not already exist
  143. command: >
  144. {{ openshift.common.admin_binary }} create-bootstrap-policy-file
  145. --filename={{ openshift_master_policy }}
  146. args:
  147. creates: "{{ openshift_master_policy }}"
  148. notify:
  149. - restart master
  150. - restart master api
  151. - restart master controllers
  152. - name: Create the scheduler config
  153. template:
  154. dest: "{{ openshift_master_scheduler_conf }}"
  155. src: scheduler.json.j2
  156. backup: true
  157. notify:
  158. - restart master
  159. - restart master api
  160. - restart master controllers
  161. - name: Install httpd-tools if needed
  162. action: "{{ ansible_pkg_mgr }} name=httpd-tools state=present"
  163. when: (item.kind == 'HTPasswdPasswordIdentityProvider') and
  164. not openshift.common.is_atomic | bool
  165. with_items: openshift.master.identity_providers
  166. - name: Ensure htpasswd directory exists
  167. file:
  168. path: "{{ item.filename | dirname }}"
  169. state: directory
  170. when: item.kind == 'HTPasswdPasswordIdentityProvider'
  171. with_items: openshift.master.identity_providers
  172. - name: Create the htpasswd file if needed
  173. copy:
  174. dest: "{{ item.filename }}"
  175. content: ""
  176. mode: 0600
  177. force: no
  178. when: item.kind == 'HTPasswdPasswordIdentityProvider'
  179. with_items: openshift.master.identity_providers
  180. - name: Init HA Service Info
  181. set_fact:
  182. ha_suffix: ""
  183. ha_svcdir: "/usr/lib/systemd/system"
  184. - name: Set HA Service Info for containerized installs
  185. set_fact:
  186. ha_suffix: ".docker"
  187. ha_svcdir: "/etc/systemd/system"
  188. when: openshift.common.is_containerized | bool
  189. # workaround for missing systemd unit files for controllers/api
  190. - name: Create the api service file
  191. template:
  192. src: atomic-openshift-master-api{{ ha_suffix }}.service.j2
  193. dest: "{{ ha_svcdir }}/{{ openshift.common.service_type }}-master-api.service"
  194. when: openshift_master_ha | bool and openshift_master_cluster_method == "native"
  195. - name: Create the controllers service file
  196. template:
  197. src: atomic-openshift-master-controllers{{ ha_suffix }}.service.j2
  198. dest: "{{ ha_svcdir }}/{{ openshift.common.service_type }}-master-controllers.service"
  199. when: openshift_master_ha | bool and openshift_master_cluster_method == "native"
  200. - name: Create the api env file
  201. template:
  202. src: atomic-openshift-master-api.j2
  203. dest: /etc/sysconfig/{{ openshift.common.service_type }}-master-api
  204. force: no
  205. when: openshift_master_ha | bool and openshift_master_cluster_method == "native"
  206. - name: Create the controllers env file
  207. template:
  208. src: atomic-openshift-master-controllers.j2
  209. dest: /etc/sysconfig/{{ openshift.common.service_type }}-master-controllers
  210. force: no
  211. when: openshift_master_ha | bool and openshift_master_cluster_method == "native"
  212. - command: systemctl daemon-reload
  213. when: openshift_master_ha | bool and openshift_master_cluster_method == "native"
  214. # end workaround for missing systemd unit files
  215. - name: Create session secrets file
  216. template:
  217. dest: "{{ openshift.master.session_secrets_file }}"
  218. src: sessionSecretsFile.yaml.v1.j2
  219. when: openshift.master.session_auth_secrets is defined and openshift.master.session_encryption_secrets is defined
  220. notify:
  221. - restart master
  222. - restart master api
  223. - set_fact:
  224. translated_identity_providers: "{{ openshift.master.identity_providers | translate_idps('v1') }}"
  225. # TODO: add the validate parameter when there is a validation command to run
  226. - name: Create master config
  227. template:
  228. dest: "{{ openshift_master_config_file }}"
  229. src: master.yaml.v1.j2
  230. backup: true
  231. notify:
  232. - restart master
  233. - restart master api
  234. - restart master controllers
  235. - name: Configure master settings
  236. lineinfile:
  237. dest: /etc/sysconfig/{{ openshift.common.service_type }}-master
  238. regexp: "{{ item.regex }}"
  239. line: "{{ item.line }}"
  240. create: yes
  241. with_items:
  242. - regex: '^OPTIONS='
  243. line: "OPTIONS=--loglevel={{ openshift.master.debug_level }}"
  244. - regex: '^CONFIG_FILE='
  245. line: "CONFIG_FILE={{ openshift_master_config_file }}"
  246. notify:
  247. - restart master
  248. - name: Configure master api settings
  249. lineinfile:
  250. dest: /etc/sysconfig/{{ openshift.common.service_type }}-master-api
  251. regexp: "{{ item.regex }}"
  252. line: "{{ item.line }}"
  253. with_items:
  254. - regex: '^OPTIONS='
  255. line: "OPTIONS=--loglevel={{ openshift.master.debug_level }} --listen=https://0.0.0.0:8443 --master=https://{{ openshift.common.ip }}:8443"
  256. - regex: '^CONFIG_FILE='
  257. line: "CONFIG_FILE={{ openshift_master_config_file }}"
  258. when: openshift_master_ha | bool and openshift_master_cluster_method == "native"
  259. notify:
  260. - restart master api
  261. - name: Configure master controller settings
  262. lineinfile:
  263. dest: /etc/sysconfig/{{ openshift.common.service_type }}-master-controllers
  264. regexp: "{{ item.regex }}"
  265. line: "{{ item.line }}"
  266. with_items:
  267. - regex: '^OPTIONS='
  268. line: "OPTIONS=--loglevel={{ openshift.master.debug_level }} --listen=https://0.0.0.0:8444"
  269. - regex: '^CONFIG_FILE='
  270. line: "CONFIG_FILE={{ openshift_master_config_file }}"
  271. when: openshift_master_ha | bool and openshift_master_cluster_method == "native"
  272. notify:
  273. - restart master controllers
  274. - name: Start and enable master
  275. service: name={{ openshift.common.service_type }}-master enabled=yes state=started
  276. when: not openshift_master_ha | bool
  277. register: start_result
  278. - name: Stop and disable non HA master when running HA
  279. service: name={{ openshift.common.service_type }}-master enabled=no state=stopped
  280. when: openshift_master_ha | bool
  281. - set_fact:
  282. master_service_status_changed: "{{ start_result | changed }}"
  283. when: not openshift_master_ha | bool
  284. - name: Start and enable master api
  285. service: name={{ openshift.common.service_type }}-master-api enabled=yes state=started
  286. when: openshift_master_ha | bool and openshift.master.cluster_method == 'native'
  287. register: start_result
  288. - set_fact:
  289. master_api_service_status_changed: "{{ start_result | changed }}"
  290. when: openshift_master_ha | bool and openshift.master.cluster_method == 'native'
  291. - name: Start and enable master controller
  292. service: name={{ openshift.common.service_type }}-master-controllers enabled=yes state=started
  293. when: openshift_master_ha | bool and openshift.master.cluster_method == 'native'
  294. register: start_result
  295. - set_fact:
  296. master_controllers_service_status_changed: "{{ start_result | changed }}"
  297. when: openshift_master_ha | bool and openshift.master.cluster_method == 'native'
  298. - name: Install cluster packages
  299. action: "{{ ansible_pkg_mgr }} name=pcs state=present"
  300. when: openshift_master_ha | bool and openshift.master.cluster_method == 'pacemaker'
  301. and not openshift.common.is_containerized | bool
  302. register: install_result
  303. - name: Start and enable cluster service
  304. service: name=pcsd enabled=yes state=started
  305. when: openshift_master_ha | bool and openshift.master.cluster_method == 'pacemaker'
  306. and not openshift.common.is_containerized | bool
  307. - name: Set the cluster user password
  308. shell: echo {{ openshift_master_cluster_password | quote }} | passwd --stdin hacluster
  309. when: install_result | changed
  310. - name: Lookup default group for ansible_ssh_user
  311. command: "/usr/bin/id -g {{ ansible_ssh_user }}"
  312. changed_when: false
  313. register: _ansible_ssh_user_gid
  314. - name: Create the client config dir(s)
  315. file:
  316. path: "~{{ item }}/.kube"
  317. state: directory
  318. mode: 0700
  319. owner: "{{ item }}"
  320. group: "{{ 'root' if item == 'root' else _ansible_ssh_user_gid.stdout }}"
  321. with_items:
  322. - root
  323. - "{{ ansible_ssh_user }}"
  324. # TODO: Update this file if the contents of the source file are not present in
  325. # the dest file, will need to make sure to ignore things that could be added
  326. - name: Copy the admin client config(s)
  327. command: cp {{ openshift_master_config_dir }}/admin.kubeconfig ~{{ item }}/.kube/config
  328. args:
  329. creates: ~{{ item }}/.kube/config
  330. with_items:
  331. - root
  332. - "{{ ansible_ssh_user }}"
  333. - name: Update the permissions on the admin client config(s)
  334. file:
  335. path: "~{{ item }}/.kube/config"
  336. state: file
  337. mode: 0700
  338. owner: "{{ item }}"
  339. group: "{{ 'root' if item == 'root' else _ansible_ssh_user_gid.stdout }}"
  340. with_items:
  341. - root
  342. - "{{ ansible_ssh_user }}"