Playbook
Vamos a crear nuestro primer playbook simple. Vamos a instalar Nginx para prueba.
AD-HOC vs Playbooks
Los comandos ad-hoc se pierden, y para eso colocamos todo en playbooks. Generalmente el uso de Ansible debe siempre ser hecho sobre playbooks.
¿Ya pensaste tener que hacer comando a comando de todo aquello que hiciste y ni consigues recordar nuevamente o reaprovechar lo que fue hecho? Con un archivo puedes tener una gerencia de tus comandos y dar mejor mantenimiento a tu parque de máquinas. En caso de configuración siempre utiliza playbook, en caso de consulta puedes usar el ad-hoc.
Vamos a alterar el host formando grupos ahora. En este caso cada vez que nos refiramos a webservers Ansible entrará en las dos máquinas, y db solamente en robot-2
[webservers]
robot-1
robot-2
[db]
robot-2
Primer playbook
Vea my_playbook para ver el archivo que vamos a aplicar.
Observa que ya colocamos los hosts que serán ejecutados en la tarea, luego ni necesitamos pasar los hosts Otro detalle es que pasamos el remote_user y cuando esta variable es pasada ella sustituye la que está definida en el .cfg
~/projects/ansible/study-ansible/Aula 3 - Playbook main !3 ?3 1.1.7 18:07:41
❯ ansible-playbook my_playbook.yml
PLAY [Install nginx] ******************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************
ok: [robot-2]
ok: [robot-1]
TASK [Instalando o Nginx] *************************************************************************************************************************************************************************
changed: [robot-1]
changed: [robot-2]
PLAY RECAP ****************************************************************************************************************************************************************************************
robot-1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
robot-2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
~/projects/ansible/study-ansible/Aula 3 - Playbook main !3 ?3 1.1.7 18:10:13
❯ curl http://robot-1:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
~/projects/ansible/study-ansible/Aula 3 - Playbook main !3 ?3 1.1.7 18:11:18
❯ ansible webservers -m shell -a "ps -ef | grep nginx"
robot-2 | CHANGED | rc=0 >>
root 13122 1 0 21:08 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 13125 13122 0 21:08 ? 00:00:00 nginx: worker process
ubuntu 13314 13313 0 21:11 pts/0 00:00:00 /bin/sh -c ps -ef | grep nginx
ubuntu 13316 13314 0 21:11 pts/0 00:00:00 grep nginx
robot-1 | CHANGED | rc=0 >>
root 13755 1 0 21:08 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 13758 13755 0 21:08 ? 00:00:00 nginx: worker process
ubuntu 13947 13946 0 21:11 pts/0 00:00:00 /bin/sh -c ps -ef | grep nginx
ubuntu 13949 13947 0 21:11 pts/0 00:00:00 grep nginx
Segundo playbook
Vea my_playbook2
En este caso vamos a usar el módulo de service para garantizar que el servicio estará activo e iniciado.
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html
~/projects/ansible/study-ansible/Aula 3 - Playbook main !3 ?3 1.1.7 18:20:51
❯ ansible-playbook my_playbook\ 2.yml
PLAY [Install nginx] ******************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************
ok: [robot-2]
ok: [robot-1]
TASK [Instalando o Nginx] *************************************************************************************************************************************************************************
ok: [robot-1]
ok: [robot-2]
TASK [Habilitando service nginx] ******************************************************************************************************************************************************************
ok: [robot-1]
ok: [robot-2]
TASK [Startando service nginx] ********************************************************************************************************************************************************************
ok: [robot-2]
ok: [robot-1]
PLAY RECAP ****************************************************************************************************************************************************************************************
robot-1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
robot-2 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Tercera versión playbook
Vea my_playbook3 Vamos a usar el módulo copy y un handler que es notificado para reiniciar nginx cuando un archivo de configuración sea modificado.
Donde queda ok quiere decir que no alteró pues fueron hechos por los comandos anteriores, o sea, no reejecutará. Esto es la idempotencia.
❯ ansible-playbook my_playbook3.yml
PLAY [Install nginx] ******************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************
ok: [robot-1]
ok: [robot-2]
TASK [Instalando o Nginx] *************************************************************************************************************************************************************************
ok: [robot-2]
ok: [robot-1]
TASK [Habilitando service nginx] ******************************************************************************************************************************************************************
ok: [robot-1]
ok: [robot-2]
TASK [Startando service nginx] ********************************************************************************************************************************************************************
ok: [robot-2]
ok: [robot-1]
TASK [Copiando o index] ***************************************************************************************************************************************************************************
changed: [robot-2]
changed: [robot-1]
TASK [Copiando o nginx.conf] **********************************************************************************************************************************************************************
changed: [robot-2]
changed: [robot-1]
RUNNING HANDLER [Restantando o nginx] *************************************************************************************************************************************************************
changed: [robot-2]
changed: [robot-1]
PLAY RECAP ****************************************************************************************************************************************************************************************
robot-1 : ok=7 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
robot-2 : ok=7 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Extras
La ejecución de un playbook puede ser hecha con algunos extras.
Puede ejecutar con varios niveles de verbosidad.
ansible-playbook main.yml
ansible-playbook main.yml -v
ansible-playbook main.yml -vv
ansible-playbook main.yml -vvv
ansible-playbook main.yml -vvvv
Sirve para ensayar los cambios y lo que sucedería, bueno para una situación destructiva
ansible-playbook main.yml --check
Da para usar el diff para ver las diferencias
ansible-playbook main.yml --diff
Da para ejecutar llamando una tag específica para una role o tag para evitar correr el archivo entero
ansible-playbook main.yml --tag "install_role"
o sumando todo
ansible-playbook main.yml --diff -vv --tag"install_role"