- Instalação
Este tutorial trata dos passos necessários para a configuração de um Puppet Master e um Puppet Agent, sem enrolação. Ele foi baseado [neste aqui](https://www.digitalocean.com/community/tutorials/how-to-install-puppet-4-in-a-master-agent-setup-on-centos-7). Espera-se que o leitor tenha algum conhecimento básico de Linux/Unix.
- Observação
Devido a estrutura do Puppet, é conveniente a criação de **um servidor DNS local** às máquinas do Master e dos Agents. http://lbrvirtual.com.br/blog/index.php/2015/09/13/instalando-e-configurando-o-bind9-no-ubuntudebian/ (A alternativa é criar registros no `/etc/hosts`, mas não é recomendável pela complexidade adicional de editá-lo em cada máquina – Observe os exemplos de como os arquivos hosts devem ficar nos arquivos anexos *hosts_agents* e *hosts_master*).
- Instalação do Puppet Master no CentOS 7
- Requerimentos
- A máquina rodando o Server necessita de *nada menos* que **4GB de RAM** e 2 a 4 cores de CPU ao ser usada em produção. [Essa configuração é suficiente para suportar até 1000 nodes, mas obviamente depende de vários fatores](https://docs.puppet.com/puppet/4.8/system_requirements.html#hardware). - **Porta 8140 aberta**
- Modo de fazer
1. Em uma máquina com pelo menos 2GB de RAM, instale o CentOS 7 e atualize o sistema com `$ sudo yum update -y`. Garanta que ela esteja em rede com outras máquinas locais com `$ ip a` e `$ ping`. 2. Confira e edite os valores de *hostname* da máquina, em `/etc/hostname` e `/etc/hosts`, tal que o comando `$ ping $(hostname)` obtenha sucesso. Dê preferência ao *hostname* `puppet`, caso contrário precisará configurar este valor em todos os agents. (Obs.: Soluções como OpenStack ou Docker, modificam esses valores a cada inicialização da instância). 3. _Não se esqueça de adicionar pelo menos um registro ao servidor DNS referente a essa máquina. (Você pode ignorar essa e a próxima instrução se for utilizar o arquivo `/etc/hosts` para gerenciar o nome das máquinas). Configure o endereço do DNS a ser usado localmente, com `sudo printf "search puppetexample.com\nnameserver 0.0.0.0\n" | sudo tee -a /etc/resolv.conf`, onde **puppetexample.com** corresponde a sua zona e **0.0.0.0** é o IP do seu servidor DNS._ 4. Pare o firewall com `$ sudo systemctl stop firewalld` e desative-o com `$ sudo systemctl disable firewalld`. Também desative o SELinux, editando para `SELINUX=disabled` em `/etc/selinux/config`. Reinicie a máquina para as mudanças surtirem efeito. Você pode e deve ajustar as políticas de firewall depois. 5. Instale o repositório oficial do Puppet em seu sistema `$ sudo yum install -y https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm` e então o pacote do Puppet Master Server `$ sudo yum install -y puppetserver`. Se instalou em um sistema com menos de 4GB de RAM, você precisará ajustar a variável `JAVA_ARGS` em `/etc/sysconfig/puppetserver`. 6. Finalmente, teste se o serviço inicia com `$ sudo systemctl start puppetserver` e `$ sudo systemctl status puppetserver`. Se não houver nenhuma falha, ative o serviço `$ sudo systemctl enable puppetserver`. 7. Adicionalmente, instale o **r10k** para gerenciar módulos declarados em um `Puppetfile`, com `$ sudo /opt/puppetlabs/puppet/bin/gem install r10k`
- Instalação do Puppet Agent no CentOS 7
Observe que os passos citados aqui precisam ser feitos em **cada máquina** que for atuar como *node* do Puppet. O ideal é que os processos sejam automatizados com a criação da máquina através de uma imagem de SO padrão, script pós-criação ou utilitário cloud-init.
- Modo de fazer
1. Instale o CentOS 7 e atualize o sistema com `$ sudo yum update -y`. Garanta que ela esteja em rede com outras máquinas locais com `$ ip a` e `$ ping`. A máquina agent não possui requerimentos específicos de RAM ou disco. 2. Confira e edite os valores de *hostname* da máquina, em `/etc/hostname` e `/etc/hosts`, tal que o comando `$ ping $(hostname)` obtenha sucesso. (Obs.: Soluções como OpenStack ou Docker, modificam esses valores a cada inicialização da instância). 3. _Não se esqueça de adicionar pelo menos um registro ao servidor DNS referente a essa máquina. (Você pode ignorar essa e a próxima instrução se for utilizar o arquivo `/etc/hosts` para gerenciar o nome das máquinas). Configure o endereço do DNS a ser usado localmente, com `sudo printf "search puppetexample.com\nnameserver 0.0.0.0\n" | sudo tee -a /etc/resolv.conf`, onde **puppetexample.com** corresponde a sua zona e **0.0.0.0** é o IP do seu servidor DNS._ 4. Instale o repositório oficial do Puppet em seu sistema `$ sudo yum install -y https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm` e então o pacote do Puppet Agent `$ sudo yum install -y puppet-agent`. 5. Se o hostname de seu Master for diferente de `puppet`, você precisa acrescentar isso em `/etc/puppetlabs/puppet/puppet.conf`, com: ``` [main] server = puppetexample.com ``` 6. Finalmente, teste se o serviço inicia com `$ sudo systemctl start puppet` e `$ sudo systemctl status puppet`. Se não houver nenhuma falha, ative o serviço `$ sudo systemctl enable puppet`.
- Certificados
Antes de tudo você vai precisar aprovar os certificados de todos seus Agents no Master.
- Aprovando certificados
Se tudo ocorreu bem na instalação do Agent, ele terá enviado uma requisição de reconhecimento de certificado ao Master ao iniciar o serviço. Antes de o Agent ser capaz de comunicar com o Master, é preciso aprovar o certificado de dado Agent. 1. No Master execute `$ sudo /opt/puppetlabs/bin/puppet cert list` para ver os certificados pendentes. Note que a saída mostrará todos os hostnames de todos os Agents que ainda não tiverem seus certificados assinados. 2. Use `$ sudo /opt/puppetlabs/bin/puppet cert sign --all` caso queira aprovar todos os hosts na fila, ou `$ sudo /opt/puppetlabs/bin/puppet cert sign <hostname>` caso queira aprovar um em específico.
- Revogando certificados
Você talvez queira em algum momento refazer um host do zero, neste caso precisará revogar o certificado com `$ sudo /opt/puppetlabs/bin/puppet cert clean <hostname>`
- Vendo todos os hosts assinados e não-assinados
Basta usar o comando `$ sudo /opt/puppetlabs/bin/puppet cert list --all`. Os hosts aprovados possuirão um `+` em sua frente.
- Usando o Puppet para instalar o Zabbix
Para os efeitos deste tutorial que apenas pretende executar os passos de instalação de um ambiente Zabbix, é necessário somente saber que:
- Master
1. O `Puppetfile` é um arquivo que lista todos os módulos que são dependência do seu manifest. Este arquivo deve ser editado em `/etc/puppetlabs/code/environments/production/Puppetfile`. **Estando** no diretório `/etc/puppetlabs/code/environments/production/`, execute `$ sudo /opt/puppetlabs/puppet/bin/r10k puppetfile install` para instalar os módulos. O `r10k` é um utilitário capaz de baixar essas dependências, mas é **incapaz de resolver dependências das suas dependências** (O Puppet Enterprise tem uma ferramenta mais inteligente para isso, baseada no r10k). 2. O diretório `/etc/puppetlabs/code/environments/production/manifests/` é onde os arquivos manifest (`.pp`) devem ser colocados por padrão. O Puppet analisa cada um dos arquivos (e subdiretórios) em ordem numérica-alfabética, de forma que o conteúdo do arquivo `01.pp` vai ser analisado antes do arquivo `abacaxi.pp` que vai ser analisado antes do arquivo `pamonha.pp`. 3. Geralmente a instalação do Puppet vem com um arquivo `/etc/puppetlabs/code/environments/production/manifests/site.pp` em branco. Edite ou substitua com o conteúdo do arquivo `site.pp` que acompanha. No exemplo, `agent1.puppet`, `agent2.puppet` e `agent3.puppet` se referem aos hostnames/domínios atribuídos a cada máquina. Note que é perfeiramente possível separar cada definição em arquivos diferentes, assim `zabbix_web.pp`, `zabbix_mysql.pp`, `zabbix_proxy.pp` são nomes de arquivos para organizar o diretório. 4. Por padrão os Agents checam o Master a cada 30 minutos. Como os intervalos não são sincronizados entre as máquinas, isso causará um pequeno problema (já que o node com o banco de dados precisa ser configurado antes do node com o Zabbix Server, por exemplo). Veremos como proceder a seguir.
- Agents
1. Em cada agent que precisar aplicação imediada das definições, você poderá executar `$ sudo /opt/puppetlabs/bin/puppet agent --test` 2. O Zabbix Server e o Web precisam de um banco de dados para poderem proceder com a instalação. O Puppet é inteligente o suficiente para realizar as coisas por etapas sem comprometer o todo. Isso significa que você pode esperar por uma ou duas horas até que os agents tenham completado os ciclos de atualização para que tenha um ambiente instalado e funcional. Ou pode simplesmente executar o comando acima em cada uma das máquinas, começando com o node do banco de dados, porque é preciso criá-lo antes de instalar o Zabbix. 3. O node com o Zabbix Server talvez precise de **3 execuções** do comando do passo 1. O que acontece é que em distribuições RedHat-like alguns erros de permissão acontecem e a cada execução eles são resolvidos gradualmente pelo módulo.
- Parabéns!!!*** Se tudo deu certo, você já poderá utilizar o ambiente Zabbix! Acesse o Zabbix Web **pelo domínio** definido no manifest. O usuário e a senha padrão do banco é *zabbix_server* e *zabbix_server*.
Isto é só o começo, há outras otimizações e truques que podem ser feitos com o Puppet, porém o necessário está aqui.
- _Obs.:_** Se precisar alterar alguma configuração, siga o modelo do resto do manifest. No módulo [puppet/zabbix](https://forge.puppet.com/puppet/zabbix), há uma chave para cada item nos arquivos de configuração dos daemons do Zabbix, grafada exatamente da mesma forma, só que em minúsculas.