Add observability platform Ansible project
Deploys the Grafana stack (Prometheus/Alertmanager/Loki/Tempo/Grafana with Alloy as collector) and the ELK stack (Filebeat/Logstash/Elasticsearch/ Kibana) via Docker Compose on a target host. External to the application repo, pre-built by the mentor.
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
---
|
||||
- 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
|
||||
|
||||
Reference in New Issue
Block a user