Automatizar a implantação e configuração de um ambiente Zabbix pode economizar horas de trabalho e evitar erros manuais. O Ansible é uma das ferramentas mais indicadas para essa tarefa: fácil de aprender, baseada em SSH (dispensa agentes) e extremamente flexível.

Este guia mostra como criar um ambiente Zabbix completo utilizando Ansible, do servidor aos proxies, agentes e até aplicações, com exemplos reais de comandos e playbooks.

O que é Ansible?

O Ansible foi criado em 2012 por Michael DeHaan, engenheiro de software que já havia participado de outros projetos de automação, como o Cobbler e o Func. Ele buscava resolver limitações das ferramentas mais populares da época, como Puppet e Chef, que exigiam agentes instalados e tinham linguagens complexas.

Os objetivos do Ansible desde o início foram:

  • Usar protocolos padrão (SSH, WinRM) sem instalar agentes;
  • Ter linguagem simples e legível (YAML);
  • Garantir idempotência e aplicar mudanças apenas quando necessário;
  • Oferecer uma curva de aprendizado rápida.

O nome “Ansible” vem da ficção científica: um dispositivo capaz de comunicação instantânea a qualquer distância, metáfora para a capacidade da ferramenta de controlar múltiplos servidores rapidamente.

Em 2015, a Red Hat adquiriu a Ansible, Inc., fortalecendo o uso corporativo com o Ansible Tower (hoje Red Hat Ansible Automation Platform), que oferece interface web, API e recursos de orquestração em larga escala.

Por que usar Ansible com Zabbix?

Ao trabalhar com Zabbix, lidamos com múltiplos elementos: servidor central, proxies, agentes e integrações. O Ansible facilita:

  • Padronização: todos os componentes configurados de forma idêntica;
  • Velocidade: implantação em dezenas de hosts simultaneamente;
  • Flexibilidade: adaptação a cenários distintos de rede e monitoramento;
  • Automação: desde a instalação até ajustes finos e integrações via API.

Utilizando Ansible para estruturar o Zabbix

O Ansible executa tarefas por meio de playbooks, que são arquivos YAML contendo a descrição das ações a realizar: instalação de pacotes, configuração de serviços, criação de usuários, ajustes de permissões e muito mais.

No contexto do Zabbix, isso significa poder:

  • Padronizar a configuração de servidores, proxies e agentes;
  • Instalar e registrar componentes no Zabbix via API;
  • Ajustar parâmetros de segurança e performance de forma centralizada;
  • Automatizar respostas a eventos e incidentes.

A lógica é simples: definir no código o estado desejado do ambiente e deixar o Ansible aplicar as mudanças.

A seguir, preparamos um passo a passo explicativo para que iniciar a construção de um ambiente Zabbix com Ansible.

Pré-requisitos

Servidores para teste:

Função Nome Ip S.O CPU Memória
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

Preparando o ambiente

O primeiro passo é instalar o Ansible no host de controle. Neste cenário, utilizamos a distribuição Redhat/Rock Linux 9.

  • Instalar Ansible no servidor Rock Linux:
# dnf install ansible-core

Será necessário um arquivo de inventário com os hosts que serão gerenciados. No exemplo abaixo, temos um Zabbix Server, dois proxies e um servidor de aplicação:

  • Criar o diretório do projeto:
# mkdir zabbix-labs
  • Criar e adicionar o conteúdo ao arquivo de inventário, que pode ser criado no diretório do projeto:
# vim /zabbix-labs/inventario
  • Adicionar conteúdo ao arquivo:
[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

O acesso SSH deve estar configurado e funcional. Recomenda-se usar chaves públicas para evitar digitação de senhas.

Caso queira utilizar usuário e senha, digite os parâmetros -u nome do usuário -k para solicitar validação de senha.

Validando a conectividade

Antes de iniciar qualquer instalação, valide se o Ansible consegue se comunicar com todos os hosts do inventário, executando o comando a seguir:

# ansible -m ping -i inventario all

A resposta deve ser algo semelhante a saída a seguir:

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"
}

Padronização do ambiente Zabbix com Ansible

