Automação de um sistema de monitoramento baseado em Icinga2 e Puppet
Vamos falar um pouco sobre ... Infraestrutura como código (IaC).
No Habré, existem alguns artigos muito bons sobre o Icinga2, também existem excelentes artigos sobre o Puppet:
Icinga2 é uma opção fácilElevamos o micromonitoramento no icinga2 com as despesas mínimasConfigurando um servidor Puppet moderno a partir do zeroNo entanto, o tópico de automação e integração desses dois sistemas incríveis não é divulgado.
Neste guia, mostrarei em um exemplo "vivo" como você pode combinar essas duas
sistemas, obtenha uma ferramenta poderosa para monitorar sua infraestrutura com todas as funções necessárias. Este artigo é um tipo de guia de ação para instalar o pacote "tudo em um frasco". Depois de concluir este guia, você terá uma solução de monitoramento totalmente operacional disponível, que poderá ser “finalizada” por conta própria. Vamos tentar!
Então:
Criamos um novo host. E precisamos:
1. Para que seu monitoramento apareça automaticamente no Icinga2, e as verificações básicas sejam criadas:
Cheques
| Instantâneos
| Explicações
|
Anfitrião
| 
| Em uma determinada frequência, verificamos com o comando ping se o host está "ativo".
|
Uso de disco
| 
| Verifique se temos espaço livre em disco suficiente. |
Carga média
| 
| Monitoramos a carga no servidor dinamicamente. O número de processadores nele é levado em consideração. |
Memória livre
| 
| Verificamos se temos memória livre suficiente no servidor. |
Portas abertas
| 
| Examinamos as portas no servidor e criamos um mapa de portas abertas. Monitoramos que não tínhamos novas portas abertas ou fechadas. |
Atualizações críticas
| 
| Monitoramos a presença de atualizações críticas no servidor. |
2. Adicione verificações personalizadas para vários serviços de maneira conveniente e compreensível. O que mostraria ao diretor como somos bons companheiros e receberia um prêmio!
Alguns exemplos:
Serviço
| Código de verificação YAML
|
---|
Host virtualVerifique o host "ao vivo" ou não.

| '%{::fqdn} virtual host' : target: /etc/icinga2/zones.d/master/%{::fqdn}.conf apply: true assign: [ 'host.name == %{::fqdn}' ] display_name: '%{::fqdn} virtualhost' check_command: 'http' vars: http_uri: / http_ssl: true http_vhost: 'hostname' http_address: "%{lookup('host_address')}"
|
PostgreSQLVerifique se podemos conectar ao banco de dados PostgreSQL.

| '%{::fqdn} PostgreSQL': target: /etc/icinga2/zones.d/master/%{::fqdn}.conf apply: true assign: [ 'host.name == %{::fqdn}' ] display_name: 'PostgreSQL' command_endpoint: '%{::fqdn}' check_command: "postgres" vars: postgres_host: "localhost" postgres_action: "connection" phone_notifications: true
|
Status NginxMonitoramos o status do Nginx por meio de stub_status.

