Voltamos com a 3º e ultima parte do Artigo primeiros passos com o Ansible, hoje iremos criar uma Role chamada Zabbix Server e verificar seu funcionamento.
Roles:
As Roles disponibilizam uma estrutura baseada na ideia de incluir arquivos e combina-los para formar abstrações limpas e reutilizáveis, permitindo que você se concentre mais no cenário geral e só foque nos detalhe quando houver necessidade.
Do que são formadas?
Abaixo iremos mostrar a estrutura padrão de pastas em uma role no Ansible:
Defaults:
É o diretório onde são definidas as variáveis padrões que serão utilizadas na Role. Todos os padrões definidos em Defaults podem ser substituídos nos arquivos de Playbook, Inventory e Templates.
Handlers:
É o diretório onde são inseridas listas de tarefas opcionais, responsáveis por realizar os comandos para inciar ou restartar uma aplicação ou serviço recém instalado. Os Handlers são notificados após a execução das Tasks, caso mais de uma Task solicite a execução de um Handler, elas só serão executadas no final do bloco das Tasks.
Tasks:
É o diretório onde são inseridos os arquivos para execução dos Playbooks, Tasks e Modules.
Templates:
É o diretório onde serão inseridos os Templates que irão gerar arquivos nos hosts alvo do Ansible, os arquivos de Templates geralmente utilizam as variáveis declaradas em Defaults ou em uma pasta destinada para as demais variáveis.
Criando a Role:
1) Iremos criar um role com o nome de ZabbixServerAllInOne na pasta roles no diretório do Ansible, com as seguintes subpastas:
cd /etc/ansible/roles/ mkdir ZabbixServerAllInOne mkdir ZabbixServerAllInOne/defaults mkdir ZabbixServerAllInOne/handlers mkdir ZabbixServerAllInOne/tasks mkdir ZabbixServerAllInOne/templates
Criar arquivo um chamado deploy.yml:
touch deploy.yml
Inserir no arquivo os comandos baixo:
- name: Install Zabbix Server hosts: 10.0.0.240 roles: - ZabbixServerAllInOne
2) Acessar o diretório Defaults e criar o arquivo padrão com as variáveis que serão utilizadas:
cd /defaults
Criar o arquivo main.yml onde serão definidas todas as variavels que serão utilizadas na Role para instalação do Zabbix Server:
vim main.yml
Inserir no arquivo os comandos abaixo:
zabbix_version: 4.4 zbx_server_address: 127.0.0.1 zbx_frontend_address: 127.0.0.1 zbx_database_address: 127.0.0.1 zbx_database_saas: False mysql_root_password: Zabbixdb#2019! zbx_database_user: zabbix zbx_database_password: ZabbixDB#2019! zabbix_server_package_state: present zabbix_server_install_recommends: True zabbix_server_install_database_cliente: True zabbix_repo: zabbix zabbix_repo_yum: - name: zabbix description: Zabbix Official Repository - $basearch baseurl: http://repo.zabbix.com/zabbix/{{ zabbix_version }}/rhel/{{ ansible_distribution_major_version }}/$basearch/ gpgcheck: 0 gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX state: present - name: zabbix-supported description: Zabbix Official Repository non-supported - $basearch baseurl: http://repo.zabbix.com/non-supported/rhel/{{ ansible_distribution_major_version }}/$basearch/ gpgcheck: 0 gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX state: present # Zabbix Server parameters zbx_start_pollers: 10 zbx_start_pollersunreachable: 10 zbx_start_trappers: 10 zbx_start_pingers: 10 zbx_timeout: 30 zbx_cache_size: 256M zbx_value_cache_size: 256M # Frontend parameters time_zone: America/Sao_Paulo # Database zabbix_server_database: mysql # mysql or pgsql zabbix_server_database_long: mysql # mysql or postgresql zabbix_database_creation: True zabbix_database_sqlload: True # MySQL mysql_repo: https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
Onde:
As variáveis declaradas no arquivo main.yml seguem o padrão:
nome_variável: valor_variável
Ex:
zbx_server_address: 127.0.0.1
3) Acessar o diretório Tasks e criar os Playbooks para a instalação do Zabbix, iremos separar por arquivos as tarefas a serem executadas:
cd /tasks
Criar um arquivo chamado common.yml que será o arquivo onde estarão as Tasks e Modules para a instalação dos pré requisitos para instalação do Zabbix Server:
vim commom.yml
Inserir os comandos abaixo no arquivo:
- name: Debug IPv4 debug: msg: "{{ ansible_default_ipv4.address }} {{ ansible_all_ipv4_addresses[0] }} {{ ansible_lo.ipv4.address }} {{ zbx_server_address }} {{ zbx_frontend_address }} {{ zbx_database_address }}" - name: Disable SELinux selinux: state: disabled - name: Install packages yum: name: - epel-release - net-tools - vim - nano - wget - telnet - rsync - git - python36 - python36-pip state: present - name: Install python packages yum: name: - python - python-pip state: present - name: Install pip packages pip: name: - pymysql
Criar um arquivo chamado MySQL.yml que será o arquivo responsável pela instalação e configuração do MySQL:
vim MySQL.yml
Inserir os comandos abaixo no arquivo:
- name: Install repo MySQL yum: name: "{{ mysql_repo }}" state: latest - name: Install MySQL server yum: name: mysql-server state: present - name: Start MySQL and enable on boot service: name: mysqld state: started enabled: yes - name: Find MySQL temporary password shell: "grep temporary.*root@localhost /var/log/mysqld.log | sed 's/.*root@localhost: //' | tail -n 1" register: mysql_root_password_temp - name: Debug MySQL temporary password debug: msg: "{{ mysql_root_password_temp.stdout }}" - name: Detect and properly set root password stat: path: /root/.my.cnf register: r - mysql_user: name: root password: "{{ mysql_root_password }}" when: r.stat.exists==True - name: Set new password from temporary password shell: 'mysql -e "SET PASSWORD = PASSWORD(''{{ mysql_root_password }}'');" --connect-expired-password -uroot -p"{{ mysql_root_password_temp.stdout }}"' when: r.stat.exists==False - name: Create `/root/.my.cnf` with root password credentials template: src: user.root.my.cnf.j2 dest: /root/.my.cnf owner: root mode: 0600 force: yes - name: Remove anonymous MySQL user accounts mysql_user: name: '' state: absent - name: Remove MySQL database test mysql_db: name: test state: absent - name: Create database zabbix mysql_db: login_user: root login_password: "{{ mysql_root_password }}" name: zabbix encoding: utf8 collation: utf8_bin state: present - name: Create zabbix MySQL user accounts mysql_user: name={{ zbx_database_user }} password={{ zbx_database_password }} priv=zabbix.*:ALL host={{ item }} state=present with_items: - "{{ zbx_server_address }}" - "{{ zbx_frontend_address }}" - "{{ zbx_database_address }}" notify: restart mysql
Criar um arquivo chamado Zbx-server.yml que será responsável pela instalação e configuração do Zabbix Server:
vim Zbx-server.yml
Inserir os comandos abaixo no arquivo:
- name: Set some fact set_fact: zabbix_short_version: "{{ zabbix_version | regex_replace('\\.', '') }}" - name: Install Zabbix Repo. yum_repository: name: "{{ item.name }}" description: "{{ item.description }}" baseurl: "{{ item.baseurl }}" gpgcheck: "{{ item.gpgcheck }}" gpgkey: "{{ item.gpgkey }}" state: "{{ item.state | default('present') }}" with_items: "{{ zabbix_repo_yum }}" - name: Install package Zabbix yum: name: - zabbix-server-{{ zabbix_server_database }} - zabbix-get - zabbix-sender - name: Import initial schema zabbix database shell: "zcat /usr/share/doc/zabbix-server-{{ zabbix_server_database }}*/create.sql.gz | mysql -h {{ zbx_database_address }} -u{{ zbx_database_user }} -p{{ zbx_database_password }} zabbix" register: result_schema - name: Debug debug: msg: "{{ result_schema }}" - name: Create /etc/zabbix/scripts file: path: /etc/zabbix/scripts state: directory recurse: yes - name: Make sure zabbix-server service is running systemd: name: zabbix-server state: started enabled: yes - name: Copy zabbix_server.conf template template: src: templates/zabbix_server.conf.44.j2 dest: /etc/zabbix/zabbix_server.conf notify: restart zabbix-server
Criar um arquivo chamado Zbx-frontend.yml que será responsável pela instalação e configuração do Zabbix Front End :
vim Zbx-frontend.yml
Inserir os comandos abaixo no arquivo:
- name: Set some fact set_fact: zabbix_short_version: "{{ zabbix_version | regex_replace('\\.', '') }}" - name: Install Zabbix Repo. yum_repository: name: "{{ item.name }}" description: "{{ item.description }}" baseurl: "{{ item.baseurl }}" gpgcheck: "{{ item.gpgcheck }}" gpgkey: "{{ item.gpgkey }}" state: "{{ item.state | default('present') }}" with_items: "{{ zabbix_repo_yum }}" - name: Install package Zabbix yum: name: - zabbix-web-{{ zabbix_server_database }} - zabbix-get - zabbix-sender - name: Make sure httpd service is running systemd: name: httpd state: started enabled: yes - name: Copy web.zabbix.conf template template: src: templates/web.zabbix.conf.j2 dest: /etc/httpd/conf.d/zabbix.conf notify: restart httpd - name: Create firewall rule firewalld: port: 80/tcp permanent: yes immediate: yes state: enabled - name: Firewalld reload command: firewall-cmd --reload
Criar um arquivo chamado main.yml que será responsável por chamar os arquivos criados anteriormente:
vim main.yml
Inserir os comandos abaixo no arquivo:
- name: Install common packages include_tasks: "common.yml" - name: Install Database include_tasks: "MySQL.yml" - name: Install Zabbix Server include: "Zbx-server.yml" - name: Install Frontend include: "Zbx-frontend.yml"
4) Acessar o diretório Templates e criar os modelos de arquivos que iremos utilizar na instalação do Zabbix:
cd /templates
Criar um arquivo chamado user.root.mycnf.j2 que será responsável por habilitar a senha de root do MySQL:
vim user.root.mycnf.j2
Inserir os comandos abaixo no arquivo criado:
[client] user=root password="{{ mysql_root_password }}"
Criar um arquivo chamado zabbix_server.conf.44.j2, que será responsável por alterar os parâmetros no arquivo de configuração do Zabbix Server conforme as variáveis declaradas no Default:
vim zabbix_server.conf.44.j2
Inserir os comandos abaixo no arquivo criado:
# This is a configuration file for Zabbix server daemon
# To get more information about Zabbix, visit http://www.zabbix.com
############ GENERAL PARAMETERS #################
### Option: ListenPort
# Listen port for trapper.
#
# Mandatory: no
# Range: 1024-32767
# Default:
# ListenPort=10051
### Option: SourceIP
# Source IP address for outgoing connections.
#
# Mandatory: no
# Default:
# SourceIP=
### Option: LogType
# Specifies where log messages are written to:
# system - syslog
# file - file specified with LogFile parameter
# console - standard output
#
# Mandatory: no
# Default:
# LogType=file
### Option: LogFile
# Log file name for LogType 'file' parameter.
#
# Mandatory: yes, if LogType is set to file, otherwise no
# Default:
# LogFile=
LogFile=/var/log/zabbix/zabbix_server.log
### Option: LogFileSize
# Maximum size of log file in MB.
# 0 - disable automatic log rotation.
#
# Mandatory: no
# Range: 0-1024
# Default:
# LogFileSize=1
LogFileSize=0
### Option: DebugLevel
# Specifies debug level:
# 0 - basic information about starting and stopping of Zabbix processes
# 1 - critical information
# 2 - error information
# 3 - warnings
# 4 - for debugging (produces lots of information)
# 5 - extended debugging (produces even more information)
#
# Mandatory: no
# Range: 0-5
# Default:
# DebugLevel=3
### Option: PidFile
# Name of PID file.
#
# Mandatory: no
# Default:
# PidFile=/tmp/zabbix_server.pid
PidFile=/var/run/zabbix/zabbix_server.pid
### Option: SocketDir
# IPC socket directory.
# Directory to store IPC sockets used by internal Zabbix services.
#
# Mandatory: no
# Default:
# SocketDir=/tmp
SocketDir=/var/run/zabbix
### Option: DBHost
# Database host name.
# If set to localhost, socket is used for MySQL.
# If set to empty string, socket is used for PostgreSQL.
#
# Mandatory: no
# Default:
DBHost={{ zbx_database_address }}
### Option: DBName
# Database name.
#
# Mandatory: yes
# Default:
# DBName=
DBName=zabbix
### Option: DBSchema
# Schema name. Used for IBM DB2 and PostgreSQL.
#
# Mandatory: no
# Default:
# DBSchema=
### Option: DBUser
# Database user.
#
# Mandatory: no
# Default:
# DBUser=
DBUser=zabbix
### Option: DBPassword
# Database password.
# Comment this line if no password is used.
#
# Mandatory: no
# Default:
DBPassword={{ zbx_database_password }}
### Option: DBSocket
# Path to MySQL socket.
#
# Mandatory: no
# Default:
# DBSocket=
### Option: DBPort
# Database port when not using local socket.
#
# Mandatory: no
# Range: 1024-65535
# Default:
# DBPort=
### Option: HistoryStorageURL
# History storage HTTP[S] URL.
#
# Mandatory: no
# Default:
# HistoryStorageURL=
### Option: HistoryStorageTypes
# Comma separated list of value types to be sent to the history storage.
#
# Mandatory: no
# Default:
# HistoryStorageTypes=uint,dbl,str,log,text
### Option: HistoryStorageDateIndex
# Enable preprocessing of history values in history storage to store values in different indices based on date.
# 0 - disable
# 1 - enable
#
# Mandatory: no
# Default:
# HistoryStorageDateIndex=0
### Option: ExportDir
# Directory for real time export of events, history and trends in newline delimited JSON format.
# If set, enables real time export.
#
# Mandatory: no
# Default:
# ExportDir=
### Option: ExportFileSize
# Maximum size per export file in bytes.
# Only used for rotation if ExportDir is set.
#
# Mandatory: no
# Range: 1M-1G
# Default:
# ExportFileSize=1G
############ ADVANCED PARAMETERS ################
### Option: StartPollers
# Number of pre-forked instances of pollers.
#
# Mandatory: no
# Range: 0-1000
# Default:
StartPollers={{ zbx_start_pollers | default('5') }}
### Option: StartIPMIPollers
# Number of pre-forked instances of IPMI pollers.
# The IPMI manager process is automatically started when at least one IPMI poller is started.
#
# Mandatory: no
# Range: 0-1000
# Default:
# StartIPMIPollers=0
### Option: StartPreprocessors
# Number of pre-forked instances of preprocessing workers.
# The preprocessing manager process is automatically started when preprocessor worker is started.
#
# Mandatory: no
# Range: 1-1000
# Default:
# StartPreprocessors=3
### Option: StartPollersUnreachable
# Number of pre-forked instances of pollers for unreachable hosts (including IPMI and Java).
# At least one poller for unreachable hosts must be running if regular, IPMI or Java pollers
# are started.
#
# Mandatory: no
# Range: 0-1000
# Default:
StartPollersUnreachable={{ zbx_start_pollersunreachable | default('1') }}
### Option: StartTrappers
# Number of pre-forked instances of trappers.
# Trappers accept incoming connections from Zabbix sender, active agents and active proxies.
# At least one trapper process must be running to display server availability and view queue
# in the frontend.
#
# Mandatory: no
# Range: 0-1000
# Default:
StartTrappers={{ zbx_start_trappers | default('5') }}
### Option: StartPingers
# Number of pre-forked instances of ICMP pingers.
#
# Mandatory: no
# Range: 0-1000
# Default:
StartPingers={{ zbx_start_pingers | default('1') }}
### Option: StartDiscoverers
# Number of pre-forked instances of discoverers.
#
# Mandatory: no
# Range: 0-250
# Default:
# StartDiscoverers=1
### Option: StartHTTPPollers
# Number of pre-forked instances of HTTP pollers.
#
# Mandatory: no
# Range: 0-1000
# Default:
# StartHTTPPollers=1
### Option: StartTimers
# Number of pre-forked instances of timers.
# Timers process maintenance periods.
# Only the first timer process handles host maintenance updates. Problem suppression updates are shared
# between all timers.
#
# Mandatory: no
# Range: 1-1000
# Default:
# StartTimers=1
### Option: StartEscalators
# Number of pre-forked instances of escalators.
#
# Mandatory: no
# Range: 0-100
# Default:
# StartEscalators=1
### Option: StartAlerters
# Number of pre-forked instances of alerters.
# Alerters send the notifications created by action operations.
#
# Mandatory: no
# Range: 0-100
# Default:
# StartAlerters=3
### Option: JavaGateway
# IP address (or hostname) of Zabbix Java gateway.
# Only required if Java pollers are started.
#
# Mandatory: no
# Default:
# JavaGateway=
### Option: JavaGatewayPort
# Port that Zabbix Java gateway listens on.
#
# Mandatory: no
# Range: 1024-32767
# Default:
# JavaGatewayPort=10052
### Option: StartJavaPollers
# Number of pre-forked instances of Java pollers.
#
# Mandatory: no
# Range: 0-1000
# Default:
# StartJavaPollers=0
### Option: StartVMwareCollectors
# Number of pre-forked vmware collector instances.
#
# Mandatory: no
# Range: 0-250
# Default:
# StartVMwareCollectors=0
### Option: VMwareFrequency
# How often Zabbix will connect to VMware service to obtain a new data.
#
# Mandatory: no
# Range: 10-86400
# Default:
# VMwareFrequency=60
### Option: VMwarePerfFrequency
# How often Zabbix will connect to VMware service to obtain performance data.
#
# Mandatory: no
# Range: 10-86400
# Default:
# VMwarePerfFrequency=60
### Option: VMwareCacheSize
# Size of VMware cache, in bytes.
# Shared memory size for storing VMware data.
# Only used if VMware collectors are started.
#
# Mandatory: no
# Range: 256K-2G
# Default:
# VMwareCacheSize=8M
### Option: VMwareTimeout
# Specifies how many seconds vmware collector waits for response from VMware service.
#
# Mandatory: no
# Range: 1-300
# Default:
# VMwareTimeout=10
### Option: SNMPTrapperFile
# Temporary file used for passing data from SNMP trap daemon to the server.
# Must be the same as in zabbix_trap_receiver.pl or SNMPTT configuration file.
#
# Mandatory: no
# Default:
# SNMPTrapperFile=/tmp/zabbix_traps.tmp
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
### Option: StartSNMPTrapper
# If 1, SNMP trapper process is started.
#
# Mandatory: no
# Range: 0-1
# Default:
# StartSNMPTrapper=0
### Option: ListenIP
# List of comma delimited IP addresses that the trapper should listen on.
# Trapper will listen on all network interfaces if this parameter is missing.
#
# Mandatory: no
# Default:
# ListenIP=0.0.0.0
# ListenIP=127.0.0.1
### Option: HousekeepingFrequency
# How often Zabbix will perform housekeeping procedure (in hours).
# Housekeeping is removing outdated information from the database.
# To prevent Housekeeper from being overloaded, no more than 4 times HousekeepingFrequency
# hours of outdated information are deleted in one housekeeping cycle, for each item.
# To lower load on server startup housekeeping is postponed for 30 minutes after server start.
# With HousekeepingFrequency=0 the housekeeper can be only executed using the runtime control option.
# In this case the period of outdated information deleted in one housekeeping cycle is 4 times the
# period since the last housekeeping cycle, but not less than 4 hours and not greater than 4 days.
#
# Mandatory: no
# Range: 0-24
# Default:
# HousekeepingFrequency=1
### Option: MaxHousekeeperDelete
# The table "housekeeper" contains "tasks" for housekeeping procedure in the format:
# [housekeeperid], [tablename], [field], [value].
# No more than 'MaxHousekeeperDelete' rows (corresponding to [tablename], [field], [value])
# will be deleted per one task in one housekeeping cycle.
# If set to 0 then no limit is used at all. In this case you must know what you are doing!
#
# Mandatory: no
# Range: 0-1000000
# Default:
# MaxHousekeeperDelete=5000
### Option: CacheSize
# Size of configuration cache, in bytes.
# Shared memory size for storing host, item and trigger data.
#
# Mandatory: no
# Range: 128K-8G
# Default:
CacheSize={{ zbx_cache_size | default('8M') }}
### Option: CacheUpdateFrequency
# How often Zabbix will perform update of configuration cache, in seconds.
#
# Mandatory: no
# Range: 1-3600
# Default:
# CacheUpdateFrequency=60
### Option: StartDBSyncers
# Number of pre-forked instances of DB Syncers.
#
# Mandatory: no
# Range: 1-100
# Default:
# StartDBSyncers=4
### Option: HistoryCacheSize
# Size of history cache, in bytes.
# Shared memory size for storing history data.
#
# Mandatory: no
# Range: 128K-2G
# Default:
# HistoryCacheSize=16M
### Option: HistoryIndexCacheSize
# Size of history index cache, in bytes.
# Shared memory size for indexing history cache.
#
# Mandatory: no
# Range: 128K-2G
# Default:
# HistoryIndexCacheSize=4M
### Option: TrendCacheSize
# Size of trend cache, in bytes.
# Shared memory size for storing trends data.
#
# Mandatory: no
# Range: 128K-2G
# Default:
# TrendCacheSize=4M
### Option: ValueCacheSize
# Size of history value cache, in bytes.
# Shared memory size for caching item history data requests.
# Setting to 0 disables value cache.
#
# Mandatory: no
# Range: 0,128K-64G
# Default:
ValueCacheSize={{ zbx_value_cache_size | default('8M') }}
### Option: Timeout
# Specifies how long we wait for agent, SNMP device or external check (in seconds).
#
# Mandatory: no
# Range: 1-30
# Default:
# Timeout=3
Timeout={{ zbx_timeout | default('4') }}
### Option: TrapperTimeout
# Specifies how many seconds trapper may spend processing new data.
#
# Mandatory: no
# Range: 1-300
# Default:
# TrapperTimeout=300
### Option: UnreachablePeriod
# After how many seconds of unreachability treat a host as unavailable.
#
# Mandatory: no
# Range: 1-3600
# Default:
# UnreachablePeriod=45
### Option: UnavailableDelay
# How often host is checked for availability during the unavailability period, in seconds.
#
# Mandatory: no
# Range: 1-3600
# Default:
# UnavailableDelay=60
### Option: UnreachableDelay
# How often host is checked for availability during the unreachability period, in seconds.
#
# Mandatory: no
# Range: 1-3600
# Default:
# UnreachableDelay=15
### Option: AlertScriptsPath
# Full path to location of custom alert scripts.
# Default depends on compilation options.
# To see the default path run command "zabbix_server --help".
#
# Mandatory: no
# Default:
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
### Option: ExternalScripts
# Full path to location of external scripts.
# Default depends on compilation options.
# To see the default path run command "zabbix_server --help".
#
# Mandatory: no
# Default:
# ExternalScripts=${datadir}/zabbix/externalscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
### Option: FpingLocation
# Lo