install_grafana.yaml 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. ---
  2. - name: Ensure that Grafana has nodes to run on
  3. import_role:
  4. name: openshift_master
  5. tasks_from: ensure_nodes_matching_selector.yml
  6. vars:
  7. openshift_master_ensure_nodes_selector: "{{ grafana_node_selector | map_to_pairs }}"
  8. openshift_master_ensure_nodes_service: Grafana
  9. - name: Create grafana namespace
  10. oc_project:
  11. state: present
  12. name: "{{ grafana_namespace }}"
  13. node_selector: "{{ grafana_node_selector | lib_utils_oo_selector_to_string_list() }}"
  14. description: Grafana
  15. - name: create grafana_serviceaccount_name serviceaccount
  16. oc_serviceaccount:
  17. state: present
  18. name: "{{ grafana_serviceaccount_name }}"
  19. namespace: "{{ grafana_namespace }}"
  20. changed_when: no
  21. # TODO remove this when annotations are supported by oc_serviceaccount
  22. - name: annotate serviceaccount
  23. command: >
  24. {{ openshift_client_binary }} annotate --overwrite -n {{ grafana_namespace }}
  25. serviceaccount {{ grafana_serviceaccount_name }} {{ item }}
  26. with_items:
  27. "{{ grafana_serviceaccount_annotations }}"
  28. # create clusterrolebinding for prometheus serviceaccount
  29. - name: Set cluster-reader permissions for grafana
  30. oc_adm_policy_user:
  31. state: present
  32. namespace: "{{ grafana_namespace }}"
  33. resource_kind: cluster-role
  34. resource_name: cluster-reader
  35. user: "system:serviceaccount:{{ grafana_namespace }}:{{ grafana_serviceaccount_name }}"
  36. - name: create grafana routes
  37. oc_route:
  38. state: present
  39. name: "{{ item.name }}"
  40. host: "{{ item.host }}"
  41. namespace: "{{ grafana_namespace }}"
  42. service_name: "{{ item.name }}"
  43. tls_termination: reencrypt
  44. with_items:
  45. - name: grafana
  46. host: "{{ grafana_hostname }}"
  47. - name: create services for grafana
  48. oc_service:
  49. name: "{{ grafana_service_name }}"
  50. namespace: "{{ grafana_namespace }}"
  51. labels:
  52. name: grafana
  53. annotations:
  54. prometheus.io/scrape: "true"
  55. prometheus.io/scheme: https
  56. service.alpha.openshift.io/serving-cert-secret-name: grafana-tls
  57. ports:
  58. - name: grafana
  59. port: "{{ grafana_service_port }}"
  60. targetPort: "{{ grafana_service_targetport }}"
  61. protocol: TCP
  62. selector:
  63. app: grafana
  64. - name: Set grafana secrets
  65. oc_secret:
  66. state: present
  67. name: "{{ item }}-proxy"
  68. namespace: "{{ grafana_namespace }}"
  69. contents:
  70. - path: session_secret
  71. data: "{{ 43 | lib_utils_oo_random_word }}="
  72. with_items:
  73. - grafana
  74. # Storage
  75. - name: create grafana pvc
  76. oc_pvc:
  77. namespace: "{{ grafana_namespace }}"
  78. name: "{{ grafana_pvc_name }}"
  79. access_modes: "{{ grafana_pvc_access_modes }}"
  80. volume_capacity: "{{ grafana_pvc_size }}"
  81. selector: "{{ grafana_pvc_pv_selector }}"
  82. storage_class_name: "{{ grafana_sc_name }}"
  83. when: grafana_storage_type == 'pvc'
  84. - name: template grafana components
  85. template:
  86. src: "{{ item }}.j2"
  87. dest: "{{ mktemp.stdout }}/{{ item }}"
  88. changed_when: no
  89. with_items:
  90. - "grafana.yml"
  91. - "grafana-config.yml"
  92. - name: Set grafana configmap
  93. oc_configmap:
  94. state: present
  95. name: "grafana-config"
  96. namespace: "{{ grafana_namespace }}"
  97. from_file:
  98. defaults.ini: "{{ mktemp.stdout }}/grafana-config.yml"
  99. - name: Set grafana deployment
  100. oc_obj:
  101. state: present
  102. name: "grafana"
  103. namespace: "{{ grafana_namespace }}"
  104. kind: deployment
  105. files:
  106. - "{{ mktemp.stdout }}/grafana.yml"
  107. - name: Copy Grafana files
  108. copy:
  109. src: "dashboards/{{ item }}"
  110. dest: "{{ mktemp.stdout }}/{{ item }}"
  111. with_items:
  112. - "{{ grafana_dashboards }}"
  113. - name: Wait for grafana pod
  114. oc_obj:
  115. namespace: "{{ grafana_namespace }}"
  116. kind: pod
  117. state: list
  118. selector: "app=grafana"
  119. register: grafana_pod
  120. until:
  121. - "grafana_pod.results.results[0]['items'] | count > 0"
  122. # Pod's 'Ready' status must be True
  123. - "grafana_pod.results.results[0]['items'] | lib_utils_oo_collect(attribute='status.conditions') | lib_utils_oo_collect(attribute='status', filters={'type': 'Ready'}) | map('bool') | select | list | count == 1"
  124. delay: 10
  125. retries: "{{ (grafana_timeout | int / 10) | int }}"
  126. - name: Get the prometheus SA
  127. shell: oc sa get-token {{ grafana_prometheus_serviceaccount }} -n {{ grafana_prometheus_namespace }}
  128. register: prometheus_sa_token
  129. - name: Get prometheus route
  130. oc_route:
  131. state: list
  132. name: prometheus
  133. namespace: "{{ grafana_prometheus_namespace }}"
  134. register: prometheus_route
  135. - name: Get prometheus route
  136. oc_route:
  137. state: list
  138. name: grafana
  139. namespace: "{{ grafana_namespace }}"
  140. register: grafana_route
  141. - name: set facts
  142. set_fact:
  143. payload_data: "{{ grafana_datasource_json | regex_replace('grafana_name', grafana_datasource_name ) | regex_replace('prometheus_url', prometheus_route.results[0].spec.host ) | regex_replace('satoken', prometheus_sa_token.stdout ) }}"
  144. grafana_route: "https://{{ grafana_route.results[0].spec.host }}"
  145. - name: Add new datasource to grafana
  146. uri:
  147. url: "{{ grafana_route }}/api/datasources"
  148. user: admin
  149. password: admin
  150. method: POST
  151. body: '{{ payload_data }}'
  152. body_format: json
  153. headers:
  154. Content-Type: "Content-Type: application/json"
  155. register: add_ds
  156. - name: Regex set data soure name for openshift dashboard
  157. replace:
  158. path: "{{ mktemp.stdout }}/openshift-cluster-monitoring.json"
  159. regexp: '{{ item.regexp }}'
  160. replace: '{{ item.replace }}'
  161. backup: yes
  162. with_items:
  163. - regexp: '##DS_PR##'
  164. replace: '{{ grafana_datasource_name }}'
  165. - regexp: 'Xs'
  166. replace: '{{ grafana_graph_granularity }}'
  167. - name: Regex set data soure name for node exporter
  168. replace:
  169. path: "{{ mktemp.stdout }}/node-exporter-full-dashboard.json"
  170. regexp: '{{ item.regexp }}'
  171. replace: '{{ item.replace }}'
  172. backup: yes
  173. with_items:
  174. - regexp: '##DS_PR##'
  175. replace: '{{ grafana_datasource_name }}'
  176. - regexp: 'Xs'
  177. replace: '{{ grafana_graph_granularity }}'
  178. when: grafana_node_exporter | default(false) | bool == true
  179. - set_fact:
  180. cluster_monitoring_dashboard: "{{ mktemp.stdout }}/openshift-cluster-monitoring.json"
  181. node_exporter_dashboard: "{{ mktemp.stdout }}/node-exporter-full-dashboard.json"
  182. - name: Slurp dashboard file
  183. slurp:
  184. src: "{{ cluster_monitoring_dashboard }}"
  185. register: slurpfile
  186. - name: Add openshift dashboard
  187. uri:
  188. url: "{{ grafana_route }}/api/dashboards/db"
  189. user: admin
  190. password: admin
  191. method: POST
  192. body: '{{ slurpfile["content"] | b64decode }}'
  193. body_format: json
  194. headers:
  195. Content-Type: "Content-Type: application/json"
  196. register: add_ds
  197. - name: Slurp dashboard file
  198. slurp:
  199. src: "{{ node_exporter_dashboard }}"
  200. register: slurpfile
  201. - name: Add node exporter dashboard
  202. uri:
  203. url: "{{ grafana_route }}/api/dashboards/db"
  204. user: admin
  205. password: admin
  206. method: POST
  207. body: '{{ slurpfile["content"] | b64decode }}'
  208. body_format: json
  209. headers:
  210. Content-Type: "Content-Type: application/json"
  211. register: add_ds
  212. when: grafana_node_exporter | default(false) | bool == true