--- - 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