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.