main.yaml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. ---
  2. - name: Validate Elasticsearch cluster size
  3. fail: msg="The openshift_logging_es_cluster_size may only be scaled down manually. Please see official documentation on how to do this."
  4. when: openshift_logging_facts.elasticsearch.deploymentconfigs | length > openshift_logging_es_cluster_size|int
  5. - name: Validate Elasticsearch Ops cluster size
  6. fail: msg="The openshift_logging_es_ops_cluster_size may only be scaled down manually. Please see official documentation on how to do this."
  7. when: openshift_logging_facts.elasticsearch_ops.deploymentconfigs | length > openshift_logging_es_ops_cluster_size|int
  8. - fail:
  9. msg: Invalid deployment type, one of ['data-master', 'data-client', 'master', 'client'] allowed
  10. when: not openshift_logging_elasticsearch_deployment_type in __allowed_es_types
  11. - set_fact:
  12. elasticsearch_name: "{{ 'logging-elasticsearch' ~ ( (openshift_logging_elasticsearch_ops_deployment | default(false) | bool) | ternary('-ops', '')) }}"
  13. es_component: "{{ 'es' ~ ( (openshift_logging_elasticsearch_ops_deployment | default(false) | bool) | ternary('-ops', '') ) }}"
  14. - name: Set default image variables based on openshift_deployment_type
  15. include_vars: "{{ var_file_name }}"
  16. with_first_found:
  17. - "{{ openshift_deployment_type }}.yml"
  18. - "default_images.yml"
  19. loop_control:
  20. loop_var: var_file_name
  21. - name: Set elasticsearch image facts
  22. set_fact:
  23. openshift_logging_elasticsearch_proxy_image_prefix: "{{ openshift_logging_elasticsearch_proxy_image_prefix | default(__openshift_logging_elasticsearch_proxy_image_prefix) }}"
  24. openshift_logging_elasticsearch_proxy_image_version: "{{ openshift_logging_elasticsearch_proxy_image_version | default(__openshift_logging_elasticsearch_proxy_image_version) }}"
  25. openshift_logging_elasticsearch_image_prefix: "{{ openshift_logging_elasticsearch_image_prefix | default(__openshift_logging_elasticsearch_image_prefix) }}"
  26. openshift_logging_elasticsearch_image_version: "{{ openshift_logging_elasticsearch_image_version | default(__openshift_logging_elasticsearch_image_version) }}"
  27. - include_tasks: determine_version.yaml
  28. - set_fact:
  29. full_restart_cluster: True
  30. when:
  31. - _es_installed_version is defined
  32. - _es_installed_version.split('.')[0] | int < __es_version.split('.')[0] | int
  33. - set_fact:
  34. full_restart_cluster: True
  35. when:
  36. - _es_ops_installed_version is defined
  37. - _es_ops_installed_version.split('.')[0] | int < __es_version.split('.')[0] | int
  38. # allow passing in a tempdir
  39. - name: Create temp directory for doing work in
  40. command: mktemp -d /tmp/openshift-logging-ansible-XXXXXX
  41. register: mktemp
  42. changed_when: False
  43. - set_fact:
  44. tempdir: "{{ mktemp.stdout }}"
  45. # This may not be necessary in this role
  46. - name: Create templates subdirectory
  47. file:
  48. state: directory
  49. path: "{{ tempdir }}/templates"
  50. mode: 0755
  51. changed_when: False
  52. # we want to make sure we have all the necessary components here
  53. # service account
  54. - name: Create ES service account
  55. oc_serviceaccount:
  56. state: present
  57. name: "aggregated-logging-elasticsearch"
  58. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  59. image_pull_secrets: "{{ openshift_logging_image_pull_secret }}"
  60. when: openshift_logging_image_pull_secret != ''
  61. - name: Create ES service account
  62. oc_serviceaccount:
  63. state: present
  64. name: "aggregated-logging-elasticsearch"
  65. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  66. when:
  67. - openshift_logging_image_pull_secret == ''
  68. # rolebinding reader
  69. - copy:
  70. src: rolebinding-reader.yml
  71. dest: "{{ tempdir }}/rolebinding-reader.yml"
  72. - name: Create rolebinding-reader role
  73. oc_obj:
  74. state: present
  75. name: "rolebinding-reader"
  76. kind: clusterrole
  77. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  78. files:
  79. - "{{ tempdir }}/rolebinding-reader.yml"
  80. delete_after: true
  81. # SA roles
  82. - name: Set rolebinding-reader permissions for ES
  83. oc_adm_policy_user:
  84. state: present
  85. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  86. resource_kind: cluster-role
  87. resource_name: rolebinding-reader
  88. user: "system:serviceaccount:{{ openshift_logging_elasticsearch_namespace }}:aggregated-logging-elasticsearch"
  89. - oc_adm_policy_user:
  90. state: present
  91. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  92. resource_kind: cluster-role
  93. resource_name: system:auth-delegator
  94. user: "system:serviceaccount:{{ openshift_logging_elasticsearch_namespace}}:aggregated-logging-elasticsearch"
  95. # logging-metrics-reader role
  96. - template:
  97. src: logging-metrics-role.j2
  98. dest: "{{mktemp.stdout}}/templates/logging-metrics-role.yml"
  99. vars:
  100. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  101. role_namespace: "{{ openshift_logging_elasticsearch_prometheus_sa | serviceaccount_namespace(openshift_logging_elasticsearch_namespace) }}"
  102. role_user: "{{ openshift_logging_elasticsearch_prometheus_sa | serviceaccount_name }}"
  103. - name: Create logging-metrics-reader-role
  104. command: >
  105. {{ openshift_client_binary }}
  106. --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  107. -n "{{ openshift_logging_elasticsearch_namespace }}"
  108. create -f "{{mktemp.stdout}}/templates/logging-metrics-role.yml"
  109. register: prometheus_out
  110. check_mode: no
  111. ignore_errors: yes
  112. - fail:
  113. msg: "There was an error creating the logging-metrics-role and binding: {{prometheus_out}}"
  114. when:
  115. - "prometheus_out.stderr | length > 0"
  116. - "'already exists' not in prometheus_out.stderr"
  117. - set_fact:
  118. _logging_metrics_proxy_passwd: "{{ 16 | lib_utils_oo_random_word | b64encode }}"
  119. - template:
  120. src: passwd.j2
  121. dest: "{{mktemp.stdout}}/passwd.yml"
  122. vars:
  123. logging_user_name: "{{ openshift_logging_elasticsearch_prometheus_sa }}"
  124. logging_user_passwd: "{{ _logging_metrics_proxy_passwd }}"
  125. # View role and binding
  126. - name: Generate logging-elasticsearch-view-role
  127. template:
  128. src: rolebinding.j2
  129. dest: "{{mktemp.stdout}}/logging-elasticsearch-view-role.yaml"
  130. vars:
  131. obj_name: logging-elasticsearch-view-role
  132. roleRef:
  133. name: view
  134. subjects:
  135. - kind: ServiceAccount
  136. name: aggregated-logging-elasticsearch
  137. changed_when: no
  138. - name: Set logging-elasticsearch-view-role role
  139. oc_obj:
  140. state: present
  141. name: "logging-elasticsearch-view-role"
  142. kind: rolebinding
  143. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  144. files:
  145. - "{{ tempdir }}/logging-elasticsearch-view-role.yaml"
  146. delete_after: true
  147. # configmap
  148. - assert:
  149. that:
  150. - openshift_logging_elasticsearch_kibana_index_mode in __kibana_index_modes
  151. msg: "The openshift_logging_elasticsearch_kibana_index_mode '{{ openshift_logging_elasticsearch_kibana_index_mode }}' only supports one of: {{ __kibana_index_modes | join(', ') }}"
  152. - assert:
  153. that:
  154. - "{{ openshift_logging_es_log_appenders | length > 0 }}"
  155. msg: "The openshift_logging_es_log_appenders '{{ openshift_logging_es_log_appenders }}' has an unrecognized option and only supports the following as a list: {{ __es_log_appenders | join(', ') }}"
  156. - template:
  157. src: elasticsearch-logging.yml.j2
  158. dest: "{{ tempdir }}/elasticsearch-logging.yml"
  159. vars:
  160. root_logger: "{{openshift_logging_es_log_appenders | join(', ')}}"
  161. when: es_logging_contents is undefined
  162. changed_when: no
  163. - template:
  164. src: elasticsearch.yml.j2
  165. dest: "{{ tempdir }}/elasticsearch.yml"
  166. vars:
  167. allow_cluster_reader: "{{ openshift_logging_elasticsearch_ops_allow_cluster_reader | lower | default('false') }}"
  168. es_number_of_shards: "{{ openshift_logging_es_number_of_shards | default(1) }}"
  169. es_number_of_replicas: "{{ openshift_logging_es_number_of_replicas| default(0) }}"
  170. es_kibana_index_mode: "{{ openshift_logging_elasticsearch_kibana_index_mode | default('unique') }}"
  171. when: es_config_contents is undefined
  172. changed_when: no
  173. # create diff between current configmap files and our current files
  174. # NOTE: include_role must be used instead of import_role because
  175. # this task file is looped over from another role.
  176. - include_role:
  177. name: openshift_logging
  178. tasks_from: patch_configmap_files.yaml
  179. vars:
  180. configmap_name: "logging-elasticsearch"
  181. configmap_namespace: "logging"
  182. configmap_file_names:
  183. - current_file: "elasticsearch.yml"
  184. new_file: "{{ tempdir }}/elasticsearch.yml"
  185. protected_lines: ["number_of_shards", "number_of_replicas"]
  186. - current_file: "logging.yml"
  187. new_file: "{{ tempdir }}/elasticsearch-logging.yml"
  188. - name: Set ES configmap
  189. oc_configmap:
  190. state: present
  191. name: "{{ elasticsearch_name }}"
  192. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  193. from_file:
  194. elasticsearch.yml: "{{ tempdir }}/elasticsearch.yml"
  195. logging.yml: "{{ tempdir }}/elasticsearch-logging.yml"
  196. register: es_config_creation
  197. notify: "restart elasticsearch"
  198. - when: es_config_creation.changed | bool
  199. block:
  200. - set_fact:
  201. _restart_logging_components: "{{ _restart_logging_components | default([]) + [es_component] | unique }}"
  202. - shell: >
  203. oc get dc -l component="{{ es_component }}" -n "{{ openshift_logging_elasticsearch_namespace }}" -o name | cut -d'/' -f2
  204. register: _es_dcs
  205. - set_fact:
  206. _restart_logging_nodes: "{{ _restart_logging_nodes | default([]) + [_es_dcs.stdout] | unique }}"
  207. when: _es_dcs.stdout != ""
  208. # secret
  209. - name: Set ES secret
  210. oc_secret:
  211. state: present
  212. name: "logging-elasticsearch"
  213. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  214. files:
  215. - name: key
  216. path: "{{ generated_certs_dir }}/logging-es.jks"
  217. - name: truststore
  218. path: "{{ generated_certs_dir }}/truststore.jks"
  219. - name: searchguard.key
  220. path: "{{ generated_certs_dir }}/elasticsearch.jks"
  221. - name: searchguard.truststore
  222. path: "{{ generated_certs_dir }}/truststore.jks"
  223. - name: admin-key
  224. path: "{{ generated_certs_dir }}/system.admin.key"
  225. - name: admin-cert
  226. path: "{{ generated_certs_dir }}/system.admin.crt"
  227. - name: admin-ca
  228. path: "{{ generated_certs_dir }}/ca.crt"
  229. - name: admin.jks
  230. path: "{{ generated_certs_dir }}/system.admin.jks"
  231. - name: passwd.yml
  232. path: "{{mktemp.stdout}}/passwd.yml"
  233. # services
  234. - name: Set logging-{{ es_component }}-cluster service
  235. oc_service:
  236. state: present
  237. name: "logging-{{ es_component }}-cluster"
  238. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  239. selector:
  240. component: "{{ es_component }}"
  241. provider: openshift
  242. labels:
  243. logging-infra: 'support'
  244. ports:
  245. - port: 9300
  246. - name: Set logging-{{ es_component }} service
  247. oc_service:
  248. state: present
  249. name: "logging-{{ es_component }}"
  250. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  251. selector:
  252. component: "{{ es_component }}"
  253. provider: openshift
  254. labels:
  255. logging-infra: 'support'
  256. ports:
  257. - port: 9200
  258. targetPort: "restapi"
  259. - name: Set logging-{{ es_component}}-prometheus service
  260. oc_service:
  261. state: present
  262. name: "logging-{{es_component}}-prometheus"
  263. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  264. labels:
  265. logging-infra: 'support'
  266. ports:
  267. - name: proxy
  268. port: 443
  269. targetPort: 4443
  270. selector:
  271. component: "{{ es_component }}"
  272. provider: openshift
  273. - oc_edit:
  274. kind: service
  275. name: "logging-{{es_component}}-prometheus"
  276. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  277. separator: '#'
  278. content:
  279. metadata#annotations#service.alpha.openshift.io/serving-cert-secret-name: "prometheus-tls"
  280. metadata#annotations#prometheus.io/scrape: "true"
  281. metadata#annotations#prometheus.io/scheme: "https"
  282. metadata#annotations#prometheus.io/path: "_prometheus/metrics"
  283. - name: Check to see if PVC already exists
  284. oc_obj:
  285. state: list
  286. kind: pvc
  287. name: "{{ openshift_logging_elasticsearch_pvc_name }}"
  288. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  289. register: logging_elasticsearch_pvc
  290. # logging_elasticsearch_pvc.results.results | length > 0 returns a false positive
  291. # so we check for the presence of 'stderr' to determine if the obj exists or not
  292. # the RC for existing and not existing is both 0
  293. - when:
  294. - logging_elasticsearch_pvc.results.stderr is defined
  295. - openshift_logging_elasticsearch_storage_type == "pvc"
  296. block:
  297. # storageclasses are used by default but if static then disable
  298. # storageclasses with the storageClassName set to "" in pvc.j2
  299. - name: Creating ES storage template - static
  300. template:
  301. src: pvc.j2
  302. dest: "{{ tempdir }}/templates/logging-es-pvc.yml"
  303. vars:
  304. obj_name: "{{ openshift_logging_elasticsearch_pvc_name }}"
  305. size: "{{ (openshift_logging_elasticsearch_pvc_size | trim | length == 0) | ternary('10Gi', openshift_logging_elasticsearch_pvc_size) }}"
  306. access_modes: "{{ openshift_logging_elasticsearch_pvc_access_modes | list }}"
  307. pv_selector: "{{ openshift_logging_elasticsearch_pvc_pv_selector }}"
  308. storage_class_name: "{{ openshift_logging_elasticsearch_pvc_storage_class_name | default('', true) }}"
  309. when:
  310. - not openshift_logging_elasticsearch_pvc_dynamic | bool
  311. # Storageclasses are used by default if configured
  312. - name: Creating ES storage template - dynamic
  313. template:
  314. src: pvc.j2
  315. dest: "{{ tempdir }}/templates/logging-es-pvc.yml"
  316. vars:
  317. obj_name: "{{ openshift_logging_elasticsearch_pvc_name }}"
  318. size: "{{ (openshift_logging_elasticsearch_pvc_size | trim | length == 0) | ternary('10Gi', openshift_logging_elasticsearch_pvc_size) }}"
  319. access_modes: "{{ openshift_logging_elasticsearch_pvc_access_modes | list }}"
  320. pv_selector: "{{ openshift_logging_elasticsearch_pvc_pv_selector }}"
  321. when:
  322. - openshift_logging_elasticsearch_pvc_dynamic | bool
  323. - name: Set ES storage
  324. oc_obj:
  325. state: present
  326. kind: pvc
  327. name: "{{ openshift_logging_elasticsearch_pvc_name }}"
  328. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  329. files:
  330. - "{{ tempdir }}/templates/logging-es-pvc.yml"
  331. delete_after: true
  332. - set_fact:
  333. es_deploy_name: "logging-{{ es_component }}-{{ openshift_logging_elasticsearch_deployment_type }}-{{ 8 | lib_utils_oo_random_word('abcdefghijklmnopqrstuvwxyz0123456789') }}"
  334. when: openshift_logging_elasticsearch_deployment_name == ""
  335. - set_fact:
  336. es_deploy_name: "{{ openshift_logging_elasticsearch_deployment_name }}"
  337. when: openshift_logging_elasticsearch_deployment_name != ""
  338. # DC
  339. - name: Set ES dc templates
  340. template:
  341. src: es.j2
  342. dest: "{{ tempdir }}/templates/logging-es-dc.yml"
  343. vars:
  344. es_cluster_name: "{{ es_component }}"
  345. component: "{{ es_component }}"
  346. logging_component: elasticsearch
  347. deploy_name: "{{ es_deploy_name }}"
  348. image: "{{ openshift_logging_elasticsearch_image_prefix }}logging-elasticsearch:{{ openshift_logging_elasticsearch_image_version }}"
  349. proxy_image: "{{ openshift_logging_elasticsearch_proxy_image_prefix }}oauth-proxy:{{ openshift_logging_elasticsearch_proxy_image_version }}"
  350. es_cpu_limit: "{{ openshift_logging_elasticsearch_cpu_limit | default('') }}"
  351. es_cpu_request: "{{ openshift_logging_elasticsearch_cpu_request | min_cpu(openshift_logging_elasticsearch_cpu_limit | default(none)) }}"
  352. es_memory_limit: "{{ openshift_logging_elasticsearch_memory_limit }}"
  353. es_node_selector: "{{ openshift_logging_elasticsearch_nodeselector | default({}) }}"
  354. es_storage_groups: "{{ openshift_logging_elasticsearch_storage_group | default([]) }}"
  355. es_container_security_context: "{{ _es_containers.elasticsearch.securityContext if _es_containers is defined and 'elasticsearch' in _es_containers and 'securityContext' in _es_containers.elasticsearch else None }}"
  356. deploy_type: "{{ openshift_logging_elasticsearch_deployment_type }}"
  357. es_replicas: 1
  358. basic_auth_passwd: "{{ _logging_metrics_proxy_passwd | b64decode }}"
  359. - name: Set ES dc
  360. oc_obj:
  361. state: present
  362. name: "{{ es_deploy_name }}"
  363. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  364. kind: dc
  365. files:
  366. - "{{ tempdir }}/templates/logging-es-dc.yml"
  367. delete_after: true
  368. register: es_dc_creation
  369. notify: "restart elasticsearch"
  370. - set_fact:
  371. _restart_logging_components: "{{ _restart_logging_components | default([]) + [es_component] | unique }}"
  372. _restart_logging_nodes: "{{ _restart_logging_nodes | default([]) + [es_deploy_name] | unique }}"
  373. when: es_dc_creation.changed | bool
  374. - name: Retrieving the cert to use when generating secrets for the {{ es_component }} component
  375. slurp:
  376. src: "{{ generated_certs_dir }}/{{ item.file }}"
  377. register: key_pairs
  378. with_items:
  379. - { name: "ca_file", file: "ca.crt" }
  380. - { name: "es_key", file: "system.logging.es.key" }
  381. - { name: "es_cert", file: "system.logging.es.crt" }
  382. when: openshift_logging_es_allow_external | bool
  383. - set_fact:
  384. es_key: "{{ lookup('file', openshift_logging_es_key) | b64encode }}"
  385. when:
  386. - openshift_logging_es_key | trim | length > 0
  387. - openshift_logging_es_allow_external | bool
  388. changed_when: false
  389. - set_fact:
  390. es_cert: "{{ lookup('file', openshift_logging_es_cert) | b64encode }}"
  391. when:
  392. - openshift_logging_es_cert | trim | length > 0
  393. - openshift_logging_es_allow_external | bool
  394. changed_when: false
  395. - set_fact:
  396. es_ca: "{{ lookup('file', openshift_logging_es_ca_ext) | b64encode }}"
  397. when:
  398. - openshift_logging_es_ca_ext | trim | length > 0
  399. - openshift_logging_es_allow_external | bool
  400. changed_when: false
  401. - set_fact:
  402. es_ca: "{{ key_pairs | entry_from_named_pair('ca_file') }}"
  403. when:
  404. - es_ca is not defined
  405. - openshift_logging_es_allow_external | bool
  406. changed_when: false
  407. - name: Generating Elasticsearch {{ es_component }} route template
  408. template:
  409. src: route_reencrypt.j2
  410. dest: "{{mktemp.stdout}}/templates/logging-{{ es_component }}-route.yaml"
  411. vars:
  412. obj_name: "logging-{{ es_component }}"
  413. route_host: "{{ openshift_logging_es_hostname }}"
  414. service_name: "logging-{{ es_component }}"
  415. tls_key: "{{ es_key | default('') | b64decode }}"
  416. tls_cert: "{{ es_cert | default('') | b64decode }}"
  417. tls_ca_cert: "{{ es_ca | b64decode }}"
  418. tls_dest_ca_cert: "{{ key_pairs | entry_from_named_pair('ca_file') | b64decode }}"
  419. edge_term_policy: "{{ openshift_logging_es_edge_term_policy | default('') }}"
  420. labels:
  421. component: support
  422. logging-infra: support
  423. provider: openshift
  424. changed_when: no
  425. when: openshift_logging_es_allow_external | bool
  426. # This currently has an issue if the host name changes
  427. - name: Setting Elasticsearch {{ es_component }} route
  428. oc_obj:
  429. state: present
  430. name: "logging-{{ es_component }}"
  431. namespace: "{{ openshift_logging_elasticsearch_namespace }}"
  432. kind: route
  433. files:
  434. - "{{ tempdir }}/templates/logging-{{ es_component }}-route.yaml"
  435. when: openshift_logging_es_allow_external | bool
  436. ## Placeholder for migration when necessary ##
  437. - name: Delete temp directory
  438. file:
  439. name: "{{ tempdir }}"
  440. state: absent
  441. changed_when: False