From 3b2d6d4ebcb191729bb48443da5e906f3140d233 Mon Sep 17 00:00:00 2001 From: Administrator Date: Fri, 21 Nov 2025 09:05:45 +0000 Subject: [PATCH] Update 10 files - /roles/loki/tasks/main.yml - /roles/loki/templates/loki-config.yml.j2 - /roles/loki/templates/promtail-config.yml.j2 - /roles/loki/templates/docker-compose.yml.j2 - /roles/loki/handlers/main.yml - /roles/grafana/templates/loki-datasource.yml.j2 - /roles/grafana/templates/docker-compose.yml.j2 - /roles/grafana/tasks/main.yml - /group_vars/all.yml - /olimp-deploy.yml --- group_vars/all.yml | 11 ++- olimp-deploy.yml | 3 +- roles/grafana/tasks/main.yml | 20 ++++- roles/grafana/templates/docker-compose.yml.j2 | 1 + .../grafana/templates/loki-datasource.yml.j2 | 12 +++ roles/loki/handlers/main.yml | 31 ++++++++ roles/loki/tasks/main.yml | 79 +++++++++++++++++++ roles/loki/templates/docker-compose.yml.j2 | 45 +++++++++++ roles/loki/templates/loki-config.yml.j2 | 53 +++++++++++++ roles/loki/templates/promtail-config.yml.j2 | 73 +++++++++++++++++ 10 files changed, 325 insertions(+), 3 deletions(-) create mode 100644 roles/grafana/templates/loki-datasource.yml.j2 create mode 100644 roles/loki/handlers/main.yml create mode 100644 roles/loki/tasks/main.yml create mode 100644 roles/loki/templates/docker-compose.yml.j2 create mode 100644 roles/loki/templates/loki-config.yml.j2 create mode 100644 roles/loki/templates/promtail-config.yml.j2 diff --git a/group_vars/all.yml b/group_vars/all.yml index 6eed323..f809d70 100644 --- a/group_vars/all.yml +++ b/group_vars/all.yml @@ -252,4 +252,13 @@ grafana_vmagent_config: "{{ grafana_base_dir }}/vmagent/vmagent.yaml" grafana_port: 45132 grafana_admin_user: admin grafana_admin_password: 13qeadZC -grafana_root_url: https://mon.zailon.ru \ No newline at end of file +grafana_root_url: https://mon.zailon.ru + +# ------------ Loki------------ +loki_base_dir: "/mnt/loki" +loki_config_dir: "{{ loki_base_dir }}/config" +loki_data_dir: "{{ loki_base_dir }}/data" +promtail_config_dir: "{{ loki_base_dir }}/promtail" +loki_port: 45135 +loki_version: "2.9.2" +loki_retention_days: 30 \ No newline at end of file diff --git a/olimp-deploy.yml b/olimp-deploy.yml index a205bec..e9336e0 100644 --- a/olimp-deploy.yml +++ b/olimp-deploy.yml @@ -56,4 +56,5 @@ roles: - { role: docker, tags: deploy_docker } - { role: meshcentral, tags: deploy_meshcentral } - - { role: grafana, tags: deploy_grafana } \ No newline at end of file + - { role: grafana, tags: deploy_grafana } + - { role: loki, tags: deploy_loki } \ No newline at end of file diff --git a/roles/grafana/tasks/main.yml b/roles/grafana/tasks/main.yml index 1168943..018467b 100644 --- a/roles/grafana/tasks/main.yml +++ b/roles/grafana/tasks/main.yml @@ -51,4 +51,22 @@ - name: Show Grafana status ansible.builtin.debug: - var: grafana_status.stdout_lines \ No newline at end of file + var: grafana_status.stdout_lines + +- name: Ensure datasources directory exists + ansible.builtin.file: + path: "{{ grafana_config_dir }}/datasources" + state: directory + owner: 472 + group: 472 + mode: '0755' + become: yes + +- name: Deploy Loki datasource configuration + template: + src: loki-datasource.yml.j2 + dest: "{{ grafana_config_dir }}/datasources/loki.yml" + owner: root + group: root + mode: '0644' + become: yes \ No newline at end of file diff --git a/roles/grafana/templates/docker-compose.yml.j2 b/roles/grafana/templates/docker-compose.yml.j2 index be5656d..b22e1e4 100644 --- a/roles/grafana/templates/docker-compose.yml.j2 +++ b/roles/grafana/templates/docker-compose.yml.j2 @@ -48,6 +48,7 @@ services: volumes: - {{ grafana_data_dir }}:/var/lib/grafana - {{ grafana_config_dir }}:/etc/grafana/provisioning + - {{ grafana_config_dir }}/datasources:/etc/grafana/provisioning/datasources ports: - "{{ grafana_port }}:3000" depends_on: diff --git a/roles/grafana/templates/loki-datasource.yml.j2 b/roles/grafana/templates/loki-datasource.yml.j2 new file mode 100644 index 0000000..c17fac6 --- /dev/null +++ b/roles/grafana/templates/loki-datasource.yml.j2 @@ -0,0 +1,12 @@ +apiVersion: 1 + +datasources: + - name: Loki + type: loki + access: proxy + url: http://localhost:45135 + isDefault: false + version: 1 + editable: true + jsonData: + maxLines: 1000 \ No newline at end of file diff --git a/roles/loki/handlers/main.yml b/roles/loki/handlers/main.yml new file mode 100644 index 0000000..5953922 --- /dev/null +++ b/roles/loki/handlers/main.yml @@ -0,0 +1,31 @@ +--- +- name: restart loki stack + community.docker.docker_compose_v2: + project_src: "{{ loki_base_dir }}" + state: restarted + scale: {} + become: yes + +- name: restart loki + community.docker.docker_compose_v2: + project_src: "{{ loki_base_dir }}" + services: loki + state: restarted + scale: {} + become: yes + +- name: restart promtail + community.docker.docker_compose_v2: + project_src: "{{ loki_base_dir }}" + services: promtail + state: restarted + scale: {} + become: yes + +- name: reload loki stack + community.docker.docker_compose_v2: + project_src: "{{ loki_base_dir }}" + state: present + restarted: yes + scale: {} + become: yes \ No newline at end of file diff --git a/roles/loki/tasks/main.yml b/roles/loki/tasks/main.yml new file mode 100644 index 0000000..7ab36bd --- /dev/null +++ b/roles/loki/tasks/main.yml @@ -0,0 +1,79 @@ +--- +- name: Create Loki directories + file: + path: "{{ item }}" + state: directory + mode: '0755' + loop: + - "{{ loki_base_dir }}" + - "{{ loki_config_dir }}" + - "{{ loki_data_dir }}" + - "{{ promtail_config_dir }}" + become: yes + +- name: Deploy Loki configuration + template: + src: loki-config.yml.j2 + dest: "{{ loki_config_dir }}/loki-config.yml" + mode: '0644' + notify: restart loki + become: yes + +- name: Deploy Promtail configuration + template: + src: promtail-config.yml.j2 + dest: "{{ promtail_config_dir }}/promtail-config.yml" + mode: '0644' + notify: restart promtail + become: yes + +- name: Deploy Loki stack docker-compose + template: + src: docker-compose.yml.j2 + dest: "{{ loki_base_dir }}/docker-compose.yml" + mode: '0644' + notify: restart loki stack + become: yes + +- name: Start Loki stack with docker_compose_v2 + community.docker.docker_compose_v2: + project_src: "{{ loki_base_dir }}" + state: present + restarted: no + scale: {} + become: yes + +- name: Wait for Loki to be ready + wait_for: + host: "{{ ansible_default_ipv4.address }}" + port: "{{ loki_port }}" + timeout: 60 + state: started + delay: 10 + become: no + +- name: Verify Loki is responding + uri: + url: "http://{{ ansible_default_ipv4.address }}:{{ loki_port }}/ready" + status_code: 200 + timeout: 15 + register: loki_ready_check + become: no + retries: 3 + delay: 10 + +- name: Show Loki status + debug: + msg: "Loki is running and responding on port {{ loki_port }}" + when: loki_ready_check.status == 200 + +- name: Check Loki services status + community.docker.docker_compose_v2: + project_src: "{{ loki_base_dir }}" + state: present + register: loki_services_status + become: yes + +- name: Display Loki services status + debug: + msg: "Loki stack services: {{ loki_services_status.services }}" \ No newline at end of file diff --git a/roles/loki/templates/docker-compose.yml.j2 b/roles/loki/templates/docker-compose.yml.j2 new file mode 100644 index 0000000..570354e --- /dev/null +++ b/roles/loki/templates/docker-compose.yml.j2 @@ -0,0 +1,45 @@ +version: '3.8' + +services: + loki: + image: grafana/loki:{{ loki_version }} + container_name: loki + restart: unless-stopped + ports: + - "{{ loki_port }}:3100" + command: -config.file=/etc/loki/loki-config.yml + volumes: + - "{{ loki_data_dir }}:/loki" + - "{{ loki_config_dir }}:/etc/loki" + networks: + - monitoring + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + promtail: + image: grafana/promtail:{{ loki_version }} + container_name: promtail + restart: unless-stopped + command: -config.file=/etc/promtail/promtail-config.yml + volumes: + - "{{ promtail_config_dir }}:/etc/promtail" + - "/var/log:/var/log:ro" + - "/var/lib/docker/containers:/var/lib/docker/containers:ro" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + networks: + - monitoring + depends_on: + - loki + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +networks: + monitoring: + name: monitoring + external: true \ No newline at end of file diff --git a/roles/loki/templates/loki-config.yml.j2 b/roles/loki/templates/loki-config.yml.j2 new file mode 100644 index 0000000..69be724 --- /dev/null +++ b/roles/loki/templates/loki-config.yml.j2 @@ -0,0 +1,53 @@ +auth_enabled: false + +server: + http_listen_port: 3100 + grpc_listen_port: 9096 + +common: + path_prefix: /loki + storage: + filesystem: + chunks_directory: /loki/chunks + rules_directory: /loki/rules + replication_factor: 1 + ring: + instance_addr: 127.0.0.1 + kvstore: + store: inmemory + +query_range: + results_cache: + cache: + embedded_cache: + enabled: true + max_size_mb: 100 + +schema_config: + configs: + - from: 2020-10-24 + store: boltdb-shipper + object_store: filesystem + schema: v11 + index: + prefix: index_ + period: 24h + +ruler: + alertmanager_url: http://localhost:9093 + +chunk_store_config: + max_look_back_period: 744h + +table_manager: + retention_deletes_enabled: true + retention_period: {{ loki_retention_days }}h + +compactor: + working_directory: /loki/boltdb-shipper-compactor + shared_store: filesystem + compaction_interval: 10m + +limits_config: + reject_old_samples: true + reject_old_samples_max_age: 168h \ No newline at end of file diff --git a/roles/loki/templates/promtail-config.yml.j2 b/roles/loki/templates/promtail-config.yml.j2 new file mode 100644 index 0000000..22071f9 --- /dev/null +++ b/roles/loki/templates/promtail-config.yml.j2 @@ -0,0 +1,73 @@ +server: + http_listen_port: 9080 + grpc_listen_port: 0 + +positions: + filename: /tmp/positions.yaml + +clients: + - url: http://loki:3100/loki/api/v1/push + +scrape_configs: + - job_name: system + static_configs: + - targets: + - localhost + labels: + job: system-logs + host: "{{ inventory_hostname }}" + __path__: /var/log/*log + + - job_name: containers + static_configs: + - targets: + - localhost + labels: + job: container-logs + host: "{{ inventory_hostname }}" + __path__: /var/lib/docker/containers/*/*log + + - job_name: docker-daemon + static_configs: + - targets: + - localhost + labels: + job: docker-daemon + host: "{{ inventory_hostname }}" + __path__: /var/log/docker.log + + - job_name: syslog + static_configs: + - targets: + - localhost + labels: + job: syslog + host: "{{ inventory_hostname }}" + __path__: /var/log/syslog + + - job_name: auth + static_configs: + - targets: + - localhost + labels: + job: auth + host: "{{ inventory_hostname }}" + __path__: /var/log/auth.log + + - job_name: ansible + static_configs: + - targets: + - localhost + labels: + job: ansible + host: "{{ inventory_hostname }}" + __path__: /var/log/ansible/*log + + - job_name: kernel + static_configs: + - targets: + - localhost + labels: + job: kernel + host: "{{ inventory_hostname }}" + __path__: /var/log/kern.log \ No newline at end of file