Automatizar el despliegue y la configuración de un entorno Zabbix puede ahorrar horas de trabajo y evitar errores manuales. Ansible es una de las herramientas más adecuadas para esta tarea: fácil de aprender, basada en SSH (sin necesidad de agentes) y extremadamente flexible.
Esta guía muestra cómo crear un entorno Zabbix completo con Ansible, desde el servidor hasta los proxies, agentes e incluso aplicaciones, con ejemplos prácticos de comandos y playbooks.
¿Qué es Ansible?
Ansible fue creado en 2012 por Michael DeHaan, un ingeniero de software que había participado previamente en otros proyectos de automatización, como Cobbler y Func. Su objetivo era superar las limitaciones de las herramientas más populares de la época, como Puppet y Chef, que requerían la instalación de agentes y utilizaban lenguajes complejos.
Los objetivos de Ansible desde sus inicios fueron:
- Utilizar protocolos estándar (SSH, WinRM) sin necesidad de instalar agentes;
- Contar con un lenguaje sencillo y legible (YAML);
- Garantizar la idempotencia y aplicar los cambios solo cuando sea necesario;
- Ofrecer una curva de aprendizaje rápida.
El nombre «Ansible» proviene de la ciencia ficción: un dispositivo capaz de comunicarse instantáneamente a cualquier distancia, una metáfora de la capacidad de la herramienta para controlar rápidamente múltiples servidores.
En 2015, Red Hat adquirió Ansible, Inc., reforzando su uso empresarial con Ansible Tower (ahora Red Hat Ansible Automation Platform), que ofrece una interfaz web, una API y capacidades de orquestación a gran escala.
¿Por qué usar Ansible con Zabbix?
Al trabajar con Zabbix, nos enfrentamos a múltiples elementos: servidor central, proxies, agentes e integraciones. Ansible facilita:
- Estandarización: todos los componentes configurados de forma idéntica;
- Velocidad: despliegue simultáneo en decenas de hosts;
- Flexibilidad: adaptación a diferentes escenarios de red y monitorización;
- Automatización: desde la instalación hasta la configuración avanzada y las integraciones de API.
Utilizar Ansible para estruturar Zabbix
Ansible ejecuta tareas mediante playbooks, archivos YAML que contienen descripciones de las acciones a realizar: instalación de paquetes, configuración de servicios, creación de usuarios, ajustes de permisos y mucho más.
En el contexto de Zabbix, esto permite:
- Estandarizar la configuración de servidores, proxies y agentes;
- Instalar y registrar componentes en Zabbix mediante la API;
- Ajustar de forma centralizada los parámetros de seguridad y rendimiento;
- Automatizar las respuestas a eventos e incidentes.
La lógica es sencilla: se define el estado deseado del entorno en el código y Ansible aplica los cambios.
A continuación, encontrará una explicación paso a paso para ayudarle a crear un entorno Zabbix con Ansible.
Pre-requisitos
Servidores para pruebas:
| Función | Nombre | Ip | S.O | CPU | Memoria |
| Zabbix server | zbx-srv-01 | 192.168.10.1 | Rock Linux 9 | 2 | 4GB |
| Zabbix Proxy | zbx-prx-01 | 192.168.10.2 | Rock Linux 9 | 2 | 4GB |
| Zabbix Proxy | zbx-prx-02 | 192.168.10.3 | Rock Linux 9 | 2 | 4GB |
| App server | srv-wrk-app-01 | 192.168.10.4 | Rock Linux 9 | 2 | 4GB |
Preparar el entorno
El primer paso es instalar Ansible en el host de control. En este escenario, estamos utilizando la distribución Red Hat/Rock Linux 9.
- Instalar Ansible en el servidor Rock Linux:
# dnf install ansible-core |
Se necesitará un archivo de inventario para listar los hosts que se administrarán. En el ejemplo siguiente, tenemos un servidor Zabbix, dos proxies y un servidor de aplicaciones:
- Crea el directorio del proyecto:
# mkdir zabbix-labs |
- Cree y añada el contenido al archivo de inventario, que se puede crear en el directorio del proyecto:
# vim /zabbix-labs/inventario |
- Agregar contenido al archivo:
[zbx_servers] zbx-srv-01 ansible_ssh_host=192.168.10.1 [zbx_proxies] zbx-prx-01 ansible_ssh_host=192.168.10.2 zbx-prx-02 ansible_ssh_host=192.168.10.3 [workshop_apps] srv-wrk-app-01 ansible_ssh_host=192.168.10.4 zabbix_proxy=zbx-prx-01 |
El acceso SSH debe estar configurado y funcionando. Se recomienda usar claves públicas para evitar escribir contraseñas.
Si desea usar un nombre de usuario y contraseña, escriba los parámetros `-un nombredeusuario -k` para solicitar la validación de la contraseña.
Validación de la conectividad
Antes de iniciar cualquier instalación, verifique que Ansible pueda comunicarse con todos los hosts del inventario ejecutando el siguiente comando:
| # ansible -m ping -i inventario all |
La respuesta debería ser similar a la siguiente:
zbx-prx-01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
zbx-prx-02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
srv-wrk-app-01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
zbx-srv-01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
|
Estandarización del entorno Zabbix con Ansible
Con Ansible, podemos estructurar y estandarizar el entorno de monitorización, como se describe a continuación:
- Características del entorno que alberga
- hostname
- Network
- Users
- timezone
- Estandarizar los paquetes predeterminados instalados
- openssh-server
- bash-completion
- vim
- Estandarizar el estado de configuración
- /etc/hosts
- /etc/resolv.conf
- /etc/selinux/config
- /etc/ssh/sshd_config
La estandarización garantiza la coherencia y facilita el mantenimiento futuro del entorno. En este caso, utilizamos un playbook para estandarizar los servidores implicados.
---
- name: Set Default Config VMs
hosts: all
vars:
user_password: "{{ 'zabbix@1234' | password_hash('sha512') }}"
tasks:
- name: Install essentials packages
yum:
name:
- bash-completion
- vim
state: present
- name: Set hostname VM from inventory_hostname
hostname:
name: "{{ inventory_hostname }}"
- name: Set timezone to America/Sao_Paulo
timezone:
name: America/Sao_Paulo
- name: Create a user called suporte
user:
name: suporte
password: "{{ user_password }}"
state: present
create_home: yes
- name: Add suporte to sudoers
lineinfile:
path: /etc/sudoers
state: present
regexp: '^#?suporte'
line: 'suporte ALL=(ALL) NOPASSWD:ALL'
validate: 'visudo -cf %s'
- name: Adicionar hosts do inventário ao /etc/hosts
lineinfile:
path: /etc/hosts
line: "{{ hostvars[item]['ansible_ssh_host'] }} {{ item }}"
state: present
create: yes
loop: "{{ groups['all'] }}"
when: hostvars[item]['ansible_ssh_host'] is defined
|
Iniciando la estandarización del entorno Zabbix en Ansible.
Ejecute el playbook utilizando el siguiente comando:
# ansible-playbook playbooks/set-default-config-vms-training.yml -i inventario/inventario |
PLAY [Set Default Config VMs] **************************************************************************************** TASK [Gathering Facts] **************************************************************************************** ok: [zbx-prx-01] ok: [zbx-srv-01] ok: [zbx-prx-02] ok: [srv-wrk-app-01] TASK [Install essentials packages] **************************************************************************************** changed: [zbx-prx-01] changed: [srv-wrk-app-01] changed: [zbx-srv-01] changed: [zbx-prx-02] TASK [Set hostname VM from inventory_hostname] **************************************************************************************** changed: [zbx-prx-01] changed: [zbx-srv-01] changed: [srv-wrk-app-01] ... ... ... |
Inicie sesión en los hosts y valide los nombres de las máquinas, los paquetes instalados, el DNS y los usuarios.
Instalación del servidor Zabbix con MySQL
El siguiente paso es instalar el servidor Zabbix con MySQL. El siguiente playbook se creó para demostrar una de las posibles formas de instalar y configurar Zabbix, como la instalación de zabbix-server, zabbix-agent y zabbix-frontend (Zabbix All-in-One MySQL).
--- - name: Instalar Zabbix All-in-One MySQL hosts: zbx_servers vars: zabbix_db_password: "zabbixdbp@ssword" tasks: - name: Validar repositorio epel dnf: name: epel-release state: present - name: Corrigir arquivo repo epel se necessario ini_file: dest: /etc/yum.repos.d/epel.repo section: epel option: enabled value: '1' - name: Desabilitar os pacotes zabbix do repo EPEL community.general.ini_file: path: /etc/yum.repos.d/epel.repo section: epel option: excludepkgs value: zabbix* backup: true - name: Instalar repositorio Zabbix ansible.builtin.dnf: name: 'https://repo.zabbix.com/zabbix/7.4/release/rocky/9/noarch/zabbix-release-latest-7.4.el9.noarch.rpm' state: present disable_gpg_check: true - name: Instalar Banco de dados MYSQL e pacotes Zabbix ansible.builtin.dnf: name: - mysql-server - python3-PyMySQL - platform-python-setuptools - zabbix-server-mysql - zabbix-web-mysql - zabbix-apache-conf - zabbix-sql-scripts - zabbix-selinux-policy - zabbix-agent2 state: present disable_gpg_check: true - name: Iniciar o servico MYSQL ansible.builtin.systemd_service: state: started name: mysqld - name: Configurar a senha de root no MYSQL community.mysql.mysql_user: name: root host: localhost password: "rootp@ssword" login_unix_socket: /var/lib/mysql/mysql.sock update_password: on_create |
- name: Criar banco de dados Zabbix
community.mysql.mysql_db:
name: zabbix
state: present
login_unix_socket: /var/lib/mysql/mysql.sock
collation: utf8mb4_bin
encoding: utf8mb4
- name: Criar usuario zabbix
community.mysql.mysql_user:
state: present
name: zabbix
password: "zabbixp@ssword"
login_unix_socket: /var/lib/mysql/mysql.sock
update_password: on_create
priv: "zabbix.*:ALL"
host: '%'
- name: Popular o banco de dados Zabbix
community.mysql.mysql_db:
name: zabbix
state: import
target: /usr/share/zabbix/sql-scripts/mysql/server.sql.gz
login_unix_socket: /var/lib/mysql/mysql.sock
- name: Ajustar senha do banco de dados no zabbix_server.conf
ansible.builtin.replace:
path: /etc/zabbix/zabbix_server.conf
regexp: '^#?\s*DBPassword='
replace: 'DBPassword=zabbixp@ssword'
- name: Comment parameter Hostname in Zabbix Agent2
replace:
dest: /etc/zabbix/zabbix_agent2.conf
regexp: 'Hostname=.*'
replace: '# Hostname={{ ansible_hostname }}'
- name: Set default parameter Hostname from HostnameItem
replace:
dest: /etc/zabbix/zabbix_agent2.conf
regexp: '# HostnameItem=system.hostname'
replace: 'HostnameItem=system.hostname'
- name: Ensure firewalld is installed and started
dnf:
name: firewalld
state: present
- name: Enable and start firewalld
systemd:
name: firewalld
state: started
enabled: yes
|
- name: Reiniciar servicos
ansible.builtin.systemd_service:
state: restarted
name: "{{ item }}"
enabled: yes
loop:
- zabbix-server
- zabbix-agent2
- httpd
- php-fpm
- firewalld
|
Ejecución:
# ansible-playbook playbooks/install_zabbix_mysql_apache.yml -i inventario |
El resultado del comando será similar a la siguiente salida:
PLAY [Instalar Zabbix All-in-One MySQL] ******************************************** TASK [Gathering Facts] *********************************************************************************** ok: [zbx-srv-01] TASK [Validar repositorio epel] *********************************************************************************** changed: [zbx-srv-01] TASK [Corrigir arquivo repo epel se necessario] *********************************************************************************** changed: [zbx-srv-01] TASK [Desabilitar os pacotes zabbix do repo EPEL] *********************************************************************************** changed: [zbx-srv-01] .... .... TASK [Enable and start firewalld] *********************************************************************************** changed: [zbx-srv-01] TASK [Ajustar regras de firewalld] *********************************************************************************** changed: [zbx-srv-01] => (item=80) changed: [zbx-srv-01] => (item=10050) changed: [zbx-srv-01] => (item=10051) changed: [zbx-srv-01] => (item=23) changed: [zbx-srv-01] => (item=161) changed: [zbx-srv-01] => (item=21) TASK [Reiniciar servicos] *********************************************************************************** changed: [zbx-srv-01] => (item=zabbix-server) changed: [zbx-srv-01] => (item=zabbix-agent2) changed: [zbx-srv-01] => (item=httpd) changed: [zbx-srv-01] => (item=php-fpm) changed: [zbx-srv-01] => (item=firewalld) PLAY RECAP *********************************************************************************** zbx-srv-01: ok=18 changed=16 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
Tras este paso, podrá acceder al frontend web y completar la configuración inicial.
Url: http://enderecoip/zabbix User: Admin Pass: Zabbix
Nota: Como práctica recomendada, debería ajustar su contraseña después de su primer inicio de sesión haciendo clic en Configuración de usuario > Perfil > Cambiar contraseña.
Implementación de proxies Zabbix en Ansible
Para distribuir la carga y monitorizar redes remotas, los proxies son esenciales. El playbook de instalación puede seguir la misma lógica que el del servidor.
A continuación, se muestra un ejemplo de instalación de Zabbix Proxy con SQLite3:
- name: Install Zabbix proxy using SQLite3
hosts: zbx_proxies
become: true
gather_facts: true
vars:
zbxserveraddress: "ip_address_or_dns"
tasks:
- name: Ensure EPEL repository is present
dnf:
name: epel-release
state: present
- name: Fix issues in epel.repo (if necessary)
ini_file:
dest: /etc/yum.repos.d/epel.repo
section: epel
option: enabled
value: '1'
- name: Install Zabbix repository
dnf:
name: 'https://repo.zabbix.com/zabbix/7.4/release/rocky/9/noarch/zabbix-release-latest-7.4.el9.noarch.rpm'
disable_gpg_check: yes
state: present
- name: Disable Zabbix packages from EPEL repo
ini_file:
dest: /etc/yum.repos.d/epel.repo
section: epel
option: excludepkgs
value: "zabbix*"
backup: yes
- name: Install Zabbix packages
dnf:
name:
- zabbix-proxy-sqlite3
- zabbix-selinux-policy
- zabbix-agent2
state: present
- name: Change Hostname Zabbix Proxy
replace:
dest: /etc/zabbix/zabbix_proxy.conf
regexp: 'Hostname=.*'
replace: 'Hostname={{ ansible_hostname }}'
- name: Change DB path Zabbix Proxy SQLite3
replace:
dest: /etc/zabbix/zabbix_proxy.conf
regexp: DBName=zabbix_proxy
replace: DBName=/tmp/zabbixproxydb
state: present
|
- name: Change DB path Zabbix Proxy SQLite3
replace:
dest: /etc/zabbix/zabbix_proxy.conf
regexp: DBName=zabbix_proxy
replace: DBName=/tmp/zabbixproxydb
- name: Change Server
replace:
dest: /etc/zabbix/zabbix_proxy.conf
regexp: Server=127.0.0.1
replace: Server={{ zbxserveraddress }}
- name: Comment parameter Hostname in Zabbix Agent2
replace:
dest: /etc/zabbix/zabbix_agent2.conf
regexp: 'Hostname=.*'
replace: '# Hostname={{ ansible_hostname }}'
- name: Set default parameter Hostname from HostnameItem
replace:
dest: /etc/zabbix/zabbix_agent2.conf
regexp: '# HostnameItem=system.hostname'
replace: 'HostnameItem=system.hostname'
- name: Ensure firewalld is installed and started
dnf:
name: firewalld
state: present
- name: Enable and start firewalld
systemd:
name: firewalld
state: started
enabled: yes
- name: Open TCP ports in firewall
firewalld:
port: "{{ item }}/tcp"
permanent: true
state: enabled
loop:
- 80
- 10050
- 10051
- 23
- 161
- 21
- name: Open UDP ports in firewall
firewalld:
port: "{{ item }}/udp"
permanent: true
state: enabled
loop:
- 162
- 161
- name: Reload firewalld
service:
name: firewalld
state: reloaded
- name: Enable and restart Zabbix services
systemd:
name: "{{ item }}"
state: restarted
enabled: yes
loop:
- zabbix-proxy
- zabbix-agent2
|
- name: Consultar e configurar Zabbix via API
hosts: localhost
gather_facts: false
vars:
ansible_connection: httpapi
ansible_network_os: community.zabbix.zabbix
ansible_httpapi_port: 80
ansible_httpapi_use_ssl: false
ansible_httpapi_validate_certs: false
ansible_zabbix_url_path: 'zabbix'
ansible_host: ip_address_or_dns_zabbix_server
ansible_user: zabbix_user
ansible_httpapi_pass: zabbix_password
tasks:
- name: Obter informações da API do Zabbix
community.zabbix.zabbix_api_info:
register: zbx_api_info
tags: zabbix-api
- name: Exibir versão da API
debug:
msg: "Versão da API do Zabbix: {{ zbx_api_info.api.version }}"
tags: zabbix-api
- name: Registrar proxies via API
community.zabbix.zabbix_proxy:
proxy_name: "{{ item }}"
description: "Proxy instalado via Ansible"
status: active
state: present
loop: "{{ groups['zbx_proxies'] }}"
tags: zabbix-api
- name: Criar grupo "Zabbix proxies"
community.zabbix.zabbix_group:
host_groups:
- Zabbix proxies
state: present
tags: zabbix-api
- name: Criar hosts monitorados via proxy com base no inventário
community.zabbix.zabbix_host:
host_name: "{{ item }}"
visible_name: "{{ item }}"
interfaces:
- type: 1
main: 1
useip: 1
ip: "127.0.0.1"
dns: ""
port: "10050"
host_groups:
- "Zabbix proxies"
proxy: "{{ item }}"
link_templates:
- "Linux by Zabbix agent"
- "Zabbix proxy health"
state: present
monitored_by: proxy
loop: "{{ groups['zbx_proxies'] }}"
tags: zabbix-api
|
Ejecución:
# ansible-playbook playbooks/install_zabbix_proxy_sqlite3.yml -i inventario/inventario |
El resultado del comando será similar a la siguiente salida:
PLAY [Install Zabbix proxy using SQLite3] *********************************************************************************** TASK [Gathering Facts] *********************************************************************************** ok: [zbx-prx-02] ok: [zbx-prx-01] TASK [Ensure EPEL repository is present] *********************************************************************************** changed: [zbx-prx-02] changed: [zbx-prx-01] TASK [Fix issues in epel.repo (if necessary)] *********************************************************************************** changed: [zbx-prx-02] changed: [zbx-prx-01] ...... ...... ...... ...... TASK [Criar grupo "Zabbix proxies"] *********************************************************************************** changed: [localhost] TASK [Criar hosts monitorados via proxy com base no inventário] *********************************************************************************** changed: [localhost] => (item=zbx-prx-01) changed: [localhost] => (item=zbx-prx-02) PLAY RECAP *********************************************************************************** localhost : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 zbx-prx-01 : ok=17 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 zbx-prx-02 : ok=17 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
A continuación, debemos:
- Validar si los proxies se registraron mediante API en el grupo correcto para su monitorización;
- Validar si los proxies se están monitorizando mediante el proxy de Zabbix.
Instalación de agentes Zabbix
Los agentes recopilan datos de cada host. El siguiente playbook ejecuta la instalación de los agentes (Zabbix Agent2) en los servidores del entorno que se va a monitorizar.
---
- name: Install and configure Zabbix Agent2
hosts: workshop_apps
become: true
tasks:
- name: Ensure EPEL repository is present
dnf:
name: epel-release
state: present
- name: Fix issues in epel.repo (if necessary)
ini_file:
dest: /etc/yum.repos.d/epel.repo
section: epel
option: enabled
value: '1'
- name: Install Zabbix repository
dnf:
name: 'https://repo.zabbix.com/zabbix/7.4/release/rocky/9/noarch/zabbix-release-latest-7.4.el9.noarch.rpm'
disable_gpg_check: yes
state: present
- name: Disable Zabbix packages from EPEL repo
ini_file:
dest: /etc/yum.repos.d/epel.repo
section: epel
option: excludepkgs
value: "zabbix*"
backup: yes
- name: Install Zabbix Agent2 and SELinux policy
dnf:
name:
- zabbix-agent2
- zabbix-selinux-policy
state: present
- name: Configure Server in zabbix_agent2.conf
lineinfile:
path: /etc/zabbix/zabbix_agent2.conf
regexp: '^Server='
line: "Server={{ hostvars[inventory_hostname]['zabbix_proxy'] }}"
create: yes
- name: Configure ServerActive in zabbix_agent2.conf
lineinfile:
path: /etc/zabbix/zabbix_agent2.conf
regexp: '^ServerActive='
line: "ServerActive={{ hostvars[inventory_hostname]['zabbix_proxy'] }}"
create: yes
- name: Comment out Hostname parameter
lineinfile:
path: /etc/zabbix/zabbix_agent2.conf
regexp: '^Hostname='
line: '# Hostname={{ ansible_hostname }}'
create: yes
|
- name: Set HostnameItem=system.hostname lineinfile: path: /etc/zabbix/zabbix_agent2.conf regexp: '^#?HostnameItem=' line: 'HostnameItem=system.hostname' create: yes - name: Add AllowKey=system.run[*] for remote commands lineinfile: path: /etc/zabbix/zabbix_agent2.conf line: 'AllowKey=system.run[*]' insertafter: EOF state: present - name: Ensure firewalld is installed dnf: name: firewalld state: present - name: Enable and start firewalld systemd: name: firewalld state: started enabled: yes - name: Open port 10050/tcp in firewalld firewalld: port: 10050/tcp permanent: true state: enabled immediate: yes - name: Enable and restart zabbix-agent2 systemd: name: zabbix-agent2 state: restarted enabled: yes |
Ejecución:
# ansible-playbook playbooks/install_zabbix_agent2.yml -i inventario/inventario |
El resultado del comando será similar a la siguiente salida:
PLAY [Install and configure Zabbix Agent2] *********************************************************************************** TASK [Gathering Facts] *********************************************************************************** ok: [srv-wrk-app-01] TASK [Ensure EPEL repository is present] *********************************************************************************** changed: [srv-wrk-app-01] TASK [Fix issues in epel.repo (if necessary)] *********************************************************************************** changed: [srv-wrk-app-01] TASK [Install Zabbix repository] *********************************************************************************** changed: [srv-wrk-app-01] .... .... .... .... TASK [Enable and start firewalld] *********************************************************************************** changed: [zbx-srv-01] TASK [Ajustar regras de firewalld] *********************************************************************************** changed: [zbx-srv-01] => (item=80) changed: [zbx-srv-01] => (item=10050) changed: [zbx-srv-01] => (item=10051) changed: [zbx-srv-01] => (item=23) changed: [zbx-srv-01] => (item=161) changed: [zbx-srv-01] => (item=21) TASK [Reiniciar servicos] *********************************************************************************** changed: [zbx-srv-01] => (item=zabbix-server) changed: [zbx-srv-01] => (item=zabbix-agent2) changed: [zbx-srv-01] => (item=httpd) changed: [zbx-srv-01] => (item=php-fpm) changed: [zbx-srv-01] => (item=firewalld) PLAY RECAP *********************************************************************************** zbx-srv-01 : ok=18 changed=16 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
Registro automatizado de hosts mediante API en Ansible
Es posible automatizar el registro de hosts mediante la API y los módulos de la colección community.zabbix.
A continuación, se muestra el playbook para crear hosts automáticamente en Zabbix con Ansible.
- name: Consultar API Zabbix
hosts: localhost
gather_facts: false
vars:
ansible_connection: httpapi
ansible_network_os: community.zabbix.zabbix
ansible_httpapi_port: 80
ansible_httpapi_use_ssl: false
ansible_httpapi_validate_certs: false
ansible_zabbix_url_path: 'zabbix'
ansible_host: ip_address_or_dns_zabbix_server
ansible_user: zabbix_user
ansible_httpapi_pass: zabbix_password
tasks:
- name: Obter informações do Zabbix
community.zabbix.zabbix_api_info:
register: zbx_api_info
tags: create_host
- name: Exibir versão da API
debug:
msg: "Versão da API do Zabbix: {{ zbx_api_info.api.version }}"
tags: create_host
- name: Criar grupo "ZBXLabs Apps"
community.zabbix.zabbix_group:
host_groups:
- ZBXLabs Apps
state: present
tags: create_host
- name: Criar hosts monitorados via proxy com base no inventário
community.zabbix.zabbix_host:
host_name: "{{ item }}"
visible_name: "{{ item }}"
interfaces:
- type: 1
main: 1
useip: 1
ip: "{{ hostvars[item]['ansible_ssh_host'] }}"
dns: ""
port: "10050"
host_groups:
- "ZBXLabs Apps"
proxy: "{{ hostvars[item]['zabbix_proxy'] }}"
link_templates:
- "Linux by Zabbix agent"
state: present
monitored_by: proxy
loop: "{{ groups['workshop_apps'] }}"
tags: create_host
|
Ejecución:
# ansible-playbook playbooks/create_hosts_zabbix.yml -i inventario/inventario |
El resultado del comando será similar a la siguiente salida:
PLAY [Consultar API Zabbix]
***********************************************************************************
TASK [Obter informações do Zabbix] ***********************************************************************************
ok: [localhost]
TASK [Exibir versão da API]
***********************************************************************************
ok: [localhost] => {
"msg": "Versão da API do Zabbix: 7.4.1"
}
TASK [Criar grupo "ZBXLabs Apps"] ***********************************************************************************
changed: [localhost]
TASK [Criar hosts monitorados via proxy com base no inventário] ***********************************************************************************
changed: [localhost] => (item=srv-wrk-app-01)
PLAY RECAP
***********************************************************************************
localhost : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
Importante: Verifique que los proxies se estén monitoreando correctamente a través del proxy de Zabbix.
Automatización de aplicaciones
Además de la infraestructura, es posible automatizar el deploy de aplicaciones, como un servidor Apache monitorizado.
Por ejemplo, aquí tienes el playbook para instalar Apache:
---
- name: Instalar e configurar Apache com página web de exemplo
hosts: workshop_apps
become: true
vars:
web_index_message: "Aplicação exemplo funcionando em {{ inventory_hostname }}"
tasks:
- name: Instalar Apache (httpd)
dnf:
name: httpd
state: present
- name: Ativar e iniciar o serviço Apache
systemd:
name: httpd
state: started
enabled: true
- name: Criar página index.html
copy:
dest: /var/www/html/index.html
content: |
<html>
<head><title>My Company Application</title></head>
<body>
<h1>{{ web_index_message }}</h1>
<p>Servidor Apache configurado via Ansible.</p>
<p>Webinar: Construindo um ambiente Zabbix com Ansible.</p>
</body>
</html>
owner: root
group: root
mode: '0644'
- name: Garantir que firewalld está instalado
dnf:
name: firewalld
state: present
- name: Iniciar e ativar firewalld
systemd:
name: firewalld
state: started
enabled: true
- name: Liberar porta 80/tcp no firewall
firewalld:
port: 80/tcp
permanent: true
state: enabled
immediate: true
- name: Verificar se a página está acessível localmente
uri:
url: http://localhost
return_content: yes
register: web_test
- name: Exibir conteúdo retornado da aplicação web
debug:
var: web_test.content
|
Ejecución:
# ansible-playbook playbooks/install_apache_app.yml -i inventario/inventario |
El resultado del comando será similar a la siguiente salida:
PLAY [Instalar e configurar Apache com página web de exemplo] ***********************************************************************************
TASK [Gathering Facts]
***********************************************************************************
ok: [srv-wrk-app-01]
TASK [Instalar Apache (httpd)]
***********************************************************************************
changed: [srv-wrk-app-01]
TASK [Ativar e iniciar o serviço Apache] ***********************************************************************************
changed: [srv-wrk-app-01]
TASK [Criar página index.html com mensagem personalizada] ***********************************************************************************
changed: [srv-wrk-app-01]
TASK [Garantir que firewalld está instalado] ***********************************************************************************
ok: [srv-wrk-app-01]
TASK [Iniciar e ativar firewalld] ***********************************************************************************
ok: [srv-wrk-app-01]
TASK [Liberar porta 80/tcp no firewall] ***********************************************************************************
changed: [srv-wrk-app-01]
TASK [Verificar se a página está acessível localmente] ***********************************************************************************
ok: [srv-wrk-app-01]
TASK [Exibir conteúdo retornado da aplicação web] ***********************************************************************************
ok: [srv-wrk-app-01] => {
"web_test.content": "<html>\n<head><title>My Company Application</title></head>\n<body>\n <h1>Aplicação exemplo funcionando em srv-wrk-app-01</h1>\n <p>Servidor Apache configurado via Ansible.</p>\n <p>Webinar: Construindo um ambiente Zabbix com Ansible.</p>\n</body>\n</html>\n"
}
PLAY RECAP
***********************************************************************************
srv-wrk-app-01 : ok=9 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
Zabbix puede monitorizar este servicio y activar un playbook para reiniciar Apache si se detiene.
Buenas prácticas para la integración de Zabbix y Ansible
- Proteja las credenciales con Ansible Vault (ansible-vault encrypt).
- Use roles para organizar playbooks, archivos, variables y tareas.
- Realice pruebas en un entorno de preproducción antes de implementar en producción.
- Mantenga inventarios actualizados y seguros para entornos de gran tamaño.
La integración entre Zabbix y Ansible lleva la monitorización a otro nivel. Con playbooks bien estructurados, es posible crear o restaurar un entorno completo, estandarizado y listo para producción en cuestión de minutos. La automatización no solo acelera las implementaciones, sino que también garantiza la consistencia, la seguridad y la escalabilidad.