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