Com Ansible, podemos estrutura e padronizar o ambiente de monitoramento, conforme descrito abaixo:

  • Caracteristicas dos hosts do ambiente
    • hostname
    • Network
    • Users
    • timezone
  • Padronizar pacotes padrões instalados
    • openssh-server
    • bash-completion
    • vim
  • Padronizar estado de configuração
    • /etc/hosts
    • /etc/resolv.conf
    • /etc/selinux/config
    • /etc/ssh/sshd_config

A padronização garante consistência e facilita futuras manutenções no ambiente. Para este cenário, utilizamos um playbook para padronizar os servidores envolvidos.

---
- 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 a padronização do ambiente Zabbix com Ansible

Execute o playbook com o comando a seguir:

# 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]
...
...
...

Faça login nos hosts e valide a nomemclatura das maquinas, pacotes instalados, DNS e usuarios.

Instalando o Zabbix Server com MySQL

O próximo passo é instalar o Zabbix Server com MySQL. O playbook a seguir foi criado para demonstrar umas das possibilidades de instalação e configuração do Zabbix, como a instalação do zabbix-server, zabbix-agent e 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

Execução:

# ansible-playbook playbooks/install_zabbix_mysql_apache.yml -i inventario

O resultado do comando será semelhante a saída a seguir:

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

Após essa etapa, é possível acessar o frontend web e completar a configuração inicial.

Url: http://enderecoip/zabbix
User: Admin
Pass: Zabbix

Observação: como boa prática, devemos ajustar a senha após o primeiro login, clicando em User Settings > Profile > Change password.

Implantando proxies do Zabbix no Ansible

Para distribuir a carga e monitorar redes remotas, proxies são essenciais. O playbook de instalação pode seguir a mesma lógica do servidor.

Confira abaixo um exemplo para instalar o Zabbix Proxy com 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

Execução:

# ansible-playbook playbooks/install_zabbix_proxy_sqlite3.yml -i inventario/inventario

O resultado do comando será semelhante a saída a seguir:

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 seguir, devemos:

  • Validar se os proxies foram cadastrados via API no grupo correto para serem monitorados;
  • Validar se os proxies estão monitorados via Zabbix proxy.

Instalando Agentes Zabbix

Os agentes coletam dados de cada host. O playbook a seguir executa a instalação dos agentes (Zabbix Agent2) nos servidores do ambiente a serem monitorados.

---
- 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

Execução:

# ansible-playbook playbooks/install_zabbix_agent2.yml -i inventario/inventario

O resultado do comando será semelhante a saída a seguir:

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

Cadastro de hosts automatizado via API no Ansible

É possível automatizar o cadastro de hosts utilizando a API e os módulos da collection community.zabbix.

A seguir, está o playbook para criar hosts automaticamente no Zabbix com 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

Execução:

# ansible-playbook playbooks/create_hosts_zabbix.yml -i inventario/inventario

O resultado do comando será semelhante a saída a seguir:

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: faça a validação se os proxies estão corretamente monitorados via Zabbix proxy.

Automação de aplicações

Além de infraestrutura, é possível automatizar o deploy de aplicações, como um Apache monitorado.

Como exemplo, segue o playbook para realizar a instalação do 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

Execução:

# ansible-playbook playbooks/install_apache_app.yml -i inventario/inventario

O resultado do comando será semelhante a saída a seguir:

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

O Zabbix pode monitorar esse serviço e acionar um playbook para reiniciar o Apache, caso o mesmo pare..

Boas práticas ao integrar Zabbix e Ansible

  • Proteger credenciais com Ansible Vault (ansible-vault encrypt).
  • Utilizar roles para organizar os playbooks , arquivos, variáveis e tarefas.
  • Testar em ambiente de homologação antes de aplicar em produção.
  • Manter inventários atualizado e seguro para ambientes grandes.

A integração entre Zabbix e Ansible leva o monitoramento a outro nível. Com playbooks bem estruturados, é possível criar ou restaurar um ambiente completo em minutos, padronizado e pronto para produção. A automação não só agiliza implantações como garante consistência, segurança e escalabilidade.

Inscrever-se
Notificar de
0 Comments
mais antigos
mais recentes Mais votado
Feedbacks embutidos
Ver todos os comentários
0
Adoraria saber sua opinião, comente.x