Grafana: добавление datasource из Ansible

Автор: | 18/06/2018
 

В Grafana 5.0 появилась возможность настраивать её без API, а просто добавляя файлы настроек.

Документация тут>>>.

Удобно для использования с Ansible etc.

Ниже быстрый пример применения.

Путь к каталогу задаётся через переменную GF_PATHS_PROVISIONING:

t=2018-06-18T13:11:26+0000 lvl=info msg=”Config overridden from Environment variable” logger=settings var=”GF_PATHS_PROVISIONING=/etc/grafana/provisioning”

Содержание

Ручное добавление

Протестируем – попробуем добавить datasource вручную.

Grafana запущена в контейнере, данные монтируются через volumes.

Создаём каталог provisioning/datasources:

[simterm]

[root@monitonrig-dev /opt/prometheus] # mkdir /etc/grafana/provisioning/datasources

[/simterm]

Создаём в нём файл настроек datasource – копипастим из документации>>>.

Обновляем Compose, сейчас выглядит так:

version: '3.3'

networks:
  prometheus:

services:

  prometheus-server:
    image: prom/prometheus:v1.8.2
    networks:
      - prometheus
    ports:
      - 9090:9090
    volumes:
      - /etc/prometheus/prometheus-server-conf.yml:/etc/prometheus.yml
      - /data/prometheus/prometheus:/prometheus
    command:
      - '-config.file=/etc/prometheus.yml'
      - '-storage.local.path=/prometheus'
      - '-web.external-url=http://dev.monitor.domain.world/prometheus'
    restart: always

  grafana-ui:

    image: grafana/grafana
    networks:
      - prometheus
    ports:
    - 3000:3000
    volumes:
      - /etc/grafana/:/etc/grafana/
      - /data/grafana:/var/lib/grafana
    depends_on:
      - prometheus-server

Перезапускаем сервис, у меня есть отдельный systemd сервис для этого:

[simterm]

[root@monitonrig-dev /opt/prometheus] # systemctl restart prometheus.service

[/simterm]

Проверяем:

Ухтышка –  работает…

Ansible

Теперь обновим роль Ansible – добавим подключение datasource при развёртывании окружения.

В шаблонах роли – добавляем roles/monitoring/templates/grafana-prometehus-datasource.yml.j2:

# config file version
apiVersion: 1

# list of datasources to insert/update depending
# what's available in the database
datasources:
  # <string, required> name of the datasource. Required
- name: Prometheus
  # <string, required> datasource type. Required
  type: prometheus
  # <string, required> access mode. proxy or direct (Server or Browser in the UI). Required
  access: proxy
  # <int> org id. will default to orgId 1 if not specified
  orgId: 1
  # <string> url
  url: http://prometheus-server:9090/prometheus
  # <bool> mark as default datasource. Max one per org
  isDefault: true
  # <map> fields that will be converted to json and stored in json_data
  version: 1
  # <bool> allow users to edit datasources from the UI.
  editable: true

В URL тут указываем имя контейнера, как он указано в Compose файле.

В roles/monitoring/templates/prometheus-compose.yml.j2 обновляем монтирование разделов, сейчас они выглядят так:

...
    volumes:
      - {{ grafana_configs_path }}/grafana.ini:/etc/grafana/grafana.ini
      - {{ grafana_data_path }}:/var/lib/grafana
...

Теперь вместо одного файла монтируем весь каталог:

...
    volumes:
      - {{ grafana_configs_path }}:/etc/grafana/
      - {{ grafana_data_path }}:/var/lib/grafana
...

grafana_configs_path задаётся в переменных:

[simterm]

$ cat roles/monitoring/vars/main.yml | grep grafana_configs_path
grafana_configs_path: "/etc/grafana"

[/simterm]

Обновляем roles/monitoring/tasks/main.yml, добавляем создание каталога provisioning/datasources:

...
- name: Create  {{ grafana_configs_path }}/provisioning directory
  file:
    path: "{{ grafana_configs_path }}/provisioning/datasources"
    owner: "{{ grafana_user }}"
    group: "{{ grafana_user }}"
    mode: 0755
    state: directory
...

И копирование файла настроек datasource:

...
- name: Copy Grafana datasource config
  template:
    src: templates/grafana-prometehus-datasource.yml.j2
    dest: "{{ grafana_configs_path }}/provisioning/datasources/prometheus.yml"
    owner: "{{ grafana_user }}"
    group: "{{ grafana_user }}"
...

Запускаем ansible-playbook:

[simterm]

...
TASK [monitoring : Create Grafana group] ****
ok: [dev.monitor.domain.world]

TASK [monitoring : Create Grafana user grafana with UID 472] ****
ok: [dev.monitor.domain.world]

TASK [monitoring : Create Grafana configs directory] ****
changed: [dev.monitor.domain.world]

TASK [monitoring : Create  /data/grafana directory] ****
ok: [dev.monitor.domain.world]

TASK [monitoring : Create  /etc/grafana/provisioning directory] ****
changed: [dev.monitor.domain.world]

TASK [monitoring : Copy Grafana config] ****
ok: [dev.monitor.domain.world]

TASK [monitoring : Copy Grafana datasource config] ****
changed: [dev.monitor.domain.world]

TASK [monitoring : Copy systemd unit file] ****
ok: [dev.monitor.domain.world]

TASK [monitoring : Start monitoring service] ****
changed: [dev.monitor.domain.world]

PLAY RECAP ****
dev.monitor.domain.world : ok=18   changed=6    unreachable=0    failed=0   

Provisioning done.

[/simterm]

Проверяем:

Готово.