Данная статья про написание простых ansible плейбуков для автоматической установки агентов на хосты с Linux/Windows и регистрации хостов через API Zabbix, включая SNMP хосты. Будут использоваться готовые роли и модули Ansible Galaxy Zabbix.
Zabbix подготовил собственные роли и модули для конфигурации многих компонентов Zabbix посредством Ansible - полный список можно найти здесь.
В этой статье поговорим только о zabbix_agent и zabbix_host.
*Эта статья не рассматривает и не показывает установку и настройку Ansible, этого в интернете полно.
zabbix_agent
Это роль, которая поддерживает установку агента на следующие операционные системы:
Red Hat
Fedora
Debian
Ubuntu
opensuse
Windows (Best effort)
macOS
Актуальный список на официальном github проекта.
zabbix_host
Это модуль для добавления/удаления/изменения хостов на сервере zabbix. Полное описание модуля тут.
Итак переходим к настройке
Первым шагом будет установка коллекции ansible ( работает только в ansible версии 2.9+):
ansible-galaxy collection install community.zabbix
После установки коллекции, создаем файл с плейбуком. Данный плейбук делает две вещи - устанавливает роль community.zabbix.zabbix_agent на указанные хосты и вторым шагом регистрирует хост в zabbix через модуль community.zabbix.zabbix_host.
Создаем файл zabbix-agent-all.yaml со следующим содержимым:
- hosts: linux:windows
tasks:
- name: Install agent
include_role:
name: community.zabbix.zabbix_agent # устанавливает готовую роль на хостах
tags:
- install # для удобства можно использовать тэги
- hosts: localhost # обращаемся к api через модуль с локального хоста
- name: Create a new linux or windows host or update an existing host's info # задача для регистрации агентов в zabbix сервере
local_action:
module: community.zabbix.zabbix_host # используем готовый модуль zabbix_host для регистрации агентов
server_url: "{{ zabbix_url }}" # переменная из инвентаря - url сервера для регистрации API
login_user: "{{ zabbix_api_user }}" # переменная из инвентаря - имя пользователя обычно Admin
login_password: "{{ zabbix_api_pass }}" # переменная из инвентаря - пароль
host_name: "{{ item }}" - # имя хоста из инвентаря
visible_name: "{{ hostvars[item].zabbix_visible_name | default(item) }}" # можно задать отображаемое имя отдельно для каждого хоста
description: "{{ hostvars[item].zabbix_host_description | default('') }} OS: {{ hostvars[item].ansible_distribution | default('') }} {{ hostvars[item].ansible_distribution_version | default('') }}" # берет описание из инвентаря и добавляет название операционной системы и версию из служебных переменных ansible
host_groups: "{{ hostvars[item].zabbix_host_groups }}" # в какую хост группу добавить хост
link_templates: "{{ hostvars[item].zabbix_link_templates }}" # какие template применить к хосту
status: "{{ hostvars[item].zabbix_host_status }}" # статус - Enabled или Disabled
state: present # указание ansible чтобы добавить хост, изменив на absent можно сделать обратную операцию удаления
inventory_mode: disabled # не включаем inventory mode
interfaces: # можно указать несколько интерфейсов
- type: "{{ hostvars[item].zabbix_interface_type }}" # переменная из инвентаря - может быть SNMP, Agent, JMX, IPMI
main: 1
useip: "{{ hostvars[item].zabbix_interface_use_ip }}" # можно использовать добавление по ip или по dns
ip: "{{ hostvars[item].zabbix_interface_ip }}" # если выбрано по ip - берется переменная с ip адресом
dns: "{{ item }}" # если выбрано useip: 0 то нужно указать FQDN хоста в переменных в инвентаре
port: "{{ hostvars[item].zabbix_interface_port }}" # указание порта
with_items:
- "{{ groups['windows'] if groups['windows'] is defined else [] }}" # проходим по хостам в группе windows если указано в инвентаре
- "{{ groups['linux'] if groups['linux'] is defined else [] }}" # проходим по хостам в группе windows если указано в инвентаре
tags:
- add-host # добавляем тэги для удобства
- hosts: localhost # обращаемся к api через модуль с локального хоста
tasks:
- name: Create a new host or update an existing SNMP host's info
local_action:
module: community.zabbix.zabbix_host # используем готовый модуль zabbix_host для регистрации агентов
server_url: "{{ zabbix_url }}" # переменная из инвентаря - url сервера для регистрации API
login_user: "{{ zabbix_api_user }}" # переменная из инвентаря - имя пользователя обычно Admin
login_password: "{{ zabbix_api_pass }}" # переменная из инвентаря - пароль
host_name: "{{ item }}" - # имя хоста из инвентаря
visible_name: "{{ hostvars[item].zabbix_visible_name | default(item) }}" # можно задать отображаемое имя отдельно для каждого хоста
description: "{{ hostvars[item].zabbix_host_description | default('') }} OS: {{ hostvars[item].ansible_distribution | default('') }} {{ hostvars[item].ansible_distribution_version | default('') }}" # берет описание из инвентаря и добавляет название операционной системы и версию из служебных переменных ansible
host_groups: "{{ hostvars[item].zabbix_host_groups }}" # в какую хост группу добавить хост
link_templates: "{{ hostvars[item].zabbix_link_templates }}" # какие template применить к хосту
status: "{{ hostvars[item].zabbix_host_status }}" # статус - Enabled или Disabled
state: present # указание ansible чтобы добавить хост, изменив на absent можно сделать обратную операцию удаления
inventory_mode: disabled # отключаем inventory mode
interfaces:
- type: "{{ hostvars[item].zabbix_interface_type }}" # берем значние из переменных
main: 1
useip: "{{ hostvars[item].zabbix_interface_use_ip }}" # указываем на добавление по ip или dns
ip: "{{ hostvars[item].zabbix_interface_ip }}" # берем значние из переменных
dns: "{{ item }}"
port: "{{ hostvars[item].zabbix_interface_port }}" # берем значние из переменных
details:
community : "{$SNMP_COMMUNITY}" # указываем community
bulk: 1
version: 2 # версия SNMP
macros:
- macro: '{$SNMP_COMMUNITY}' # создаем макрос
value: "{{ hostvars[item].zabbix_snmp_community }}" # берем community из переменных
loop: "{{ groups['snmp'] }}"
when: groups['snmp'] is defined # таска отработает только если запущен скрипт для snmp хостов
tags:
- add-snmp # добавляем тэги для удобств
На странице проекта вы сможете найти множество других настроек, например подключение к zabbix сервер через http, изменить версию агента и т.д., все настройки тут.
Файлы инвентаря
Далее нам нужно создать три файла linux-inventory, windows-inventory и snmp-inventory, можно сделать конечно в одном файле, но мне показалось удобнее разделить агенты по типу.
Linux хосты
Содержимое файла linux-inventory:
[linux]
host1.local #тут вы указываете ваши хосты по FQDN или IP-адресу
host2.local zabbix_host_description=”The host2 description”
host3.local zabbix_host_status=disabled # можно указать чтобы отключать хосты после добавления
host4.local zabbix_host_groups=’["Custom group"]’ #можно передать группы отдельно для каждого хоста
[linux:vars]
zabbix_agent_server=my.zabbix.server # адрес сервера
zabbix_url=https://my.zabbix.server # URL сервера
zabbix_api_use=true # говорим что будем добавлять через API
zabbix_api_user=Admin
zabbix_api_pass=StrongPa$$w0rd
zabbix_interface_port="10050" # номер порта где живет агент
zabbix_host_groups=["Linux servers"] # в какую группу добавлять хост по умолчанию
zabbix_link_templates=["Linux by Zabbix agent"] # список template для применения по умолчанию
zabbix_interface_type=agent # тип хоста - с использованием агента
zabbix_interface_use_ip="0" # говорим что будем добавлять по dns fqdn
zabbix_interface_ip=""
zabbix_host_description="My linux server" # описание по умолчанию
zabbix_host_status=enabled # состояние хоста по умолчанию
Windows
Для возможности установки агента на хосты с ОС Windows необходимо сначала настроить доступ для ansible - это вне темы этой статьи, но есть подробная инструкция на сайте ansible.
Содержимое файла windows-inventory:
[windows]
winhost01.local
winhost02.local zabbix_host_groups=’["Custom group"]’ #можно передать группы отдельно для каждого хоста
winhost03.local zabbix_host_status=disabled # можно указать чтобы отключать хосты после добавления
[windows:vars]
ansible_user=user@DOMAIN.LOCAL # если хосты в домене необходимо указывать доменный путь, и также настроить kerberos в linux
ansible_password=StrongPa$$w0rd
ansible_connection=winrm # управление windows происходит через службу WinRM
ansible_winrm_server_cert_validation=ignore # если у вашего домена самоподписанные сертификаты, лучше поставить ignore
zabbix_agent_server=my.zabbix.server # адрес сервера
zabbix_url=https://my.zabbix.server # URL сервера
zabbix_api_use=true # говорим что будем добавлять через API
zabbix_api_user=Admin
zabbix_api_pass=StrongPa$$w0rd
zabbix_interface_port="10050" # номер порта где живет агент
zabbix_host_groups=["Windows servers"] # в какую группу добавлять хост по умолчанию
zabbix_link_templates=["Windows by Zabbix agent"] # список template для применения по умолчанию
zabbix_interface_type=agent # тип хоста - с использованием агента
zabbix_interface_use_ip="0" # говорим что будем добавлять по dns fqdn
zabbix_interface_ip=""
zabbix_host_description="My windows server" # описание по умолчанию
zabbix_host_status=enabled # состояние хоста по умолчанию
SNMP
Для добавления SNMP хостов создаем файл snmp-inventory:
[snmp]
snmphost1.local zabbix_link_templates='["Cisco IOS SNMP","Network Generic Device SNMP"]' zabbix_host_groups='["Network devices"]'
snmp2.local zabbix_link_templates='["Template SNMP OS ESXi"]' zabbix_host_groups='["Hypervisors"]' zabbix_snmp_community=”Community”
[snmp:vars]
zabbix_url=https://my.zabbix.server # URL сервера
zabbix_api_use=true # говорим что будем добавлять через API
zabbix_api_user=Admin
zabbix_api_pass=StrongPa$$w0rd
zabbix_interface_port="161" # номер порта устройства, по умолчанию 161
zabbix_interface_type=snmp # тип snmp
zabbix_interface_use_ip="0" # указываем что добавляем по dns
zabbix_interface_ip="" # пустой ip
zabbix_host_description="My SNMP host" # описание по умолчанию
zabbix_host_status=enabled # состояние хоста по умолчанию
zabbix_snmp_community="MyCommunity" # указываем SNMP community
В итоге, файлы должны иметь следующую структуру файлов:
.
+-- linux-inventory
+-- snmp-inventory
+-- windows-inventory
L-- zabbix-agent-all.yaml
Запуск playbook
Для запуска плейбуков, необходимо запустить следующие команды:
Для установки на Linux хостах:
ansible-playbook -i linux-inventory zabbix-agent-all.yaml
Windows:
ansible-playbook -i windows-inventory zabbix-agent-all.yaml
SNMP:
ansible-playbook -i snmp-inventory zabbix-agent-all.yaml
Если нужна только установка, то можно запустить команды выше с тэгом install:
ansible-playbook -i linux-inventory zabbix-agent-all.yaml -t install
Если у вас есть особые настройки zabbix или вы хотите кастомизировать, полный список переменных роли и модуля можно найти на странице проекта: zabbix_agent и zabbix_host
Все исходники данной статьи есть на github.
UPDATE: в комментариях указали на ошибку использовать all all:vars, как было сделано изначально, т.к. в статье стремился показать как подключать модули и роли, исправил инвентарь и таски в плейбуке
amarao
Закопайте, пожалуйста. У меня глаза вытекают.
нафига вы делаете loop, а потом ещё и делегацию на localhost, а потом ещё и run_once? Если вы хотите loop, сделайте плей на localhost. Если вы хотите делегацию, зачем взаимоотменяющие друг друга hosts: all и run_once?
В целом — код не читаемый, логика не понятна. Инвентори в ini, структура групп хаотичная, используется all для гигантского пласта полиси (100500 переменных). Группы заббикса надо задавать отдельно (вместо переиспользования групп ансибла).
piccadil Автор
частично согласен с первым утверждением, не придумал как решить чтобы и роль установить и прогнать списком добавление хостов
со вторым — группа all для каждого инвентаря, переменные all:vars используются как переменные по умолчанию, можно задать для каждого хоста индивидуально
amarao
В тот момент, когда вы в инвентори полагаетесь на group_vars:all или all, вы теряете гибкость. Например, завтра вам делать decommission сервера, и вы его помещаете в группу decommissioned. Но ему всё равно настраивают мониторинг. Ой.
piccadil Автор
так плейбук заточен только на установку агентов и регистрацию, нужно удалять будет отдельный плейбук и соответственно файл, я сразу указал что можно было сделать всё в одном файле и рулить группами, но для удобства группы разнёс по разным файлам
amarao
setup можно делегировать ровно так же (delegate facts). Если вы хотите закладываться на факты для настройки мониторинга, это означает, что вы не можете настроить его если хотя бы один сервер в down или ребутится. Чем больше серверов, тем выше шансы на это.
В целом, настройка мониторинга на фактах — не очень хорошая затея.
piccadil Автор
поправил
luckyap
piccadil, а в чем проблема разнести на два разных шага? Примерно так:
piccadil Автор
поправил