Alisson Machado
07 November 2016

Ansible instalando Puppet

Existem alguns artigos na internet que comparam Ansible e Puppet como concorrentes e que Ansible substitui o Puppet e assim por diante, mas na minha opinião as ferramentas se complementam, no meu dia a dia eu adotei a seguinte filosofia:


Deploys -> Ansible Gerênciamento de Configuração -> Puppet


Então esse post tem como objetivo mostrar como o Ansible pode ser utilizado para fazer a instalação do Puppet em uma máquina que acabou de ser criada.


Afinal sabe-se que o puppet para funcionar é necessário que seja feita a instalação de um agent e sincronizado com o servidor master e esse trabalho teóricamente é manual, mas podemos automatizar esse processo utilizando o Ansible.


A única coisa que o Ansible precisa para executar em uma máquina é o acesso via SSH, então vamos ver como isso funciona. No exemplo abaixo vou criar um Playbook, que vai instalar o servidor do Puppet Master.


Um Playbook é um arquivo com todas as instruções para a execução de uma determinada tarefa, uma boa prática é criar Roles ao invés de Playbooks, pois as Roles além de serem mais organizadas tornam os seus scripts do Ansible reutilizáveis, mas isso é assunto pra outro post. Abaixo segue a playbook para instalar o servidor puppet master:

---
- hosts: puppet
  user: root
  vars:
    master_name: puppetmaster
    master_name_domain: puppetmaster.responsus.com.br
  tasks:
  - name: Configuring hostname
    hostname: name=puppetmaster.responsus.com.br
  - name: Installing puppet
    apt: name=puppet state=latest
  - name: Deleting certificates
    file: path=/var/lib/puppet/ssl state=absent
  - name: Copying template file
    template: src=puppet.conf.tpl dest=/etc/puppet/puppet.conf
  - name: Generating Cert
    shell: puppet master --verbose


Uma playbook do ansible é bem simples, é basicamente um arquivo no formato yaml, com palavras chaves específicas do ansible. Agora temos também o arquivo hosts que fica da seguinte maneira:

[puppet]
192.168.0.112


Um terceiro arquivo que temos que criar também é o arquivo de template, pois é necessário configurar o puppet.conf com o hostname da máquina em que ele será instalado. O arquivo de template ficará da seguinte maneira:

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
prerun_command=/etc/puppet/etckeeper-commit-pre
postrun_commnad=/etc/puppet/etckeeper-commit-post
certname = {{master_name}}
dns_alt_name = {{master_name}}, {{master_name_domain}}

[master]
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_file_header = SSL_CLIENT_VERIFY


Note que em certname e dns_alt_name são as variáveis que estão dentro da seção vars no nosso playbook. Não esqueça de que é necessário fazer a liberação de acesso através de chaves, para copiar a chave da sua máquina local para o servidor em que será instalado o puppet você pode executar a seguinte instrução:

ssh-keygen
ssh-copy-id root@192.168.0.112


O primeiro comando vai gerar uma nova chave que será armazenada em ~/.ssh/id_rsa e o segundo comando vai copiar esse chave para o outro servidor. Agora para executar a playbook deve ser executado o seguinte comando:

alisson@alisson-laptop:~/Ansible$ ansible-playbook puppetmaster.yml  -i hosts 


A saída do comando deverá ser parecida com essa:

PLAY [puppet] ******************************************************************

TASK [setup] *******************************************************************
ok: [192.168.0.112]

TASK [Configuring hostname] ****************************************************
ok: [192.168.0.112]

TASK [Installing puppet] *******************************************************
changed: [192.168.0.112]

TASK [Deleting certificates] ***************************************************
changed: [192.168.0.112]

TASK [Copying template file] ***************************************************
ok: [192.168.0.112]

TASK [Generating Cert] *********************************************************
changed: [192.168.0.112]

PLAY RECAP *********************************************************************
192.168.0.112              : ok=6    changed=3    unreachable=0    failed=0   


Caso você queira validar se o seu servidor foi instalado com sucesso basta logar na máquina e executar o seguinte comando:

root@puppetmaster:~# puppet cert list --all
+ "puppetmaster.responsus.com.br" (SHA256) 8C:CA:78:2D:55:2F:94:84:EF:08:E5:B5:CC:FD:1F:4A:62:EF:E2:21:45:57:5F:7D:56:CC:58:7C:49:4A:3A:45 (alt names: "DNS:puppet", "DNS:puppet.responsus.com.br", "DNS:puppetmaster.responsus.com.br")


Valeu! \o