| '%{::fqdn} nginx status' : target: /etc/icinga2/zones.d/master/%{::fqdn}.conf apply: true assign: [ 'host.name == %{::fqdn}' ] command_endpoint: '%{::fqdn}' display_name: 'nginx status' check_command: 'nginx_status' vars: nginx_status_host_address: localhost nginx_status_servername: server.com nginx_status_critical: '1600,60,30' nginx_status_warn: '1500,55,25'
|
3. Que tudo estava arrumado, confiável e bonito. E o mais importante, não gaste mais de 30 minutos mexendo na configuração inicial.
Você deve ter experiência com o Docker e, portanto, com o Linux - por si só.
Esta configuração é descrita em Debian / Ubuntu. E, embora eu não veja nenhuma razão para ele não trabalhar em outros sistemas semelhantes ao Unix, eu próprio não posso dar tais garantias. Eu tenho algumas máquinas com o CentOS, ele funciona lá, mas a maioria, no entanto, é Debian / Ubuntu.
Vamos começar
Eu direi imediatamente, é conveniente para mim quando toda a configuração do host é serviços, configurações, software, contas etc. - eles são descritos por um arquivo yaml, isso evita a documentação da infraestrutura e fornece uma configuração clara. Ele abriu o projeto correspondente no repositório git, onde os nomes dos arquivos correspondem ao nome do host, depois abriu a configuração do host desejado. E você pode ver imediatamente quais serviços estão no host, o que é feito backup disso, o que é monitorado etc.
É assim que a estrutura do projeto no repositório se parece: project_1/hostname1.com.yaml project_2/hostname2.com.yaml project_3/hostname3.com.yaml
Eu uso aqui esse modelo, que descreve a configuração de qualquer um de nossos servidores:
Modelo completo #============================|INPUT DATA|=================================# #---------------------------------------|VARS|----------------------------# #---//Information about variables, keys & contacts//----------------------# host_address: xxxx my_company: my_mail_domain: my_ssh_port: #---------------------------------------|CLASSES|-------------------------# #---//Classes are modules installed on the server.//----------------------# #---//These modules process the arguments typed below.//------------------# #---//Without classes nothing will work.//--------------------------------# #---//Class default_role is mandatory. This class will install//----------# #---//etckeeper, some required perl modules and manages all the logics.//-# classes: - default_role #---------------------------------------|TIMEZONE|------------------------# #---//Set timezone, which will be used on the host.//---------------------# timezone::timezone: Europe/Moscow #---------------------------------------|FACTS|---------------------------# #---//Facts are variables which puppet agent uses.//----------------------# facter::facts_hash: role: value: 'name' company: value: 'name of company' file: 'location.txt' #=========================================================================# #============================|PUPPET|=====================================# #---//Settings for puppet agent.//----------------------------------------# puppet::runmode: cron puppet::ca_server: puppet::puppetmaster: #=========================================================================# #============================|CRON TASKS|=================================# cron_tasks: Name: command: user: minute: '' hour: '' #=========================================================================# #============================|SUPERVISOR|=================================# #---//Supervisor is a process manager//-----------------------------------# supervisord::install_pip: false supervisord::install_init: false supervisord::service_name: supervisor supervisord::package_provider: apt supervisord::executable: /usr/bin/supervisord supervisord::executable_ctl: /usr/bin/supervisorctl supervisord::config_file: /etc/supervisor/supervisord.conf supervisord::programs: 'name': ensure: present command: 'su - rails -c "/home/name/s2"' autostart: no autorestart: 'false' directory: /home/name/domainName/current #=========================================================================# #============================|SECURITY|===================================# #-------------------------------------|FIREWALL|--------------------------# #---//Iptables rules//----------------------------------------------------# firewall: 096 Allow inbound SSH: dport: proto: tcp action: accept #-------------------------------------|FAIL2BAN|--------------------------# #-------------------------------------|ACCESS|----------------------------# #--------------------------------------------|ACCOUNTS|-------------------# #---//Discription of accounts which will be created on server.//----------# accounts: user: shell: '/bin/bash' password: '' locked: false purge_sshkeys: true groups: - docker sshkeys: - #--------------------------------------------|SUDO|-----------------------# #---//Appointment permissions for users.//--------------------------------# sudo::config_file_replace: false sudo::configs: user: content: #--------------------------------------------|SSH|------------------------# #--------//Settings for ssh server.//-------------------------------------# ssh::storeconfigs_enabled: true ssh::server_options: Protocol: '2' Port: PasswordAuthentication: 'yes' PermitRootLogin: 'without-password' SyslogFacility: 'AUTHPRIV' UsePAM: 'yes' X11Forwarding: 'no' #--------------------------------------------|VPN|------------------------# #---//Settings for vpn server.//------------------------------------------# openvpn::servers: 'namehost': country: '' province: '' city: '' organization: '' email: '' server: 'xxxx 255.255.255.0' dev: tun local: openvpn::client_defaults: server: 'namehost' openvpn::clients: # Firstname Lastname 'user': {} openvpn::client_specific_configs: 'user': server: 'namehost' redirect_gateway: true route: - xxxx 255.255.255.255 #=========================================================================# #============================|OPERATING SYSTEM|===========================# #---------------------------------------------|SYSCTL|--------------------# #---//set sysctl parameters//---------------------------------------------# sysctl::base::values: fs.file-max: value: '2097152000' net.netfilter.nf_conntrack_max: value: '1048576' net.nf_conntrack_max: value: '1048576' net.ipv6.conf.all.disable_ipv6: value: '1' vm.oom_kill_allocating_task: value: '1' net.ipv4.ip_forward: value: '0' net.ipv4.tcp_keepalive_time: value: '3' net.ipv4.tcp_keepalive_intvl: value: '60' net.ipv4.tcp_keepalive_probes: value: '9' #---------------------------------------------|RCS|-----------------------# #---//Managment of RC scenario//------------------------------------------# rcs::tmptime: '-1' #---------------------------------------------|WEB SERVERS|---------------# #---------------------------------------------------------|HAPROXY|-------# #---//HAProxy is software that provides a high availability load//--------# #---//balancer and proxy server for TCP and HTTP-based applications//-----# #---// that spreads requests across multiple servers.//-------------------# haproxy::merge_options: true haproxy::defaults_options: log: global maxconn: 20000 option: [ 'tcplog', 'redispatch', 'dontlognull' ] retries: 3 stats: enable timeout: [ 'http-request 10s', 'queue 1m', 'check 10s', 'connect 300000000ms', 'client 300000000ms', 'server 300000000ms' ] haproxy_server: stats: ipaddress: ports: '9090' options: mode: 'http' stats: [ 'uri /', 'auth puppet:123123123' ] postgres: collect_exported: false ipaddress: '0.0.0.0' ports: '5432' options: option: - tcplog balance: roundrobin haproxy_balancemember: hostname1: listening_service: postgres server_names: hostname1 ipaddresses: ports: 6432 options: check hostname2: listening_service: postgres server_names: hostname2 ipaddresses: ports: 6432 options: - check - backup #---------------------------------------------|NGINX|---------------------# #---//Nginx is a web server which can also be used as a reverse proxy,//--# #---//load balancer, mail proxy and HTTP cache//--------------------------# nginx::nginx_cfg_prepend: 'load_module': - modules/ngx_http_geoip_module.so nginx::http_raw_append: - 'real_ip_header X-Forwarded-For;' - 'geoip_country /usr/share/GeoIP/GeoIP.dat;' - 'set_real_ip_from 0.0.0.0/0;' nginx::worker_rlimit_nofile: 16384 nginx::confd: true nginx::server_purrge: true nginx::server::maintenance: true #---------------------------------------------nginx-|MAPS|----------------# nginx::string_mappings: allowed_country: ensure: present string: '$geoip_country_code' mappings: - key: 'default' value: 'yes' - key: 'US' value: 'no' #---------------------------------------------nginx-|UPSTREAMS|-----------# nginx::nginx_upstreams: : ensure: present members: - #---------------------------------------------nginx-|VHOSTS|--------------# nginx::nginx_servers: 'hostname': proxy: 'http://' location_raw_append: - 'if ($allowed_country = no) {return 403;}' try_files: - '' - /index.html - =404 ssl: true ssl_cert: ssl_key: ssl_trusted_cert: ssl_redirect: false ssl_port: 443 error_pages: '403': /usa-restrict.html #---------------------------------------------nginx-|HTTPAUTH|------------# httpauth: 'admin': file: password: '' realm: realm mechanism: basic ensure: present #---------------------------------------------nginx-|LOCATIONS|-----------# nginx::nginx_locations: 'domain1.com/usa-restricted': location: /usa-restrict.html www_root: /home/clientName1/clientName1-client-release/current/dist server: domain1.com ssl: true '^~ domain2.com/resources/upload/': location: '^~ /resources/upload/' server: domain2.com location_alias: '/home/clientName2/upload/' raw_append: - 'if ($allowed_country = no) {return 403;}' '/nginx_status-domain3.com': location: /nginx_status stub_status: on raw_append: - access_log off; - allow 127.0.0.1; - deny all; #---------------------------------------------nginx-|WELL-KNOWN|----------# #---//These locations are needed for SSL certificates generating//--------# #---//with Letsencrypt.//-------------------------------------------------# 'x.hostname.zz/.well-known': location: '/.well-known' server: x.hostname.zz proxy: 'http://kibana' auth_basic: auth_basic_user_file: add_header Pragma public;public, must-revalidate, proxy-revalidate/home/hostname/hostname-release/shared/ecosystem.config.jslogslog_typeformat%{::domain}%{lookup('host_address')}/32(rw,fsid=root,insecure,no_subtree_check,async,no_root_squash)host_addresso=Debian,n=${distro_codename}o=Debian,n=${distro_codename}-securityo=Debian,n=${distro_codename}-updateso=Debian,n=${distro_codename}-proposedo=Debian,n=${distro_codename}-backportso=debian icinga,n=icinga-${distro_codename}o=Zabbix,n=${distro_codename}%{lookup('my_ftp_hostname')}%{lookup('my_backup_ftp_username')}%{lookup('my_backup_ftp_password')}%{lookup('my_backup_compressor')}/tmp/mediastagetv_netbynet%{lookup('host_address')}:/%{lookup('host_address')}redis%{lookup('host_address')}*.*;auth,authpriv.none /var/log/syslog\nmail.* -/var/log/mail.log\n& stopauth,authpriv.* /var/log/auth\n& stop:programname,contains,\ /var/log/puppetlabs/puppet/puppet-agent.log\n& stop:msg,contains,\ /var/log/iptables/iptables.log\n& stop:msg,regex,\ /var/log/admin/auth.log\n& stop:msg,regex,\ /var/log/admin/auth.log\n& stop #---------------------------------------------|LOGWATCH|------------------# #---//Logwatch is a log-analysator for create short reports.//------------# logwatch::format: text logwatch::service: # Ignore this servie - -http - -iptables #---------------------------------------------|LOGROTATE|-----------------# #---//Management of rotation of log files.//------------------------------# my_rclogs_path: '/home/hostname/hostname/shared/log' my_rclogs_amazon_path: '/home/hostname1/hostname1/shared/log_amazon' my_ttlogs_path: '/home/hostname2/hostname2/shared/log' my_ttlogs_amazon_path: '/home/hostname/hostname/shared/log_amazon' logrotate::ensure: latest logrotate::config: dateext: true compress: true logrotate::rules: booking-logs: path: '%{lookup("my_rclogs_path")}/booking_com.log' size: 2500M rotate: 20 copytruncate: true delaycompress: true dateext: true dateformat: -%Y%m%d-%s compress: true postrotate: mv %{lookup('my_rclogs_path')}/booking_com.log*.gz %{lookup('my_rclogs_amazon_path')}/ #---------------------------------------------|ATOP|----------------------# #---//ATOP service displays a new information about CPU//-----------------# #---//and memory utilization.//-------------------------------------------# atop::service: true atop::interval: 30 #----------------------------------------|DNS|----------------------------# #---//Management of file /etc/resolv.conf//-------------------------------# resolv_conf::nameservers: - 0.0.0.0 - 0.0.0.0 #=========================================================================# #============================|DATABASES|==================================# #--------------------------------------|MYSQL|----------------------------# #---//MySQL is a relational database management system.//-----------------# mysql::server::package_ensure: 'installed' #· mysql::server::root_password: mysql::server::manage_config_file: true mysql::server::service_name: 'mysql' # required for puppet module mysql::server::override_options: 'mysqld': 'bind-address': '*' : , : , : , mysql::server::db: : user: password: host: grant: - #-------------------------------------|ELASTICSEARCH|---------------------# #---//Elasticsearch is a search engine based on Lucene.//-----------------# #---//It provides a distributed, multitenant-capable full-text search//---# #---//engine with an HTTP web interface and schema-free JSON documents.//-# elasticsearch::version: 5.5.1 elasticsearch::manage_repo: true elasticsearch::repo_version: 5.x elasticsearch::java_install: false elasticsearch::restart_on_change: true elasticsearch_instance: 'es-01': ensure: 'present' #-------------------------------------|REDIS|-----------------------------# #---//Redis is an in-memory database project implementing//---------------# #---//a distributed, in-memory key-value store with//---------------------# #---//optional durability.//----------------------------------------------# redis::bind: 0.0.0.0 #-------------------------------------|ZOOKEPER|--------------------------# #---//Zooker is a centralized service for distributed systems//-----------# #---//to a hierarchical key-value store, which is used to provide//-------# #---//a distributed configuration service, synchronization service,//-----# #---//and naming registry for large distributed systems.//----------------# zookeeper::init_limit: '1000' zookeeper::id: '1' zookeeper::purge_interval: '1' zookeeper::servers: - #-------------------------------------|POSTGRES|--------------------------# #---//Postgres, is an object-relational database management system//------# #---//with an emphasis on extensibility and standards compliance.//-------# #---//As a database server, its primary functions are to store data//----# #---//securely and return that data in response to requests from other//--# #---//software applications.//--------------------------------------------# postgresql::server::postgres_password: postgresql::server::ip_mask_allow_all_users: '0.0.0.0/0' postgresql::postgresql::server: ip_mask_allow_all_users: '0.0.0.0/32' postgres_db: master: user: password: confluence: user: password: postgres_config: 'max_connections': value: 300 postgres_hba: 'Allow locals without password': order: 1 description: 'locals postgres no password' type: 'host' address: '127.0.0.1/32' database: 'all' user: 'all' auth_method: 'trust' #----------------------------------------------|PGBOUNCER|----------------# #---//PgBouncer is a connection pooler for PostgreSQL//-------------------# pgbouncer::group: postgres pgbouncer::user: postgres pgbouncer::userlist: - user: password: pgbouncer::databases: - source_db: recommender host: dest_db: recommender auth_user: recommender pool_size: 200 auth_pass: - source_db: master host: dest_db: recommender auth_user: recommender pool_size: 50 auth_pass: - source_db: slave host: dest_db: recommender auth_user: recommender pool_size: 200 auth_pass: #=========================================================================# #==============================|APPLICATION SERVICES|=====================# #---------------------------------------------------|CONFLUENCE|----------# #---------------------------------------------------|JENKINS|-------------# #=========================================================================#
Seção de monitoramento de exemplo:
#============================|MONITORING|=================================# #---------------------------------------|ICINGA SERVICES|-----------------# #---//Managment of monitoring system.//-----------------------------------# icinga2_service: '%{::fqdn} virtual host' : target: /etc/icinga2/zones.d/master/%{::fqdn}.conf apply: true assign: [ 'host.name == %{::fqdn}' ] display_name: '%{::fqdn} virtualhost' check_command: 'http' vars: http_uri: / http_ssl: true http_vhost: 'hostname' http_address: '%{::fqdn} nginx status' : target: /etc/icinga2/zones.d/master/%{::fqdn}.conf apply: true assign: [ 'host.name == %{::fqdn}' ] command_endpoint: '%{::fqdn}' display_name: 'nginx status' check_command: 'nginx_status' vars: nginx_status_host_address: localhost nginx_status_servername: server.com nginx_status_critical: '1600,60,30' nginx_status_warn: '1500,55,25' '%{::fqdn} redis': target: /etc/icinga2/zones.d/master/%{::fqdn}.conf apply: true assign: [ 'host.name == %{::fqdn}' ] display_name: 'Redis' command_endpoint: '%{::fqdn}' check_command: vars: redis_hostname: localhost redis_port: 6379 redis_perfvars: '*' #=========================================================================#
O esquema geral de operação de tal esquema consiste em apenas duas ações simples:
- Começamos o fantoche no host - o host vê os cheques que pertencem a ele e os exporta para o puppetDB.
- Execute o fantoche no contêiner icinga2 - as verificações do puppetdb se transformam em configurações reais do Icinga2.
Aqui, muitos dirão:
"Por que tenho que fazer tudo isso acontecer, se posso levantar o icinga2 habitual e adicionar cheques com as mãos ou através da interface da web?"De fato, se você precisa monitorar uma dúzia de hosts com centenas de serviços e é uma pessoa razoavelmente elegante, com boa memória (não encontrada na natureza), não faz sentido cercar um jardim. É uma questão completamente diferente se você tiver uma infraestrutura bastante grande e houver a sensação de que pode ter esquecido algo em algum lugar. Nesses momentos, a automação ajuda muito, porque ajuda a colocar tudo nas prateleiras e evitar, de várias maneiras, o fator humano.
Indique as principais vantagens:
Vamos olhar para este modelo: icinga2_service: '%{::fqdn} disk service': target: /etc/icinga2/zones.d/master/%{::fqdn}.conf apply: true assign: [ 'host.name == %{::fqdn}' ] display_name: 'Disk usage' command_endpoint: '%{::fqdn}' check_command: 'disk' vars: #All disks disk_all: true disk_exclude_type: - aufs - tmpfs disk_ignore_ereg_path: - /run/docker
+ 1. Hiera — .. . Icinga2, , . , , , .
+ 2. , . — .
+ 3. , .. , Icinga2 , puppet Icinga2.
+ 4. Portanto, todas as verificações que armazenamos em um único banco de dados puppetDB, podemos criar scripts bastante poderosos para automação adicional, na qual usaremos essas informações.
Então vamos
1. Configure o boneco.
Espero que você tenha configurado o docker e o docker-compondo.Caso contrário, será necessário instalá-los:Instalando o Docker ...Instalando o Docker-compose ...2. Clonamos o repositório no nosso servidor:
git clone http://git.comgress64.com/external/puppet-icinga2-how-to.git
3. Abra o docker-compose.yaml com o seu editor favorito e veja-o.
Vemos que neste pacote temos vários containers subindo ao mesmo tempo - PuppetServer, PuppetDb, servidor PostgreSQL e PuppetBoard. Também montou volumes do diretório atual. Essa configuração não é ideal para todos, portanto, considere sua infraestrutura. Alguém já tem um servidor PostgreSQL, alguém quer armazenar código em outra seção - eis a liberdade de criatividade. Nesse estágio, sugiro deixar o modelo padrão - você sempre pode retornar a ele mais tarde. Vamos pegar nosso pacote de contêineres e ver o que aconteceu:4. Inicie o contêiner Puppet, Postgres, Puppetdb e Graphite.
Agora, carregamos várias imagens e lançamos contêineres, criamos bancos de dados no PostgreSQL. Vamos esperar até que todos os servidores sejam iniciados - os erros podem ser ignorados, porque devem estabilizar após algum tempo. Pressione Ctrl + C para sair do modo de exibição de log.5. Verifique o trabalho do nosso mestre de marionetes:
docker run --net puppeticinga2howto_default --link puppet:puppet puppet/puppet-agent
6. Se estiver tudo bem, você verá esta conclusão:
Notice: Applied catalog in 0.03 seconds Changes: Total: 1 Events: Success: 1 Total: 1 Resources: Changed: 1 Out of sync: 1 Total: 8 Time: Schedule: 0.00 File: 0.00 Transaction evaluation: 0.01 Catalog application: 0.03 Convert catalog: 0.04 Config retrieval: 0.45 Node retrieval: 1.38 Last run: 1532605377 Fact generation: 2.24 Plugin sync: 4.50 Filebucket: 0.00 Total: 8.65 Version: Config: 1532605376 Puppet: 5.5.1
Configure o servidor Icinga2.7. Crie a imagem do Dockerfile, executando:
docker-compose build icinga
8. Execute o contêiner no qual o servidor Icinga2 viverá.
docker-compose up -d icinga
9. Até agora, nosso contêiner está vazio. Vamos configurar o servidor icinga2 usando nosso servidor Puppet, fazendo:
10. Instale e configure Icinga, Icingaweb2 e Apache.
Seu servidor Icinga2 está pronto!
Icingaweb2
1. Vamos ver o que temos.
É conveniente observar o estado do sistema de monitoramento no navegador, faça:Abra no navegador http://ip___:8081/icingaweb2
e vá para Icinga com o login padrão: icingaadmin / icinga .Vemos esta figura:
Após alguns minutos, vemos que todas as verificações funcionaram para nós: Os
gráficos também funcionam:
Temos um ambiente de trabalho da Web para Icinga2, mas ainda não há hosts conectados a Icinga, vamos conectar nosso primeiro host.2. Conecte o novo host ao sistema de monitoramento
Agora, temos apenas um host conectado ao icinga2 - Icinga. Vamos conectar outro.Estou mostrando um exemplo em uma janela de encaixe, mas o mesmo funcionará com o bare metal:primeiro você precisa preparar um modelo e fornecer algumas informações sobre o host do fantoche:
. hostname , : docker run --hostname example.com --rm -t --link puppet:puppet --net puppeticinga2howto_default -i phusion/baseimage:latest /sbin/my_init -- bash -l
puppet : apt-get update && apt-get install -y ruby make gcc perl-modules && gem install --no-ri --no-rdoc puppet
puppet: puppet agent --server puppet --waitforcert 60 --test
icinga2 puppetDB. , puppet icinga2: docker-compose exec icinga puppet agent --server puppet --waitforcert 60 --test
Examinamos através do navegador o que obtivemos: as
verificações foram adicionadas e aguardam conclusão.Após 5 minutos:
Da mesma maneira, todos os outros hosts são adicionados ao sistema. Quero chamar sua atenção para o fato de que este guia é uma prova de conceito e não pode ser usado em um ambiente de produção sem nenhuma modificação.Se o artigo parecer interessante, da próxima vez mostrarei como você pode adicionar todos os tipos de verificações personalizadas interessantes, compartilhar segredos e contar sobre todos os tipos de sutilezas. Além disso, se houver um desejo, contarei mais detalhadamente como tudo isso funciona por dentro.Obrigado pela atenção!
Confluence:/ ./docs.comgress64.com/...:https://github.com/Icinga/puppet-icinga2https://forge.puppet.com/icinga/icingaweb2https://docs.docker.com/https://docs.puppet.com/https://docs.puppet.com/hiera/