91 lines
3.4 KiB
YAML
91 lines
3.4 KiB
YAML
---
|
|||
|
|
- name: Validate selected stack
|
||
|
|
ansible.builtin.assert:
|
||
|
|
that:
|
||
|
|
- observability_stack in ['elk-grafana', 'grafana-stack']
|
||
|
|
fail_msg: observability_stack must be elk-grafana or grafana-stack.
|
||
|
|
|
||
|
|
- name: Set stack deployment directory
|
||
|
|
ansible.builtin.set_fact:
|
||
|
|
stack_root: "{{ observability_root }}/{{ observability_stack }}"
|
||
|
|
|
||
|
|
- name: Create stack directory tree
|
||
|
|
ansible.builtin.file:
|
||
|
|
path: "{{ item }}"
|
||
|
|
state: directory
|
||
|
|
owner: root
|
||
|
|
group: root
|
||
|
|
mode: "0755"
|
||
|
|
loop: >-
|
||
|
|
{{
|
||
|
|
[stack_root, stack_root + '/config']
|
||
|
|
+ (
|
||
|
|
[stack_root + '/config/filebeat', stack_root + '/config/logstash/pipeline', stack_root + '/config/grafana/provisioning/datasources']
|
||
|
|
if observability_stack == 'elk-grafana'
|
||
|
|
else [stack_root + '/config/prometheus/rules', stack_root + '/config/alertmanager', stack_root + '/config/loki', stack_root + '/config/tempo', stack_root + '/config/alloy', stack_root + '/config/grafana/provisioning/datasources']
|
||
|
|
)
|
||
|
|
}}
|
||
|
|
|
||
|
|
- name: Apply Elasticsearch kernel requirement
|
||
|
|
ansible.posix.sysctl:
|
||
|
|
name: vm.max_map_count
|
||
|
|
value: "262144"
|
||
|
|
state: present
|
||
|
|
sysctl_set: true
|
||
|
|
reload: true
|
||
|
|
when: observability_stack == 'elk-grafana'
|
||
|
|
|
||
|
|
- name: Render ELK and Grafana files
|
||
|
|
ansible.builtin.template:
|
||
|
|
src: "elk-grafana/{{ item.src }}"
|
||
|
|
dest: "{{ stack_root }}/{{ item.dest }}"
|
||
|
|
owner: root
|
||
|
|
group: root
|
||
|
|
mode: "{{ item.mode | default('0644') }}"
|
||
|
|
loop:
|
||
|
|
- { src: docker-compose.yml.j2, dest: docker-compose.yml }
|
||
|
|
- { src: config/filebeat/filebeat.yml.j2, dest: config/filebeat/filebeat.yml }
|
||
|
|
- { src: config/logstash/pipeline/logstash.conf.j2, dest: config/logstash/pipeline/logstash.conf }
|
||
|
|
- { src: config/grafana/provisioning/datasources/datasources.yml.j2, dest: config/grafana/provisioning/datasources/datasources.yml }
|
||
|
|
when: observability_stack == 'elk-grafana'
|
||
|
|
notify: Restart observability stack
|
||
|
|
|
||
|
|
- name: Render Grafana stack files
|
||
|
|
ansible.builtin.template:
|
||
|
|
src: "grafana-stack/{{ item.src }}"
|
||
|
|
dest: "{{ stack_root }}/{{ item.dest }}"
|
||
|
|
owner: root
|
||
|
|
group: root
|
||
|
|
mode: "{{ item.mode | default('0644') }}"
|
||
|
|
loop:
|
||
|
|
- { src: docker-compose.yml.j2, dest: docker-compose.yml }
|
||
|
|
- { src: config/prometheus/prometheus.yml.j2, dest: config/prometheus/prometheus.yml }
|
||
|
|
- { src: config/prometheus/rules/host.rules.yml.j2, dest: config/prometheus/rules/host.rules.yml }
|
||
|
|
- { src: config/alertmanager/alertmanager.yml.j2, dest: config/alertmanager/alertmanager.yml }
|
||
|
|
- { src: config/loki/loki.yml.j2, dest: config/loki/loki.yml }
|
||
|
|
- { src: config/tempo/tempo.yml.j2, dest: config/tempo/tempo.yml }
|
||
|
|
- { src: config/alloy/config.alloy.j2, dest: config/alloy/config.alloy }
|
||
|
|
- { src: config/grafana/provisioning/datasources/datasources.yml.j2, dest: config/grafana/provisioning/datasources/datasources.yml }
|
||
|
|
when: observability_stack == 'grafana-stack'
|
||
|
|
notify: Restart observability stack
|
||
|
|
|
||
|
|
- name: Start selected observability stack
|
||
|
|
community.docker.docker_compose_v2:
|
||
|
|
project_src: "{{ stack_root }}"
|
||
|
|
state: present
|
||
|
|
pull: missing
|
||
|
|
remove_orphans: true
|
||
|
|
|
||
|
|
- name: Flush restart handler before health checks
|
||
|
|
ansible.builtin.meta: flush_handlers
|
||
|
|
|
||
|
|
- name: Wait for Grafana
|
||
|
|
ansible.builtin.uri:
|
||
|
|
url: http://127.0.0.1:3000/api/health
|
||
|
|
status_code: 200
|
||
|
|
register: grafana_health
|
||
|
|
retries: 30
|
||
|
|
delay: 5
|
||
|
|
until: grafana_health.status == 200
|
||
|
|
|