Knock

Самый простой способ мониторинга вашего сайта без лишних затрат

Начать бесплатно

Установка influxdb, telegraf и grafana с помощью ansible

Для настройки собственного мониторинга на базе influxdb необходимо установить целый набор компонентов: сам influxdb, telegraf и grafana. Все это можно установить одной командой с помощью одного единственного плейбука для ansible.

Ansible

Почему ansible? Этот инструмент конфигурации хорош по многим причинам. Для ansible не нужен агент на сервере, вообще ничего не нужно устанавливать, кроме питона. Ansible использует SSH протокол для выполнения команд на сервере. Все это дает вам универсальный инструмент для конфигурирования сервера с помощью task’ов и playbook’ов. Для написания плейбуков не нужно учить новый язык программирования, все описывается с помощью YAML формата.

Influxdb

Influxdb - это очень удобная, производительная и функциональная база данных для хранения временных рядов. Вам не нужны дополнительные зависимости для использования этой базы данных. Кроме того, у influxdb есть поддержка Erlang, Go, Haskell, Python, Java, PHP и многих других языков программирования.

Готовим playbook

Обратите внимание, что все что о чем написано в этой статье справедливо для ubuntu 16.04 и ansible >= 2.0.0.2.

Playbook(сценарий) состоит из задач описанных в разделе “tasks”. Для каждого сценария нужно указывать группу хостов, на котором будут выполнятся описанные команды. Название группы указывается в параметре “hosts”. Список серверов описан в отдельном файле. Пример файла hosts:

[webservers]
example.ru

[monitor]
94.103.89.245

Задать этот файл с хостами можно либо при запуске ansible-playbook с помощью параметра i(inventory), либо указав в конфиге ansible.cfg где его нужно брать:

[defaults]
inventory = hosts
host_key_checking = False

Сам ansible.cfg должен лежать в папке для конфигов по умолчанию(на моей ubuntu это /etc/ansble/) или в той папке, где вы выполняете команду ansible-playbook.

Любой сценарий должен начинаться с ---:

---
- hosts: webservers

В плейбуках можно использовать комментарии

# Устнаовка influxdb, telegraf, grafana
---
- hosts: webservers

Кроме параметров hosts и tasks может быть указан еще целый ряд параметров. Рассмотрим некоторые из них.

---
- hosts: webservers
  user: yourname
  sudo: yes

В примере выше в параметре user указан пользователь под которым будет выполняться соединение. При этом, все команды будут выполняться через sudo(конечно, если у пользователя yourname достаточно прав).

Можно использовать раздел vars для указания дополнительных параметров:

- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200

Определимся со структурой нашего сценария. Для этого нам нужно понять, что мы хотим сделать. Весь процесс установки можно описать как набор шагов:

Теперь можно перейти к самому интересному. Начнем указывать список задач, которые нужно выполнить. Для каждой задачи можно задать имя(но не обязательно) и нужно указать модуль, который будет использоваться при выполнении.

tasks:
- name: Update apt cache
  apt: update_cache=yes
  sudo: yes

Вот пример простой задачи. Я назвал ее Update apt сache. Если вы пользовались дебианами или убунтами, то вы вероятно догадались, что мы используем модуль apt для обновления кеша.

Теперь добавляем ключ для репозитория influxdb:

- name: Import InfluxDB GPG signing key
  apt_key: url=https://repos.influxdata.com/influxdb.key state=present

В этом месте мы используем встроенные ansible модуль apt_key, который позволяет добавить GPG ключи для настройки менеджера макета apt в нашей ubuntu. Этот модуль использует два параметра: url - указывает на расположение ключа, state - определяет статус, который должен быть у задачи после ее выполнения(в нашем случае present).

После того как мы добавили ключ для репозитория, мы можем добавлять сам репозиторий. Для этого добавим еще одну задачу в наш сценарий:

- name: Add InfluxDB repository
  apt_repository: repo='deb https://repos.influxdata.com/ubuntu xenial stable' state=present

Тут мы используем встроенный модуль apt_repository. Значение параметра repo взято из документации по установке influxdb. Не забудьте заменить xenial на вашу версию ubuntu, если это необходимо. Значение stable определяет какую версию influxdb вы собираетесь установить.

Займемся непосредственно установкой необходимых пакетов.

- name: Install InfluxDB packages
  apt: name=influxdb state=present

- name: Install Telegraf packages
  apt: name=telegraf state=present

Используем встроенный модуль apt с новым параметром name в котором указываем название необходимо пакета. Как видите, мы устанавливает подряд два пакета: influxdb и telegraf. Значение present параметра state означает что пакеты не нужно переустанавливать если они уже были установленны. После выполнения этих задач, на вашем сервере будут установленны influxdb и telegraf.

