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.

Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x