Нам нужно сконфигурировать наш свежеустановленный influxdb.

- name: Modify InfluxDB hostname
  replace:
    dest=/etc/influxdb/influxdb.conf
    regexp='hostname = "localhost"'
    replace='hostname = "{{ ansible_hostname }}"'
    backup=yes

Для этого нам нужен встроенный модуль replace с помощью которого мы в конфиге influxdb на лету меняем необходимые строки. В параметре regexp указываем паттерн, по которому мы будем искать текст для замены. В replace указываем строку, которую впишем вместо найденного по паттерну. Обратите внимание на двойные фигурные скобки - это пример использования шаблонизатора Jinja2. Строка {{ ansible_hostname }} автоматически заменится на реальный хост на котором будет выполнен наш playbook. Параметр dest указывает на файл в котором мы будет проводить поиск и замену. При использовании параметра backup=yes ваш старый конфигурационный файл будет сохранен с другим названием.

Теперь о конфигурировании telegraf. Тут все немного по другому. Вместо использования замены на лету, просто зальем на сервер подготовленный конфигурационный файл. Для этого скачаем дефолтный конфиг и изменим в нем кое-что.

Так как мы хотим собирать метрики с нашего сайта с помощью периодического опроса специальной страницы этого сайта(например http://example.ru/_stats), то нам нужно настроить специальный модуль telegraf, который сможет это делать. Найдите в конфиге часть, которая отвечает за метод получения данных httpjson и приведите его к вот такому виду.

# Read flattened metrics from one or more JSON HTTP endpoints
[[inputs.httpjson]]
   ## NOTE This plugin only reads numerical measurements, strings and booleans
   ## will be ignored.

   ## a name for the service being polled
   name = "knock_metrics"

   ## URL of each server in the service's cluster
   servers = [
     "http://example.ru/_stats",
   ]
   ## Set response_timeout (default 5 seconds)
   response_timeout = "5s"

   ## HTTP method to use: GET or POST (case-sensitive)
   method = "GET"

   ## List of tag names to extract from top-level of JSON server response
   # tag_keys = [
   #   "my_tag_1",
   #   "my_tag_2"
   # ]

   ## HTTP parameters (all values must be strings)
   # [inputs.httpjson.parameters]
   #  event_type = "cpu_spike"
   #  threshold = "0.75"

   ## HTTP Header parameters (all values must be strings)
   # [inputs.httpjson.headers]
   #   X-Auth-Token = "my-xauth-token"
   #   apiVersion = "v1"

   ## Optional SSL Config
   # ssl_ca = "/etc/telegraf/ca.pem"
   # ssl_cert = "/etc/telegraf/cert.pem"
   # ssl_key = "/etc/telegraf/key.pem"
   ## Use SSL but skip chain & host verification
   # insecure_skip_verify = false

Два самых важных параметра, которые необходимо указать: name и servers. Более подробно о этих параметрах и зачем они нужны можно почитать в прошлых статьях.

Наш подготовленный конфиг нужно скопировать на сервер.

- name: Configure Telegraf
  copy: src=files/telegraf/telegraf.conf dest=/etc/telegraf/telegraf.conf

Воспользуемся встроенным модулем copy, который принимает два параметра src и dest. Тут нет ничего сложного, мы просто копируем указанный в src локальный файл в файл на сервере, указанный в dest.

Осталось запустить influxdb и telegraf с новыми конфигами. И для этого тоже есть встроенные модуль, который называется service.

- name: Start the InfluxDB service
  service: name=influxdb state=restarted

- name: Start the Telegraf service
  service: name=telegraf state=restarted

Параметр name указывает какой сервис нам нужно перезапустить.

Теперь установим и запустить grafana. Тут уже все просто и понятно.

- name: Import Grafana GPG signing key
  apt_key: url=https://packagecloud.io/gpg.key state=present

- name: Add Grafana repository
  apt_repository: repo='deb https://packagecloud.io/grafana/stable/debian/ jessie main' state=present

- name: Install Grafana packages
  apt: name=grafana state=present

- name: Start the Grafana service
  service: name=grafana-server state=restarted 

Мы добавляем новый ключ, затем добавляем сам репозиторий. Устанавливаем необходимый пакет и запускаем сервис.

На этом все. После запуска сценария командой ansible-playbook monitor.yaml у вас будет настроенный и сконфигурированный сервер для мониторинга ваших сайтов и приложений.

Сам сценарий со всеми дополнительными файлами можно найти на github.com/horechek/monitor.

Дополнительно почитать: