Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ansible Automatizacion para Todos
Ansible Automatizacion para Todos
com
ANSIBLE
Automatización para todos
ANSIBLE
Automatización para todos
ISBN: 978-607-538-330-9
ISBN: 978-607-538-330-9
Derechos reservados:
Esta obra es propiedad intelectual de su autor y los derechos de publicación en lengua española han
sido legalmente transferidos al editor. Prohibida su reproducción parcial o total por cualquier medio
sin permiso por escrito del propietario de los derechos del copyright.
Nota importante:
La información contenida en esta obra tiene un fin exclusivamente didáctico y, por lo tanto, no está
previsto su aprovechamiento a nivel profesional o industrial. Las indicaciones técnicas y programas
incluidos, han sido elaborados con gran cuidado por el autor y reproducidos bajo estrictas normas de
control. ALFAOMEGA GRUPO EDITOR, S.A. de C.V. no será jurídicamente responsable por:
errores u omisiones; daños y perjuicios que se pudieran atribuir al uso de la información comprendida
en este libro, ni por la utilización indebida que pudiera dársele. d e s c a r g a do en: e y b o o k s.c o m
Edición autorizada para venta en México y todo el continente americano.
Impreso en México. Printed in Mexico.
A Miriam y a Jonathan, por estar siempre ahí ayudando cuando se les necesita.
ÍNDICE
© Alfaomega-RC Libros IX
ANSIBLE
X © Alfaomega-RC Libros
ÍNDICE
© Alfaomega-RC Libros XI
ANSIBLE
© Alfaomega-RC Libros XV
ANSIBLE
ENV............................................................................................................... 321
FILE ............................................................................................................... 322
INI ................................................................................................................. 322
PASSWORD ................................................................................................... 323
PIPE .............................................................................................................. 323
URL ............................................................................................................... 324
FILTROS ............................................................................................................ 325
VAULT............................................................................................................... 348
ANSIBLE-VAULT ............................................................................................ 348
create ....................................................................................................... 348
edit ........................................................................................................... 349
encrypt ..................................................................................................... 349
decrypt ..................................................................................................... 350
rekey ........................................................................................................ 350
view .......................................................................................................... 350
ANSIBLE-PLAYBOOK ..................................................................................... 351
TAREAS ASÍNCRONAS ....................................................................................... 352
OPCIONES AVANZADAS .................................................................................... 355
EXTENDER ANSIBLE .......................................................................................... 357
LOOKUP ........................................................................................................ 357
FILTROS ........................................................................................................ 358
MÓDULOS .................................................................................................... 359
INVENTARIO ................................................................................................. 361
Bucles avanzados ............................................................................................. 361
Local facts......................................................................................................... 364
CAPÍTULO 7. ANSIBLE GALAXY ........................................................................ 367
INTRODUCCIÓN................................................................................................ 367
Trabajos............................................................................................................ 403
Programar ........................................................................................................ 405
Notificaciones .................................................................................................. 406
Permisos ........................................................................................................... 407
Proyectos ..................................................................................................... 407
Inventarios ................................................................................................... 407
Plantillas ....................................................................................................... 408
Credenciales ................................................................................................. 409
Avanzado.......................................................................................................... 410
Inventario inteligente ................................................................................... 410
Encuesta (survey) ......................................................................................... 411
Callback ........................................................................................................ 413
Copia de seguridad / Restauración .............................................................. 414
INTRODUCCIÓN
En los últimos años ha habido una evolución desde una infraestructura on site
a una infraestructura en la nube (cloud). Ansible permite trabajar con los
proveedores más famosos de Cloud para automatizar no solo el despliegue de
instancias, sino también para gestionar los diferentes componentes en la nube,
como pueden ser redes, grupos de seguridad, claves públicas y direcciones IP
públicas. Entre la amplia lista de proveedores en la nube que se pueden gestionar,
se encuentran Amazon Web Services, Azure y Google Cloud Platform.
Para los clientes que posean su propia infraestructura como servicio (IaaS,
Infrastructure as a Service) también posee soporte para una gran variedad, entre
los que destacan VMware, OpenStack y Ovirt (Red Hat Virtualization).
2 © Alfaomega-RC Libros
CAPÍTULO 1: QUÉ ES ANSIBLE
Glosario
Los diferentes elementos que resumimos a continuación se detallarán en
profundidad a lo largo del libro.
© Alfaomega-RC Libros 3
INSTALACIÓN
INTRODUCCIÓN
CentOS/RHEL/Scientific Linux 7
En las últimas versiones de Ansible ha habido un cambio del repositorio donde
están disponible los paquetes. Anteriormente (y actualmente para las versiones 6)
se ofrecía a través de EPEL (Extra Packages for Enterprise Linux) pero en las
últimas versiones, a partir de la 2.3, se ofrece a través del repositorio Extras.
yum-config-manager --enablerepo=extras
Ubuntu/Debian
Para Ubuntu debemos instalar el paquete software-properties-common y
añadir el repositorio PPA de ansible.
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
6 © Alfaomega-RC Libros
CAPÍTULO 2: INSTALACIÓN
Gentoo
FreeBSD
Solaris
# pkgadd -d http://get.opencsw.org/now
# /opt/csw/bin/pkgutil -i ansible
Arch Linux
Código fuente
Desde código fuente (Ejemplo usando el tarball de la versión 2.4.0):
© Alfaomega-RC Libros 7
ANSIBLE
# wget https://github.com/ansible/ansible/archive/v2.4.0.0-
1.tar.gz
# tar xvfz v2.4.0.0-1.tar.gz
# cd ansible-2.4.0.0-1/
# python setup.py install
PIP
Para instalar PIP se puede utilizar easy_install y utilizando pip podemos instalar
la última versión de Ansible o una versión específica (ejemplo: ansible==2.4.2.0)
# easy_install pip
Searching for pip
Best match: pip 1.5.4
Adding pip 1.5.4 to easy-install.pth file
Installing pip script to /usr/local/bin
Installing pip2.7 script to /usr/local/bin
Installing pip2 script to /usr/local/bin
Using /usr/lib/python2.7/dist-packages
Processing dependencies for pip
Finished processing dependencies for pip# pip install
ansible
Downloading/unpacking ansible
Downloading ansible-2.4.3.0.tar.gz (6.5MB): 6.5MB
downloaded
Running setup.py
(path:/tmp/pip_build_root/ansible/setup.py) egg_info for
package ansible
[...]Successfully installed ansible paramiko pyasn1 bcrypt
pynacl
Cleaning up...
# ansible --version
ansible 2.4.3.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/usr/share/ansible']
ansible python module location =
/usr/local/lib/python2.7/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 2.7.6 (default, Nov 23 2017, 15:49:48)
[GCC 4.8.4]
8 © Alfaomega-RC Libros
PRIMEROS PASOS
INTRODUCCIÓN
Una vez instalado Ansible, en este capítulo se detallan los primeros pasos que
podemos realizar para comprender el funcionamiento y cómo nos conectaremos
a los nodos que vamos a administrar.
El primer paso es definir los servidores que queremos administrar, para ello los
añadiremos dentro del fichero /etc/ansible/hosts, en el caso de que este fichero
no incluya ningún nodo, solo localhost (el servidor donde estamos ejecutando
Ansible) estará disponible.
Los nodos definidos dentro del fichero hosts, por defecto, serán configurados
para que la conexión a ellos se realice a través de SSH. Un ejemplo de este fichero
para administrar tres nodos es el siguiente (las líneas que empiezan por "#" son
comentarios).
## db-[99:101]-node.example.com
www.oforte.net
cloud.oforte.net
lab.oforte.net
www.oforte.net
cloud.oforte.net
lab.oforte.net
En este caso vemos que la conexión a dos servidores ha sido correcta, pero en
cambio el último servidor nos dice que no se ha podido conectar por SSH. Esto es
debido a que la clave pública del usuario que está ejecutando el comando ansible,
no ha sido incluida dentro de las claves autorizadas de dicho servidor. Podemos
copiar la clave pública usando ssh-copy-id y comprobar de nuevo la conexión:
# ssh-copy-id root@lab.oforte.net
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new
key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if
you are prompted now it is to install the new keys
root@lab.oforte.net's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh root@lab.oforte.net'"
and check to make sure that only the key(s) you wanted were added.
# ansible lab.oforte.net -m ping
lab.oforte.net | SUCCESS => {
"changed": false,
"ping": "pong"
}
10 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
www.oforte.net
cloud.oforte.net
lab.oforte.net
localhost ansible_connection=local
© Alfaomega-RC Libros 11
ANSIBLE
Inventario
Ansible puede administrar distintas infraestructuras en diferentes entornos,
para ello debemos tener un inventario con los nodos a administrar. Como se
indica anteriormente por defecto se define en /etc/ansible/hosts pero con la
opción --inventory [-i] podemos especificar otro fichero que contenga una lista de
nodos a utilizar. Más adelante veremos los inventarios dinámicos, para obtener
una lista de los nodos automáticamente de un proveedor o de un CMDB (base de
datos de gestión de configuración).
El formato del fichero estático puede ser en INI o YAML (detallaremos este
formato posteriormente). Dentro del inventario podemos agrupar los nodos en
grupos y los grupos en grupos superiores. Un nodo puede pertenecer a varios
grupos, veamos un ejemplo:
[webs]
www.oforte.net
portal.oforte.net
[cloud]
12 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
cloud.oforte.net
lab.oforte.net
[admin]
cloud.oforte.net
localhost ansible_connection=local
© Alfaomega-RC Libros 13
ANSIBLE
[webs]
www.oforte.net
portal.oforte.net
[webs:vars]
ansible_port=2222
entorno=PROD
En este caso utilizamos la sintaxis [grupo:vars] para definir los parámetros y las
variables (personalizadas) para todos los nodos dentro de ese grupo. Para la
creación de un grupo que contenta otros grupos, utilizaremos la sintaxis
[grupo:children] como se muestra a continuación:
[oforte:children]
webs
cloud
La lista de nodos para el nuevo grupo llamado oforte contendrá los servidores
de los grupos webs y cloud.
|-/etc/ansible/hosts
|--/etc/ansible/host_vars/
|---/etc/ansible/host_vars/all.yml
|---/etc/ansible/host_vars/servidor1.yml
|---/etc/ansible/host_vars/servidor2.yml
|--/etc/ansible/group_vars/
|---/etc/ansible/group_vars/all.yml
|---/etc/ansible/group_vars/grupo1.yml
|---/etc/ansible/group_vars/grupo2.yml
En el caso de que el fichero sea hosts (que puede tener un nombre diferente),
la estructura es similar:
14 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
|-/inventario/production/servidores
|--/inventario/production/host_vars/
|---/inventario/production/host_vars/all.yml
|---/inventario/production/host_vars/servidor1.yml
|---/inventario/production/host_vars/servidor2.yml
|-/inventario/production/group_vars/
|---/inventario/production/group_vars/all.yml
|---/inventario/production/group_vars/grupo1.yml
|---/inventario/production/group_vars/grupo2.yml
/inventario/production/host_vars/all.yml
entorno: prod
/inventario/production/host_vars/servidor1.yml
ansible_host: 192.168.100.10
ansible_port: 22
ansible_user: agonzalez
Patrones
En el inventario es posible utilizar patrones para definir la lista de nodos a
administrar. Si el nombre de los servidores contiene un esquema de nombre
común, es posible incluir esta sintaxis:
web[01:05].oforte.net http_port=80
● web01.oforte.net
● web02.oforte.net
● web03.oforte.net
● web04.oforte.net
● web05.oforte.net
backup-[a:e].oforte.net backup_server=backup.oforte.net
© Alfaomega-RC Libros 15
ANSIBLE
● backup-a.oforte.net
● backup-b.oforte.net
● backup-c.oforte.net
● backup-d.oforte.net
● backup-e.oforte.net
lab.oforte.net
[webs]
web[01:05].oforte.net http_port=80
[backup]
backup-[a:e].oforte.net backup_server=backup.oforte.net
[oforte:children]
webs
backup
[oforte:vars]
cliente=ofortenet
Listar todos.
# ansible all --inventory /inventarios/produccion --list-
hosts
hosts (11):
lab.oforte.net
web01.oforte.net
web02.oforte.net
web03.oforte.net
web04.oforte.net
web05.oforte.net
backup-a.oforte.net
backup-b.oforte.net
backup-c.oforte.net
backup-d.oforte.net
backup-e.oforte.net
16 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
YAML
En los inventarios hemos visto que el formato por defecto es INI, pero en las
últimas versiones los inventarios se pueden definir en formato YAML. Todas las
tareas a ejecutar en los servidores se definirán en este formato. Primero
observemos la sintaxis de este formato.
© Alfaomega-RC Libros 17
ANSIBLE
---
título: lista de empleados
numero: 3
puestos:
- CEO
- CTO
- CFO
...
En este ejemplo observamos que la primera línea contiene tres guiones (---) y
la última tres puntos (...) para definir el inicio y el final del fichero. Estas dos líneas
son opcionales y habitualmente se incluye solo la primera línea. En este ejemplo
hemos definido una variable llamada título de tipo cadena de texto y otra llamada
número de tipo numérico. La variable puestos es una lista de elementos, cada
elemento está indentado (con espacios es lo recomendado) e inicia con un guion
continuado por un espacio. Otra manera de definir una lista (aunque menos
legible) es la siguiente:
YAML también nos permite crear una variable con una estructura de
diccionario (relacionando clave con un valor), ejemplo:
---
escritor:
nombre: Alberto
apellido: González
libros:
- Docker, guía práctica
- Ansible, automatización para todos
...
Un diccionario también es posible definirlo en una línea (se muestra otra vez lo
poco legible que puede ser):
18 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
---
escritores:
- alberto:
nombre: Alberto
apellido: González
libros:
- Docker, guía práctica
- Ansible, automatización para todos
- jonathan:
nombre: Jonathan
apellido: Veites
libros:
- Photoshop avanzado
...
---
verdad1: True # Sirve también: true, TRUE
verdad2: yes # Sirve también: Yes
falso1: False # Sirve también: false, FALSE
falso1: no # Sirve también No
...
---
cadena: "True"
cadena numero: "1.4"
...
YAML permite definir valores con múltiples líneas (usando el carácter especial
|) y la posibilidad de unirlas si fuese necesario (usando el carácter especial >).
Ejemplo:
---
separada_las_lineas: |
En un lugar de la Mancha,
de cuyo nombre no quiero acordarme,
© Alfaomega-RC Libros 19
ANSIBLE
webs:
hosts:
www.oforte.net:
www3.oforte.net:
vars:
entorno: prod
ansible_user: agonzalez
20 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
all:
children:
oforte:
children:
webs:
hosts:
www.oforte.net:
www3.oforte.net:
backup:
hosts:
backup.oforte.net:
backup2.oforte.net:
vars:
http_port: 80
Inventario dinámico
© Alfaomega-RC Libros 21
ANSIBLE
digital_ocean.ini
# Ansible DigitalOcean external inventory script settings
[digital_ocean]
api_token = f3938d5154a35588d8573f97c93e9aa8c119bf5695abd0
cache_path = /tmp
cache_max_age = 300
use_private_network = False
group_variables = {}
# python digital_ocean.py
{"droplets": [{"status": "active", "kernel": {"version":
"2016.07.13-DigitalOcean_loader_Ubuntu", "id": 7515,
"name": "DigitalOcean GrubLoader v0.2 (20160714)"},
"volume_ids": [], "locked": false, "name":
"users.oforte.net", "backup_ids": [], "created_at": "2014-
02-12T12:19:12Z", "snapshot_ids": [], "size_slug": "512mb",
"networks": {"v4": [{"type": "public", "netmask":
"255.255.255.0", "ip_address": "95.85.59.73", "gateway":
"95.85.59.1"}, {"type": "private", "netmask":
"255.255.0.0", "ip_address": "10.129.236.42", "gateway":
"10.129.0.1"}], "v6": []}, "next_backup_window": null,
"vcpus": 1, […]
22 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
gce.ini
[gce]
libcloud_secrets =
© Alfaomega-RC Libros 23
ANSIBLE
gce_service_account_email_address = ansible@oforte-
196215.iam.gserviceaccount.com
gce_service_account_pem_file_path = /root/oforte.pem
gce_project_id = oforte-196215
gce_zone =
[inventory]
inventory_ip_type =
[cache]
cache_path = ~/.ansible/tmp
cache_max_age = 300
ec2.ini
[ec2]
regions = all
regions_exclude = us-gov-west-1, cn-north-1
destination_variable = public_dns_name
vpc_destination_variable = ip_address
route53 = False
all_instances = False
[credentials]
aws_access_key_id = AKIAJW33G62O45YATHMA
aws_secret_access_key = sumvlXVT5gBae9RTeCwjsY6UY3
24 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
Combinar inventarios
Es posible utilizar más de un inventario, combinándolos para crear una lista de
nodos a administrar y también los grupos de ambos. Para ello en la opción --
inventory [-i] indicaremos un directorio que contiene los inventarios, ya sean
estáticos como dinámicos. Combinar inventarios es de gran utilidad para entornos
de Hybrid Cloud. Todos los ficheros dentro de dicho directorio serán utilizados
como inventario excepto que posean una de estas extensiones (configurable con
la opción inventory_ignore_extensions en ansible.cfg):
© Alfaomega-RC Libros 25
ANSIBLE
inventario/servidores_oforte
cloud.oforte.net
lab.oforte.net
[debian]
www.oforte.net
debian01
debian02
# ansible -i inventario/ debian --list-hosts
hosts (3):
www.oforte.net
debian01
debian02
Un módulo realiza una tarea dentro del nodo a administrar, algunos ejemplos:
26 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
Ejemplos:
© Alfaomega-RC Libros 27
ANSIBLE
"size": 62,
"src": "/home/alberto/.ansible/tmp/ansible-tmp-1519493870.36-
271590123807833/source",
"state": "file",
"uid": 0
}
centos02 | SUCCESS => {
"changed": true,
"checksum": "4676823f5982023c9b7a9a4a3ee1678bbfaa3c9b",
"dest": "/etc/resolv.conf",
"gid": 0,
"group": "root",
"md5sum": "a657efa732c738125e90d495d9625da0",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:net_conf_t:s0",
"size": 62,
"src": "/home/alberto/.ansible/tmp/ansible-tmp-1519493871.21-
201585933776831/source",
"state": "file",
"uid": 0
}
28 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
"state": "file",
"uid": 0
}
(omitido)
© Alfaomega-RC Libros 29
ANSIBLE
"stderr": "",
"stdout": "(omitido)",
"stdout_lines": [ (omitido) ]
}
debian02 | SUCCESS => {
"changed": true,
"stderr": "",
"stdout": "(omitido)",
"stdout_lines": [ (omitido) ]
}
30 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
El módulo setup sirve para obtener información del nodo, como puede ser la
versión del sistema operativo, la memoria total, las direcciones IP entre otra gran
cantidad de información útil.
© Alfaomega-RC Libros 31
ANSIBLE
"cached": 0,
"free": 0,
"total": 0,
"used": 0
}
},
"ansible_memtotal_mb": 3704,
(omitido)
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
},
"changed": false
}
Configuración
El fichero de configuración global contiene opciones diversas para el
funcionamiento de Ansible:
Sección Descripción
[defaults] Valores por defecto generales
[privilege_escalation] Configuración para escalar permisos
[ssh_connection] Opciones de OpenSSH
[selinux] Opciones para SELinux
[colors] Colores
Las opciones más comunes que se pueden especificar y los valores por defecto
se indican en la siguiente tabla:
32 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
© Alfaomega-RC Libros 33
ANSIBLE
34 © Alfaomega-RC Libros
CAPÍTULO 3: PRIMEROS PASOS
Windows
Como se indicaba en la introducción, es posible administrar servidores de
Windows. Al contrario que con los servidores Linux, donde el acceso se realiza por
SSH y no es requerido configurar nada, para Windows debemos hacer algunas
tareas previas:
● Instalar pywinrm:
○ CentOS/RHEL: yum install python2-winrm
○ Otras distribuciones: pip install pywinrm
● Especificar al nodo Windows a administrar el parámetro de conexión:
○ ansible_connection=winrm
● Ignorar la comprobación del certificado:
○ ansible_winrm_server_cert_validation=ignore
© Alfaomega-RC Libros 35
ANSIBLE
windows01 ansible_host=35.196.191.155
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
SSH password:
"ansible_os_name": "Microsoft Windows Server 2016
Datacenter",
36 © Alfaomega-RC Libros
PLAYBOOKS
INTRODUCCIÓN
---
- name: Mi primer playbook
hosts: debian
tasks:
- name: Copiar fichero a los servidores
copy: src=sources.list dest=/etc/apt/sources.list
...
En el ejemplo anterior:
---
- name: Conectar a los servidores Debian
hosts: debian
tasks:
- name: Copiar fichero a los servidores
copy: src=sources.list dest=/etc/apt/sources.list
- name: Conectar a los servidores CentOS
hosts: centos
tasks:
- name: Copiar fichero a los servidores
copy: src=cntos.repo dest=/etc/yum.repos.d/centos.repo
...
---
- name: Mi primer playbook
hosts: debian
38 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
remote_user: alberto
become: True
vars:
entorno: produccion
tasks:
- name: Copiar fichero a los servidores
copy: src=sources.list dest=/etc/apt/sources.list
...
© Alfaomega-RC Libros 39
ANSIBLE
Cuando ejecutamos un playbook, la primera tarea para cada uno de los plays
es conectarse a los servidores y obtener la información de cada uno de los nodos
(igual que el módulo setup que indicamos en el apartado de Ad-Hoc). En el caso
de no querer obtener esa información y querer acelerar el proceso de ejecución
es posible incluir al play la siguiente línea:
---
- name: Mi primer playbook
hosts: debian
gather_facts: False
[...]
Patrones
En la lista de nodos a utilizar podemos especificar un servidor o un grupo de
servidores. Además, podemos utilizar el asterisco (*) como comodín. Pero
también podemos indicar varios nodos y varios grupos separados por coma o por
dos puntos, esto funciona como un OR (lista que esté en un grupo o en otro):
En el caso de querer solo trabajar en los nodos que pertenece a dos grupos,
utilizaremos el carácter especial "&". Ejemplos:
40 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
Opciones ansible-playbook
Hemos visto que las opciones para ansible-playbook son muy similares a las
que hemos visto del comando ansible (--inventory, --limit, --list-hosts) pero
ansible-playbook incluye otras opciones útiles cuando trabajamos con playbooks:
Opción Descripción
--syntax-check Comprueba la sintaxis del playbook y de los
ficheros adicionales que son incluidos.
--check [-C] Ejecuta el playbook en modo "comprobar".
Realizará las tareas pero no hará cambios
en el servidor.
--lists-tasks Lista todas las tareas dentro del playbook.
--step Pregunta por cada tarea que hacer: si
ejecutarla o no. Además permite continuar y
ejecutar el resto de tareas sin preguntar.
--start-at-task Inicia el playbook en la tarea especificada
-v, --verbose Activa el modo de mostrar más información.
Con -vvv (3) muestra más información y con
-vvvv (4) muestra información detallada de
la conexión.
Variables
Una variable contiene un valor modificable para dinamizar las tareas, algunos
de sus posibles usos se listan a continuación:
© Alfaomega-RC Libros 41
ANSIBLE
Esas variables pueden ser utilizadas tanto en los plays, como en las tareas y en
las plantillas. Además podrán ser usadas en condiciones y en bucles.
Las variables dentro de las plantillas son referidas con la siguiente sintaxis:
{{ nombre_variable }}
---
- hosts: localhost
vars:
mivariable: "Valor"
milista:
- "Valor lista 1"
- "Valor lista 2"
- "Valor lista 3"
tasks:
- name: Mostrar el valor de mivariable
debug: var=mivariable
- name: Mostrar el valor de milista
debug: msg="Elementos de la lista, {{ milista }}"
...
Opción Descripción
var=variable Muestra el valor de la variable especificada.
msg="Texto" Muestra el texto especificado y es posible
mostrar variables.
verbosity=num Controla cuándo mostrar el mensaje, de 1 (-v)
a 3 (-vvv o más).
# ansible-playbook variables.yml
PLAY [localhost] **********
TASK [Gathering Facts] ****
ok: [localhost]
42 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
[...]
TASK [Mostrar el valor de mivariable] *****
ok: [localhost] => {
"mivariable": "Variable de extra vars"
}
[..]
Handlers
Un handler es una tarea que solo se ejecutará en caso de que otra tarea le
llame. El uso más común es reiniciar un servicio en un handler cuando la
configuración es cambiada en una tarea.
---
- name: Copiar el fichero sshd_config
hosts: servidor
© Alfaomega-RC Libros 43
ANSIBLE
tasks:
- name: Copiar configuración
copy: src=sshd_config dest=/etc/ssh/sshd_config
notify: restart_sshd
handlers:
- name: restart_sshd
service: name=sshd state=restarted...
# ansible-playbook sshd.yml
PLAY [Copiar el fichero sshd_config] ******
TASK [Gathering Facts] ****
ok: [servidor]
TASK [Copiar configuracion] ***************
changed: [servidor]
RUNNING HANDLER [restart_sshd] ************
changed: [servidor]
# ansible-playbook sshd.yml
PLAY [Copiar el fichero sshd_config] ******
TASK [Gathering Facts] ****
ok: [servidor]
TASK [Copiar configuración] ***************
ok: [servidor]
---
- name: Copiar el fichero sshd_config
hosts: servidor
44 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
tasks:
- name: Copiar configuración
copy: src=sshd_config dest=/etc/ssh/sshd_config
notify: "reiniciar servicios sshd"
handlers:
- name: Reiniciar sshd
service: name=sshd state=restarted
listen: "reiniciar servicios sshd"
- name: Reiniciar autofs
service: name=autofs state=restarted
listen: "reiniciar servicios sshd"
...
# ansible-playbook sshd.yml
PLAY [Copiar el fichero sshd_config] ******
TASK [Gathering Facts] ****
ok: [servidor]
TASK [Copiar configuración] ***************
changed: [servidor]
RUNNING HANDLER [Reiniciar sshd] **********
changed: [servidor]
RUNNING HANDLER [Reiniciar autofs] ********
changed: [servidor]
Include e import
Es posible dividir un playbook en distintas partes para facilitar su edición y
tratado. A partir de la versión 2.4 es posible incluir ficheros de forma estática
(import) o de forma dinámica (include). Para incluir ficheros que contienen plays o
tareas, utilizaremos las siguientes expresiones:
© Alfaomega-RC Libros 45
ANSIBLE
46 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
# ansible-playbook instalar.yml
PLAY [Instalar Apache] ****
TASK [Gathering Facts] ****
ok: [servidor]
© Alfaomega-RC Libros 47
ANSIBLE
play_mysql.yml
---
- hosts: servidor
name: Instalar MySQL
tasks:
- include_vars: vars_mysql.yml
- include_tasks: tareas_mysql.yml
vars:
puerto: 3306
bbdd:
- web1
- app2
handlers:
- include_tasks: handlers_mysql.yml
...
48 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
handlers_mysql.yml
---
- name: Reiniciar MySQL
service: name=mysqld state=restarted
...
Prioridad variables
Hemos visto que hay diferentes maneras de definir variables y en diferentes
lugares donde hacerlo, desde la configuración del Play hasta variables dentro del
rol. En esta sección indicaremos qué variables tienen precedencia sobre las otras,
de menor precedencia a mayor:
© Alfaomega-RC Libros 49
ANSIBLE
● Variables del Play: son propias del Play que se está ejecutando, son
variables definidas con vars/vars_prompt/vars_files, variables y variables por
defecto de los roles.
● Variables del nodo: son variables asociadas directamente al nodo,
definidas en el inventario, include_vars, facts o variables definidas con register.
Roles
Con los roles podemos crear una estructura de ficheros y directorios para
separar los diferentes elementos: variables, tareas, handlers, ficheros y plantillas.
Esta estructura permite que sean reutilizados en diferentes proyectos.
Subdirectorio Descripción
Contiene la lista principal de tareas a ser
tasks ejecutadas por un rol.
Contiene handlers, que pueden ser
utilizadas por este rol o incluso desde
handlers cualquier sitio fuera del rol.
defaults Variables por defecto para el rol.
vars Otras variables para el rol.
Contiene ficheros que pueden ser
files desplegados en los nodos usando este rol.
50 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
Una vez definido uno o varios roles, debemos incluirlos dentro de nuestro
playbook. Para ello tenemos dos maneras de hacerlo:
---
- name: Utilizar roles
hosts: servidor
pre_tasks:
- command: deshabilitar_monitorizacion
roles:
- mysql
- {name: httpd}
post_tasks:
- command: habilitar_monitorizacion
...
mysql/defaults/main.yml
---
mysql_port: 3306
...
mysql/tasks/main.yml
---
- name: Instalar la versión especificada
© Alfaomega-RC Libros 51
ANSIBLE
52 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
[mysql]
[isamchk]
key_buffer= 16M
!includedir /etc/mysql/conf.d/
httpd/vars/main.yml
paquete: "apache2-mpm-worker"
httpd/tasks/main.yml
---
- name: Instalar el paquete especificado
apt: name="{{ paquete }}" state=present
- name: Copiar fichero de configuración
template: src=ports.conf dest=/etc/apache2/ports.conf
notify: "Reiniciar Apache"...
httpd/handlers/main.yml
---
- name: Reiniciar Apache
service: name=apache2 state=restarted
...
httpd/files/ports.conf
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
httpd/meta/main.yml
---
dependencies:
- { role: comun, distro: "Debian" }
A partir de la versión 2.4 de Ansible, es posible realizar lo mismo con las tareas
import_role o include_role como se muestra a continuación.
---
- name: Utilizar roles
hosts: servidor
© Alfaomega-RC Libros 53
ANSIBLE
tasks:
- command: deshabilitar_monitorizacion
- import_role:
name: mysql
- include_role:
name: httpd
- command: habilitar_monitorizacion...
Plantillas
Una plantilla (template) es un fichero dinámico que incluye variables e
instrucciones varias: condiciones, bucles, etc. Estas plantillas usan el lenguaje
Jinja2, que facilita el uso de plantillas y al igual que YAML es muy legible.
54 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
Condiciones
Es posible condicionar la ejecución de una tarea, la inclusión de un fichero (ya
sea de tareas o de playbooks) o el uso de un rol, utilizando la expresión when.
© Alfaomega-RC Libros 55
ANSIBLE
Modo clásico
roles:
- { name: apache2, http_port: 80, when: ansible_distribution == "Debian"}
- { name: httpd, http_port: 80, when: ansible_distribution == "CentOS" }
- include_role:
name: apache2
vars:
http_port: 80
when: ansible_distribution == "Debian" or ansible_distribution == "Ubuntu"
56 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
© Alfaomega-RC Libros 57
ANSIBLE
Bucles
En el capítulo de plantillas hemos visto cómo podemos recorrer una lista y
utilizar los valores dentro de ella. En esta sección veremos cómo recorrer listas y
diccionarios para realizar tareas con los elementos.
WITH_ITEMS
Con la expresión with_items podemos recorrer los elementos de una lista . Por
ejemplo si queremos instalar una lista de paquetes, en vez de definir varias tareas
por cada uno de los elementos, utilizaremos la siguiente sintaxis:
En caso de tener una lista de diccionarios, podemos utilizar los valores de cada
uno de los registros usando "{{ item.clave }}", como se muestra en el ejemplo
58 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
- hosts: servidor
tasks:
- name: Instalar lista de paquetes requeridos
apt: name="{{ item.nombre}}" state="{{ item.estado }}"
with_items:
- {nombre: nginx, estado: absent}
- {nombre: apache2, estado: present}
- {nombre: php5, estado: present}
- {nombre: mariadb-server, estado: present}
- {nombre: phpmyadmin, estado: present}
TASK [Instalar lista de paquetes requeridos] ***********
ok: [servidor] => (item={u'nombre': u'nginx', u'estado': u'absent'})
ok: [servidor] => (item={u'nombre': u'apache2', u'estado': u'present'})
ok: [servidor] => (item={u'nombre': u'php5', u'estado': u'present'})
changed: [servidor] => (item={u'nombre': u'mariadb-server', u'estado':
u'present'})
ok: [servidor] => (item={u'nombre': u'phpmyadmin', u'estado': u'present'})
- hosts: servidor
vars:
paquetes:
- php5
- mariadb-server
- phpmyadmin
tasks:
- name: Instalar lista de paquetes requeridos
apt: name="{{ item }}" state=present
with_items: "{{ paquetes }}"
- hosts: servidordebian
tasks:
- name: Instalar lista de paquetes requeridos
© Alfaomega-RC Libros 59
ANSIBLE
WITH_NESTED
Es posible anidar dos listas generando una mezcla de los elementos. Veamos
un ejemplo:
Con with_nested se combinará cada usuario con cada uno de los grupos, en la
siguiente tabla se muestra cada combinación con la que será llamada la tarea.
Usuario Grupo
Agonzalez administradores
agonzalez Usuarios
jveipen administradores
jveipen usuarios
mperez administradores
mperez usuarios
El playbook para crear los usuarios basado en esos grupos (los grupos fueron
creados previamente):
- hosts: servidor
vars:
usuarios:
- agonzalez
- jveipen
- mperez
60 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
grupos:
- administradores
- usuarios
tasks:
- group: name="{{ item }}"
with_items: "{{ grupos }}"
- user:
name: "{{ item[0] }}"
groups: "{{ item[1] }}"
append: true
with_nested:
- "{{ usuarios }}"
- "{{ grupos }}"
PLAY [servidor] **********
TASK [Gathering Facts] ****
ok: [ servidor]
WITH_DICT
Con with_items observábamos cómo recorrer una lista, esta puede contener
un diccionario y acceder a los elementos del mismo. Con la expresión with_dict
podemos recorrer un diccionario que contiene varios elementos. La clave de cada
uno de los registros se referencia con "{{ item.key }}" y los valores
© Alfaomega-RC Libros 61
ANSIBLE
- hosts: servidor
vars:
usuarios:
agonzalez:
grupos: "administradores, usuarios"
info: "CTO"
jveipen:
grupos: "administradores, usuarios"
info: "CEO"
mperez:
grupos: "usuarios"
info: "CFO"
tasks:
- user:
name: "{{ item.key }}"
groups: "{{ item.value.grupos }}"
comment: "{{ item.value.info }}"
with_dict: "{{ usuarios }}"
PLAY [servidor] **********
TASK [Gathering Facts] ****
ok: [servidor]
TASK [user] ***************
changed: [servidor] => (item={'value': {u'grupos':
u'administradores, usuarios', u'info': u'CEO'}, 'key':
u'jveipen'})
changed: [servidor] => (item={'value': {u'grupos':
u'administradores, usuarios', u'info': u'CTO'}, 'key':
u'agonzalez'})
changed: [servidor] => (item={'value': {u'grupos':
u'usuarios', u'info': u'CFO'}, 'key': u'mperez'})
62 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
Register
La expresión register permite guardar en una variable el resultado de una
acción realizada por una tarea. En el siguiente ejemplo, ejecutamos un comando
en el nodo administrado y alojamos el resultado en una variable.
© Alfaomega-RC Libros 63
ANSIBLE
Clave Descripción
changed true/false -> Indica si la tarea ha
finalizado correctamente (rc=0)
failed true/false -> Indica si la tarea ha fallado.
skipped true/false -> Indica si la tarea ha sido
omitida por una condición.
rc El código devuelto por el comando (return
code), si es 0 el comando se ha ejecutado
correctamente.
start La fecha y hora de inicio de ejecución de la
tarea.
end La fecha y hora de la finalización de
ejecución de la tarea.
delta La duración de ejecución de la tarea.
stderr Si la tarea muestra un mensaje por la salida
de errores, se alojará en este apartado.
stderr_lines Igual que stderr, pero como una lista: cada
línea será un elemento de ella.
stdout La salida devuelta por la tarea.
stdout_lines Igual que stdout, pero como una lista: cada
línea será un elemento de ella.
delegate_to
64 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
PLAY RECAP
www.oforte.net : ok=3 changed=2
unreachable=0 failed=0
ignore_errors
Si una tarea devuelve un error, ya sea ejecutar un comando o utilizar un
módulo de Ansible, el resto de tareas para ese nodo no se ejecutarán. Ansible
permite ignorar un error si consideramos que no afectará al resto de tareas, para
ello utilizaremos la expresión ignore_errors.
© Alfaomega-RC Libros 65
ANSIBLE
66 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
© Alfaomega-RC Libros 67
ANSIBLE
failed_when y changed_when
Ansible nos permite especificar condiciones para marcar una tarea como
fallida o como que ha modificado algo. Un ejemplo es ejecutando un comando, la
tarea es marcada como cambiada cuando el código de salida (rc) es igual a 0 y
fallida si es distinta a cero. Pero normalmente solo queremos marcar la tarea
como que ha cambiado algo si el texto de salida estándar indica que se ha
modificado. Lo mismo para marcar una tarea como fallida, desearemos
comprobar el texto de salida para saber si ha fallado.
Es posible establecer que una tarea nunca sea marcada como cambiada o
fallida utilizando como condición las palabras: False, false o el número 0.
68 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
Bloques
Los bloques en Ansible nos permiten agrupar un conjunto de tareas afines. La
mayoría de acciones que se pueden aplicar a una tarea se pueden aplicar a un
bloque: condiciones, privilegios, etc. La sintaxis es la siguiente:
© Alfaomega-RC Libros 69
ANSIBLE
Los bloques nos permite también gestionar los errores que puedan surgir de
las tareas que contienen y realizar acciones preventivas. Por ejemplo, si copiamos
un fichero de configuración y al reiniciar el servicio falla, es posible ejecutar una
tarea para restaurar el estado anterior. La estructura es la siguiente:
- hosts: servidor
gather_facts: False
tasks:
- name: Gestionar errores
block:
- name: Tarea1
tarea:
rescue:
- name: Tarea a ejecutar si falla Tarea1
tarea:
always:
- name: Tarea que se ejecuta siempre
tarea:
70 © Alfaomega-RC Libros
CAPÍTULO 4: PLAYBOOKS
command: lsb_release -d
register: version
rescue:
- name: Si no existe lsb_release
command: cat /etc/debian_version
register: version
when: ansible_distribution == "Debian"
- name: Si no existe lsb_release
command: cat /etc/centos-release
register: version
when: ansible_distribution == "CentOS"
always:
- name: Ver versión
debug: msg="{{ version.stdout }}"
Salida de la ejecución.
PLAY [all] ****************
TASK [Gathering Facts] ****
ok: [debian01]
ok: [centos01]
TASK [Leer la configuración de lsb_release] ***************
changed: [debian01]
fatal: [centos01]: FAILED! => {"changed": false, "cmd":
"lsb_release -d", "msg": "[Errno 2] No such file or
directory", "rc": 2}
TASK [Si no existe lsb_release] ***********
skipping: [centos01]
TASK [Si no existe lsb_release] ***********
changed: [centos01]
TASK [Ver versión] ********
ok: [centos01] => {
"msg": "CentOS Linux release 7.4.1708 (Core) "
}
ok: [debian01] => {
"msg": "Description:\tDebian GNU/Linux 9.3 (stretch)"
}
© Alfaomega-RC Libros 71
MÓDULOS
MÓDULOS
Ansible está compuesto de una multitud de módulos, que son los encargados
de administrar sistemas, dispositivos, usuarios y una gran cantidad de diferentes
elementos. Cada tarea en un playbook está asociada a un módulo. Cada módulo
contiene varios argumentos que pueden ser obligatorios u opcionales, y además
suelen tener valores por defecto.
Categoría Descripción
Cloud Módulos para administrar proveedores de cloud
(de la nube).
Módulos para gestionar diferentes tipos de
Clustering cluster.
Módulos para ejecutar comandos en nodos
Commands remotos.
Crypto Módulos para OpenSSL.
Módulos para gestionar diferentes gestores de
Database base de datos.
Files Módulos para manipular y tratar ficheros.
Módulos para administrar distintos
Identity proveedores de autenticación.
ANSIBLE
# ansible-doc –l
a10_server Manage A10 Networks AX/SoftAX/Thunder/vThunder devices' server object.
a10_server_axapi3 Manage A10 Networks AX/SoftAX/Thunder/vThunder devices
a10_service_group Manage A10 Networks AX/SoftAX/Thunder/vThunder devices' service
groups.
a10_virtual_server Manage A10 Networks AX/SoftAX/Thunder/vThunder devices' virtual
servers.
accelerate Enable accelerated mode on remote node
aci_aep Manage attachable Access Entity Profile (AEP) on Cisco ACI fabrics
(infra:AttEntityP)
[...]
74 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
Información NOTES:
extra * For Windows targets, use the [win_group]
module instead.
Requisitos REQUIREMENTS: groupadd, groupdel, groupmod
Autor AUTHOR: Stephen Fromm (@sfromm)
METADATA:
status:
- stableinterface
supported_by: core
Ejemplos de EXAMPLES:
uso # Example group command from Ansible
Playbooks
- group:
name: somegroup
state: present
© Alfaomega-RC Libros 75
ANSIBLE
76 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
ARGUMENTOS SELINUX
ARGUMENTOS PERMISOS
© Alfaomega-RC Libros 77
ANSIBLE
MÓDULO ACL
Argumentos obligatorios
path=ruta La ruta completa del fichero u objeto.
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
yes Si el destino es un directorio,
no estableciendo esta opción a yes, hará
este ACL como el defecto para el
default contenido creado dentro del mismo.
Usuario real o grupo al que se aplica
la ACL cuando se seleccionan tipos de
entidades coincidentes, usuario o
entity grupo.
user El tipo de entidad del ACL a aplicar.
group´
mask
etype other
yes Indica si debe seguir enlaces
follow no simbólicos si son encontrados.
Permisos a aplicar/eliminar que pueden
ser una combinación de r (lectura), w
permissions (escritura) y x (ejecución).
yes Establece de forma recursiva la ACL
recursive no indicada.
query Define si la ACL debe estar presente o
presen no. El estado query obtiene el valor
state tabsent actual sin cambiarlo.
78 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
gather_facts: False
tasks:
- acl:
path: /etc/apache2/sites-enabled/005-correo.conf
register: datos_acl
- debug: var=datos_acl
TASK [debug] **************
ok: [servidor] => {
"datos_acl": {
"acl": [
"user::rw-",
"group::r--",
"other::r--"
],
"changed": false,
"failed": false,
"msg": "current acl"
}
}
Añadir ACL para que un usuario pueda modificar el fichero.
- name: Modificar y Consultar ACLs
hosts: servidor
gather_facts: False
tasks:
- acl:
path: /etc/apache2/sites-enabled/005-correo.conf
entity: alberto
etype: user
permissions: rw
state: present
- acl:
path: /etc/apache2/sites-enabled/005-correo.conf
register: datos_acl
- debug: var=datos_acl
TASK [debug] **************
ok: [servidor] => {
"datos_acl": {
"acl": [
"user::rw-",
"user:alberto:rw-",
"group::r--",
"mask::rw-",
"other::r--"
© Alfaomega-RC Libros 79
ANSIBLE
],
"changed": false,
"failed": false,
"msg": "current acl"
}
}
# getfacl /etc/apache2/sites-enabled/005-correo.conf
# file: etc/apache2/sites-enabled/005-correo.conf
# owner: root
# group: root
user::rw-
user:alberto:rw-
group::r--
mask::rw-
MÓDULO ARCHIVE
Argumentos obligatorios
path=ruta Ruta absoluta remota, expresión o lista de
rutas o de expresiones de ficheros(o) a
comprimir o archivar.
Argumentos permisos y Argumentos SELinux
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
dest El nombre del fichero del archivo
destino. Requerido cuando se
especifican múltiples ficheros.
exclude_path Ruta absoluta remota, expresión o
listas de rutas o de expresiones de
fichero(s) a excluir del archivo.
format gzbz2 El tipo de compresión a utilizar.
zip
remove Elimina cualquier fichero origen y
directorio después de archivarlo.
80 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
MÓDULO ASSEMBLE
Argumentos obligatorios
src=ruta Un directorio existente que contiene los
ficheros origen.
dest=ruta El fichero a crear usando la concatenación de
todos los ficheros origen.
Argumentos permisos y Argumentos SELinux
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
© Alfaomega-RC Libros 81
ANSIBLE
82 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
MÓDULO BLOCKINFILE
Argumentos obligatorios
path=ruta El fichero a modificar.
dest=ruta
destfile=ruta
name=ruta
Argumentos permisos y Argumentos SELinux
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
blockcontent El texto a insertar en medio de las
marcas.
create no Crea un fichero nuevo si no existe.
yes
follow no Indica si seguir un enlace
yes simbólico.
insertafter EOF Si se especifica, se insertará
*regex* después de la línea encontrada con
dicha expresión. Si no se
especifica, se insertará al final
del fichero.
insertbefore BOF Si se especifica, se insertará antes
*regex* de la línea encontrada con dicha
expresión. Si no se especifica, se
insertará al final del fichero.
marker La línea a utilizar como marca.
"{mark}" será sustituido con "BEGIN"
o "END".
state present Indica si el bloque debe estar
absent presente o no.
© Alfaomega-RC Libros 83
ANSIBLE
backup: yes
block: |
Este es un sistema protegido,
solo está permitido el acceso a usuarios autorizados
Contenido del fichero /etc/motd después de la ejecución.
# cat /etc/motd
Linux cloud.oforte.net 3.16.0-4-amd64 #1 SMP Debian
server : 211983
ip : 91.121.79.141
hostname : cloud.oforte.net
# BEGIN ANSIBLE MANAGED BLOCK
Este es un sistema protegido,
solo está permitido el acceso a usuarios autorizados
# END ANSIBLE MANAGED BLOCK
MÓDULO COPY
Argumentos obligatorios
Ruta absoluta donde el fichero será copiado.
dest=ruta Si el destino no existe, será creado.
Argumentos permisos y Argumentos SELinux
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
content Si no se utiliza el argumento src,
el contenido indicado en este
argumento será usado para rellenar
el fichero.
decrypt yes Controla si se descifra
no automáticamente el fichero (cifrado
con Ansible Vault).
directory_mode Cuando se realiza una copia
recursiva indica si se establecen
los permisos de los directorios.
follow no Indica si debe ser un enlace
yes simbólico.
forcethirsty yes Si se debe sobrescribir el contenido
no del fichero. Si se establece a no,
solo se copiará si el destino no
existe.
84 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
© Alfaomega-RC Libros 85
ANSIBLE
MÓDULO FETCH
Argumentos obligatorios
src=ruta El fichero en el nodo remoto a obtener.
El directorio donde salvar el fichero
obtenido. Se creará un subdirectorio con
dest=ruta el nombre del nodo.
Argumentos opcionales (Negrita indica el valor por defecto)
fail_on_missing yes Indica si la tarea será marcada como
no fallida si el fichero remoto que
deseamos obtener no existe.
flat Permite sobrescribir el
comportamiento por defecto de crear
un subdirectorio con el nombre del
nodo.
validate_checksum yes Verifica si el fichero origen y el
validate_m5 no destino coinciden a través de
comprobaciones checksum.
86 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
MÓDULO FILE
Argumento obligatorio
path=ruta Ruta del fichero a ser administrado.
dest=ruta
name=ruta
© Alfaomega-RC Libros 87
ANSIBLE
Ejemplos:
88 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
path: /etc/issue.net
state: absent
- name: Crear el enlace simbólico
file:
src: /etc/issue
path: /etc/issue.net
state: link
En el siguiente ejemplo creamos un directorio llamado
/var/log/journal para que journald sea persistente.
- name: Crear el directorio /var/log/journal
hosts: servidor
tasks:
- name: Crear /var/log/journal si no existe
file:
path: /var/log/journal
state: directory
owner: root
group: systemd-journal
mode: 2755
notify: restart_journald
handlers:
- name: restart_journald
service:
name: systemd-journald
state: restarted
MÓDULO FIND
Argumentos obligatorios
paths=ruta(s) Lista de ruta de directorios a buscar. Todas
name=ruta(s) las rutas deben ser absolutas.
path=ruta(s)
© Alfaomega-RC Libros 89
ANSIBLE
90 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
En el siguiente ejemplo se combinan los módulos find con file. Con el primero
buscamos ficheros más antiguos de una semana y con el segundo los eliminamos.
© Alfaomega-RC Libros 91
ANSIBLE
MÓDULO INI_FILE
Argumentos obligatorios
path=ruta Ruta al fichero con formato INI. Este
dest=ruta fichero puede ser creado si no existe.
section=sección Nombre de la sección en el fichero INI.
Argumentos permisos y Argumentos SELinux
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
create yes Por defecto el fichero será creado
no si no existe.
no_extra_spaces No incluir espacios antes y despúes
del símbolo =.
option El nombre de la opción.
state present Si es establecido a absent se
absent borrará la opción o la sección. Con
present se crearán.
value El valor a ser asociado a la
opción.
92 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
MÓDULO LINEINFILE
Argumentos obligatorios
path=ruta El fichero a modificar.
dest=ruta
destfile=ruta
name=ruta
Argumentos permisos y Argumentos SELinux
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
backrefs no Especifica si la expresión puede
yes contener referencias anteriores.
create no Especifica si el fichero debe ser
yes creado si no existe.
insertafter EOF Si se especifica, se insertará
*regex* después de la línea encontrada con
dicha expresión. Si no se especifica
se insertará al final del fichero.
insertbefore BOF Si se especifica, se insertará antes
*regex* de la línea encontrada con dicha
expresión. Si no se especifica se
insertará al final del fichero.
line La línea a insertar o reemplazar.
© Alfaomega-RC Libros 93
ANSIBLE
94 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
© Alfaomega-RC Libros 95
ANSIBLE
MÓDULO REPLACE
Argumentos obligatorios
path=ruta El fichero a modificar.
dest=ruta
destfile=ruta
name=ruta
Argumentos permisos y Argumentos SELinux
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
after Si se especifica, la línea a partir
de la cual la búsqueda se inicia para
reemplazar/eliminar.
before Si se especifica, la línea a partir
de la cual la búsqueda se termina
para reemplazar/eliminar.
encoding El juego de caracteres para
leer/escribir el fichero. Por defecto
utf-8.
follow no Indica si se debe seguir un enlace
yes simbólico.
regexp La expresión regular a buscar en el
contenido del fichero.
replace La cadena a reemplazar cuando la
expresión encuentra una coincidencia.
96 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
MÓDULO STAT
Argumentos obligatorios
path=ruta La ruta entera al
fichero/objeto para obtener
información.
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
checksum_algorithm sha1 Algoritmo a determinar el
checksum sha224 checksum del fichero.
checksum_algo sha256
sha384
sha512
© Alfaomega-RC Libros 97
ANSIBLE
98 © Alfaomega-RC Libros
CAPÍTULO 5: MÓDULOS
MÓDULO TEMPLATE
Argumentos obligatorios
src=ruta Ruta al fichero con formato Jinja2 en
el servidor que ejecuta Ansible. Puede
ser una ruta relativa o absoluta.
dest=ruta Lugar de destino donde la plantilla
renderizada será copiada.
Argumentos permisos y Argumentos SELinux
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
block_end_string Marca indicando el final de
un bloque. Por defecto: %}
block_start_string Marca indicando el inicio de
un bloque. Por defecto: {%
follow no Indica si se deben seguir los
yes enlaces simbólicos.
force yes Por defecto se reemplaza el
no contenido del fichero
destino,en caso contrario
solo se copiará si el destino
no existe.
newline_sequence \n Secuencia de caracteres para
\r indicar nueva línea.
\r\n
trim_blocks no Indica si la primera nueva
yes línea después de un bloque
debe ser eliminada.
variable_end_string Marca indicando el final de
una sentencia de
visualización. Por defecto }}
variable_start_string Marca indicando el inicio de
una sentencia de
visualización. Por defecto {{
© Alfaomega-RC Libros 99
ANSIBLE
MÓDULO UNARCHIVE
Argumentos obligatorios
src=ruta Ruta del fichero a descomprimir.
dest=ruta Ruta absoluta del directorio donde los
ficheros deben ser descomprimidos.
apt_repository
apt_rpm
dnf Gestiona paquetes de la distribución
Fedora.
dpkg_selections Gestiona selección de paquetes dpkg
MÓDULO CPANM
Argumentos opcionales
executable Sobrescribe la ruta del ejecutable de
cpanm.
from_path El directorio local donde instalar el
módulo.
installdeps Instala solo dependencias.
locallib Especifica el directorio base a instalar
los módulos.
mirror Especifica la dirección URL (mirror) de
CPAN a utilizar.
mirror_only Utiliza el índice del fichero mirror en
vez del CPAN Meta DB.
namepkg El nombre de la librería Perl a instalar.
notest No ejecuta los tests unitarios.
system_libuse_sudo Indica si se debe instalar en la ruta de
módulos global del sistema.
version Mínima versión del módulo aceptada para
que pueda ser instalado el módulo.
MÓDULO EASY_INSTALL
Argumentos obligatorios
name=nombre El nombre de la librería Python a
instalar.
MÓDULO PEAR
Argumentos obligatorios
name=nombre Nombre del paquete a instalar, actualizar
o borrar.
MÓDULO PIP
lxml
pyOpenSSL
parsel>=1.4
MÓDULO APT
MÓDULO APT_KEY
MÓDULO APT_REPOSITORY
Argumentos obligatorios
repo=repositorio El repositorio a utilizar.
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
codename Sobrescribe el código de la
distribución a ser utilizada en
los repositorios PPA.
filename Establece el nombre del fichero
dentro del directorio
sources.list.d. La extensión
.list se añadirá
automáticamente.
mode El modo octal del fichero nuevo
creado, por defecto 644.
state present El estado deseado.
absent
update_cache yes Ejecuta el equivalente de apt-
no get update cuando un cambio
ocurre.
validate_certs yes Indica si el certificado SSL de
no la URL indicada debe ser
comprobado para su validez.
MÓDULO DNF
Argumentos obligatorios
name=paquete Nombre del paquete o combinación de
paquete y versión (nombre-1.). Con el
valor "*" actualizará todos los paquetes.
Es posible especificar una ruta de fichero
o una dirección url.
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
autoremove no Si se habilita esta opción se
yes eliminarán las dependencias
instaladas que ya no están en
uso.
conf_file El fichero de configuración
remota a ser utilizada.
disable_gpg_check no Indica si se debe deshabilitar la
yes comprobación GPG.
disablerepo Identificador del repositorio a
deshabilitar durante una
operación de instalación o
actualización.
MÓDULO PACKAGE
Argumentos obligatorios
name=paquete Nombre del paquete o combinación de nombre y
versión (paquete-1.0).
state=estado present Si debe ser instalado (present,
latest latest), o eliminado (absent).
absent
Argumentos opcionales (Negrita indica el valor por defecto)
MÓDULO PACMAN
MÓDULO YUM
Argumentos obligatorios
name=paquete Nombre del paquete o combinación de nombre
pkg=paquete y versión (paquete-1.0).
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
allow_downgrade no Especifica si es posible
yes instalar una versión más antigua
que la instalada en el nodo
remoto.
conf_file Ruta al fichero de configuración
de yum.
En los siguientes ejemplos se muestran las tareas más comunes que se realizan
con yum.
MÓDULO YUM_REPOSITORY
Argumentos obligatorios
name=repositorio Identificador del repositorio.
Argumentos opcionales (Negrita indica el valor por defecto)
[más utilizados, no todos]
baseurl Dirección URL donde está el
repositorio.
name: virtualbox
description: Oracle Linux / RHEL / CentOS-$releasever / $basearch -
VirtualBox
baseurl: http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
enabled: True
gpgcheck: True
repo_gpgcheck: true
gpgkey: https://www.virtualbox.org/download/oracle_vbox.asc
MÓDULO REDHAT_SUBSCRIPTION
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
activationkey Indica una clave de activación a
ser utilizada durante el registro.
autosubscribe Después de un registro correcto,
autoconsume las suscripciones
disponibles.
consumer_id Referencia a un ID de cliente para
continuar el registro anterior de
un sistema.
consumer_name Nombre del sistema a registrar,
por defecto el nombre del nodo.
consumer_type El tipo de unidad a registrar, por
defecto un sistema.
environment Registra con un entorno específico
en la organización destino. Usada
con Red Hat Satellite 6.x o
Katello.
force_register Registra el sistema incluso si
está registrado.
org_id ID de la organización a ser
utilizada en conjunción con la
clave de activación
(activationkey).
password Contraseña de access.redhat.com o
de Satellite 6.
pool Especifica el nombre del pool a
consumir. Expresiones regulares
son aceptadas.
MÓDULO ZYPPER
Argumentos obligatorios
name=paquete Nombre del paquete o combinación de
nombre y versión (paquete-1.0).
Argumentos opcionales (Negrita indica el valor por defecto)
disable_gpg_ch no Indica si se debe deshabilitar
eck yes la comprobación GPG.
disable_recomm yes Corresponde a la opción --no-
ends no recommends de zypper.
extra_args Añade opciones adicionales al
comando zypper
force no Añade la opción --force al
yes comando zypper.
oldpackage no Añade la opción --oldpackage al
yes comando zypper.
state present Indica el estado deseado del
latest paquete.
absent
dist-upgrade
type package El tipo de paquete a ser
patch administrado.
pattern
product
srcpackage
application
update_cachere no Ejecuta el equivalente a zypper
fresh yes refresh.
En los siguientes ejemplos mostramos las tareas más comunes realizadas con
el comando zypper:
MÓDULO ZYPPER_REPOSITORY
MÓDULO COMMAND
Argumentos obligatorios
comando El comando a ejecutar en el nodo.
Argumentos opcionales
chdir Cambia a este directorio antes de ejecutar el
comando.
creates Fichero que cuando existe la tarea no se ejecutará.
removes Fichero que cuando NO existe la tarea NO se
ejecutará.
stdin Establece la entrada por defecto del comando
directamente usando este valor.
MÓDULO EXPECT
Argumentos obligatorios
command=comando El comando a ejecutar en el nodo.
responses=lista Tabla de preguntas esperadas y respuestas a
proporcionar.
Argumentos opcionales
chdir=directorio Cambia a este directorio antes de ejecutar
el comando.
creates=fichero Fichero que cuando existe la tarea no se
ejecutará.
echo=yes/no Indica si debe mostrar las respuestas en
pantalla.
removes=fichero Fichero que cuando NO existe la tarea NO se
ejecutará.
timeout=segundos Cantidad máxima a esperar por las preguntas
esperadas. Por defecto 30.
MÓDULO RAW
Argumentos obligatorios
comando El comando a ejecutar en el nodo.
Argumentos opcionales (Negrita indica el valor por defecto)
executable Ruta absoluta de la shell a utilizar para
ejecutar el comando.
MÓDULO SCRIPT
Argumentos obligatorios
script El script a transferir y a ejecutar en el nodo.
MÓDULO SHELL
En Windows se utiliza el módulo win_shell
Argumentos obligatorios
comando El comando a ejecutar en el nodo administrado.
Argumentos opcionales
chdir Cambia a este directorio antes de ejecutar el
comando.
"LESSCLOSE=/usr/bin/lesspipe %s %s"
]
}
MÓDULO TELNET
Argumentos obligatorios
command=comando El comando a ejecutar en el nodo
administrado.
Argumentos opcionales
host El servidor en el cual se ejecutará el comando.
password La contraseña para el login.
pause Segundos de pausa entre cada comando realizado.
port Puerto remoto a utilizar.
prompts Lista de prompts esperados antes de ejecutar el
siguiente comando.
timeout Tiempo de espera para operaciones remotas.
user El usuario utilizado para conectarse.
MÓDULOS UTILIDADES
Estos módulos son uzilizados para realizar distintas acciones dentro de Ansible.
MÓDULO META
Argumentos obligatorios
tarea flush_handlers Ejecuta las tareas de handlers
pendientes sin tener que esperar
al final del Play.
refresh_inventory Fuerza la relectura del
inventario, en este caso es volver
a ejecutar el script del
inventario dinámico.
clear_facts Limpia los facts de los nodos
administrados.
clear_host_errors Elimina el estado fallido de los
nodos administrados.
end_play Causa que el Play termine sin
nodos fallidos.
reset_connection Interrumpe una conexión
persistente.
MÓDULO ASSERT
Argumentos obligatorios
that Listado de condiciones a comprobar
Argumentos opcionales (Negrita indica el valor por defecto)
msg Mensaje a utilizar cuando la condición no se cumple.
MÓDULO FAIL
Argumentos opcionales
msg Mensaje a utilizar cuando la condición se cumple. Si
no se especifica se mostrará un mensaje genérico.
MÓDULO PAUSE
MÓDULO SET_FACT
Argumentos obligatorios
diccionario Diccionario con clave/valor para definir los
facts del servidor que deseamos.
Argumentos opcionales (Negrita indica el valor por defecto)
cacheable Indica si este fact debe añadirse al fact cache.
MÓDULO SET_STATS
Argumentos obligatorios
data Diccionario con clave/valor para definir las
estadísticas.
MÓDULO WAIT_FOR
wait_for:
path: /var/run/apache2/apache2.pid
sleep: 6
timeout: 10
El siguiente playbook actualiza el sistema, y si así fuese
reiniciará el sistema y esperará a que esté disponible el
puerto 22.
- name: Reiniciar el sistema y esperar al reinicio
hosts: redhat
become: True
tasks:
- name: Actualizar el sistema
yum:
name: "*"
state: latest
register: actualizado
- name: Reiniciar el sistema
shell: sleep 5 && shutdown -r now "Ansible reboot"
ignore_errors: True
async: 1
poll: 0
when: actualizado|changed
- name: Esperar a que el puerto 22 esté disponible
wait_for:
port: 22
host: "{{ inventory_hostname }}"
state: started
sleep: 15
timeout: 60
delegate_to: localhost
become: false
when: actualizado|changed
MÓDULO WAIT_FOR_CONNECTION
MÓDULOS NOTIFICACIONES
Estos módulos son utilizados para usar diferentes proveedores o servicios para
el envío de notificaciones utilizando Ansible.
MÓDULO HIPCHAT
Argumentos obligatorios
room=canal ID o nombre de la sala.
token=codigo Código API.
msg=mensaje El cuerpo del mensaje.
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
from Nombre que aparecerá como usuario
que envió el mensaje. Por defecto:
Ansible
msg_format text Formato del mensaje.
html
notify yes Una notificación será enviada a los
no usuarios de la sala.
validate_certs yes Indica si debe validar los
no certificados SSL.
MÓDULO IRC
Argumentos obligatorios
channel=canal Nombre del canal. Una de las opciones
channel o nick_to debe ser establecida. Es
posible especificar ambas.
nick_to=usuario Una lista de nicks a enviar mensajes.
msg=mensaje Cuerpo del mensaje.
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
color none Color para el mensaje.
white
black
blue
green
red
brown
purple
orange
yellow
light_green
teal
light_cyan
light_blue
pink
graylight_gray
key Clave del canal.
nick Nickname del usuario que enviará el
mensaje. Por defecto ansible.
part Indica si el usuario debe ser parte
del canal para enviar el mensaje o
no.
passwd Contraseña del servidor IRC.
port Puerto del servidor IRC.
server Dirección del servidor IRC.
style bold Estilo de texto para el mensaje.
underline
reverse
italic
MÓDULO JABBER
Argumentos obligatorios
msg=mensaje El cuerpo del mensaje.
password=clave La contraseña del usuario con el que
conectarse.
to=usuario/canal ID de usuario o nombre de la sala a donde
enviar el mensaje.
user=usuario
Usuario con el que conectarse.
MÓDULO MAIL
Argumentos obligatorios
subject=asunto El asunto del correo a ser enviado.
MÓDULO PUSHBULLET
Argumentos obligatorios
api_key=codigo Código API.
title=titulo Título de la notificación.
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opcio Descripción
nes
body Cuerpo del mensaje de la notificación.
channel El canal a donde se enviará el mensaje.
MÓDULO PUSHOVER
Argumentos obligatorios
app_token=codigo Código de la aplicación para identificar la
aplicación pushover.
user_key=codigo Clave del usuario a ser utilizada.
msg=mensaje El mensaje a ser enviado.
Argumentos opcionales
pri Prioridad del mensaje.
MÓDULO ROCKETCHAT
Argumentos obligatorios
domain=dominio El dominio de tu entorno sin protocolo.
token=codigo Código para Rocket Chat Incoming Webhook.
Argumentos opcionales
Argumentos Opciones Descripción
attachments Lista de adjuntos.
channel Canal a donde enviar el mensaje.
color normal Permite al texto utilizar colores.
good
warning
MÓDULO SLACK
Argumentos obligatorios
token=código Código de integración Slack.
Argumentos opcionales (Negrita indica el valor por defecto)
attachments Lista de adjuntos.
channel Canal a enviar el mensaje.
color normal Permite que el texto use colores.
good
warning
danger
domain Dominio o subdominio del entorno sin
protocolo.
icon_emoji Emoticono del remitente del mensaje.
icon_url Icono del remitente.
link_names Automáticamente crea enlaces de
canales y usuarios.
msg Mensaje a enviar.
parse none Configura el parseador del mensaje.
full
username El remitente del mensaje. Por defecto
Ansible
validate_certs yes Indica si se debe comprobar el
no certificado SSL de la web.
MÓDULO SYSLOGGER
Argumentos obligatorios
msg=mensaje Mensaje a enviar al syslog.
Argumentos opcionales (Negrita indica el valor por defecto)
Argumentos Opciones Descripción
facility kern Establece el facility.
user
mail
daemon
auth
lpr
news
uucp
cron
syslog
local0..local7
log_pid no Muestra el id del proceso.
yes
priority emerg Establece la prioridad del
alert mensaje.
crit
err
warning
notice
info
debug
MÓDULO TELEGRAM
Argumentos obligatorios
chat_id Identificador del usuario o del grupo de
Telegram.
msg El mensaje que se desea enviar.
token Código identificando el bot de Telegram.
MÓDULO MYSQL_DB
Argumentos obligatorios
name=nombre Nombre de la base de datos a añadir o
eliminar.
Argumentos opcionales (Negrita indica el valor por defecto)
collation El modo de collation.
config_file Especifica un fichero de
configuración a utilizar.
connect_timeout Tiempo máximo de espera de
conexión al servidor MySQL. Por
defecto 30.
encoding Codificación a utilizar, por
ejemplo utf8.
login_host Servidor a conectarse. Por
defecto localhost.
login_password La contraseña para autenticarse.
login_port Puerto del servidor MySQL.
login_unix_socket La ruta a un socket para
conexiones locales.
MÓDULO MYSQL_USER
Argumentos obligatorios
name=nombre Nombre del usuario (rol) a añadir o
borrar.
ARGUMENTOS POSTGRESQL
MÓDULO POSTGRESQL_DB
Argumentos obligatorios
name=nombre Nombre de la base de datos a añadir/eliminar.
Argumentos opcionales (Negrita indica el valor por defecto)
encoding Codificación a utilizar.
lc_collate Collation (LC_COLLATE) a usar.
lc_ctype Clasificación de caracteres
(LC_CTYPE)a usar.
owner Nombre del rol a establecer como
dueño de la base de datos.
state present Estado de la base de datos.
absent
dump
restore
target Ubicación donde realizar la copia de
seguridad o de donde restaurar.
target_opts Argumentos extra para pg_dump o
pg_restore.
with_items:
- ansible
- oforte
MÓDULO POSTGRESQL_USER
Argumentos obligatorios
name=nombre Nombre del usuario (rol) a añadir o borrar.
Argumentos opcionales (Negrita indica el valor por defecto)
conn_limit Especifica el límite de
conexiones del usuario.
db Nombre de la base de datos a dar
permiso.
encrypted Si la contraseña es almacenada
cifrada.
expires Establece la expiración de la
contraseña del usuario.
fail_on_user yes Si se habilita esta opción,
no fallará si el usuario no puede
ser eliminado. De otra forma se
registrará un mensaje y
continuará.
name Nombre del usuario (rol) a
añadir o borrar.
no_password_ no Si se habilita, no inspecciona
changes yes la base de datos por cambios de
contraseña.
password Establece la contraseña del
usuario.
priv Privilegios PostgreSQL en
formato: tabla:prv1,priv2
role_attr_flags [NO]SUPERUSER Atributos de rol PostGRESQL en
[NO]CREATEROLE formato:
[NO]CREATEUSER CREATEDB,CREATEROLE,SUPERUSER
[NO]CREATEDB
[NO]INHERIT
[NO]LOGIN
[NO]REPLICATION
[NO]BYPASSRLS
state present
El estado del usuario (rol).
absent
| | | | | libroansible=CTc/postgres
(1 row)
MÓDULO POSTGRESQL_PRIVS
Argumentos obligatorios
database=bdd Nombre de la base de datos a conectarse.
roles=lista Lista separada por coma de los roles
(usuar/grupo) a establecer permisos.
become: True
postgresql_db:
name: dvds
state: restore
target: /var/lib/postgresql/restore.sql
- name: Dar permisos al usuario "libroansible"
become_user: postgres
become: True
postgresql_privs:
db: postgres
privs: ALL
objs: dvds
type: database
roles: libroansible
Comprobación
postgres=# \l dvds
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
------+----------+----------+-------------+-------------+---------------------------
dvds | postgres | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres +
| | | | | libroansible=CTc/postgres
MÓDULO POSTGRESQL_SCHEMA
Argumentos obligatorios
name=nombre Nombre del esquema a añadir o borrar.
Argumentos opcionales (Negrita indica el valor por defecto)
database Nombre de la base de datos a
conectarse.
owner Nombre del rol a establecer como
dueño del esquema.
state present Estado del esquema.
absent
tasks:
- name: Instalar librería psycopg2
pip:
name: psycopg2
state: latest
- name: Crear un nuevo esquema llamado ansible
become: True
become_user: postgres
postgresql_schema:
name: "esq_ansible"
state: present
Comprobación de la creación del esquema.
postgres=# \dn
List of schemas
Name | Owner
-------------+----------
esq_ansible | postgres
public | postgres
(2 rows)
MÓDULO MONGODB_USER
Argumentos obligatorios
name=nombre Nombre del usuario a añadir/borrar.
database=bdd El nombre de la base de datos a donde
añadirlo.
Argumentos opcionales (Negrita indica el valor por defecto)
login_database La base de datos donde las
credenciales se almacenan.
login_host Servidor a conectarse.
login_password La contraseña para
autenticarse.
login_port Puerto del servidor a
conectarse.
login_user El usuario para autenticarse.
password La contraseña a utilizar para
el usuario.
replica_set El conjunto de réplicas a
conectarse.
"pwd" : "2939c1052267427b36b2e5234a69da62",
"user" : "ansible",
"roles" : [
"userAdminAnyDatabase"
]
}
MÓDULOS SISTEMA
Estos módulos son utilizados para gestionar diferentes elementos del sistema
operativo. En negrita se indican los módulos que se detallarán en profundidad.
MÓDULO ALTERNATIVES
Argumentos obligatorios
name=nombre Nombre genérico del enlace.
path=ruta Ruta al ejecutable real.
Argumentos opcionales
priority Prioridad de la alternative. Por defecto 50.
tasks:
- name: Comprobar versión antes de alternatives
command: java -version
register: java_version
- debug: var=java_version.stderr
- apt:
name: openjdk-8-jre
state: latest
- alternatives:
name: java
path: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
- name: Comprobar version despues de alternatives
command: java -version
register: java_version
- debug: var=java_version.stderr
MÓDULO AUTHORIZED_KEYS
Argumentos obligatorios
key=clave La clave pública SSH.
user=usuario El usuario remoto a modificar su fichero.
Argumentos opcionales (Negrita indica el valor por defecto)
comment Cambia el comentario de la clave
pública.
exclusive no Si debe borrar todas las claves
yes existentes.
key_options Las opciones para la clave.
manage_dir yes Indica si el módulo debe administrar
no el directorio del fichero.
path Ruta alternativa al fichero.
state present El estado de la clave en el fichero.
absent
validate_certs yes Valida el certificado SSL de la web a
no la que conectarse.
MÓDULO CRON
#Ansible: backup_cada_4_horas
0 */4 * * * root /usr/bin/rsnapshot hourly
#Ansible: backup_diario
30 3 * * * root /usr/bin/rsnapshot daily
#Ansible: backup_semanal
0 3 * * 1 root /usr/bin/rsnapshot weekly
#Ansible: backup_mensual
30 2 1 * * root /usr/bin/rsnapshot monthly
MÓDULO FILESYSTEM
Argumentos obligatorios
dev=dispositivo Dispositivo.
fstype=tipo Tipo de sistema de ficheros.
Argumentos opcionales (Negrita indica el valor por defecto)
force no Forzar la creación del sistema de
yes ficheros aunque ya tenga uno.
opts Lista de opciones a ser pasadas al
comando mkfs.
resizefs no Si debe cambiar el tamaño.
yes
MÓDULO FIREWALLD
Argumentos obligatorios
state=enabled/disabled Estado de la regla.
Argumentos opcionales (Negrita indica el valor por defecto)
immediate False Aplicar inmediatamente.
True
interface La interfaz a añadir/eliminar a(de
una zona.
masquerade False Establecer enmascarado.
True
permanent False Si debe ser una regla permanente.
True
port Nombre del puerto o rango.
rich_rule Regla rica.
service Nombre del servicio.
source Origen
timeout Tiempo máximo de espera.
zone work Zona a utilizar.
drop
internal
external
trusted
home
dmz
public
block
enabled: true
- firewalld:
service: "{{ item }}"
permanent: True
state: enabled
notify: reload firewalld
with_items:
- http
- https
handlers:
- name: reload firewalld
command: firewall-cmd --reload
handlers:
- name: reload firewalld
command: firewall-cmd --reload
Comprobación de creación de la regla avanzada
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
rule service name="mysql" audit limit value="1/m" accept
# firewall-cmd --list-rich-rules
rule service name="mysql" audit limit value="1/m" accept
MÓDULO GETENT
Argumentos obligatorios
database=bbdd Base de datos a consultar (passwd, group,
hosts, etc.).
Argumentos opcionales
fail_key Indica si la tarea falla si no se encuentra lo
buscado. Por defecto True.
key Elemento a buscar.
split Carácter a ser utilizado para dividir los
datos, como ':' o ' '.
tasks:
- name: Obtener info del usuario alberto
getent:
database: passwd
key: alberto
register: info_usuario
- debug: var=info_usuario
TASK [debug] **********
ok: [servidor] => {
"info_usuario": {
"ansible_facts": {
"getent_passwd": {
"alberto": [
"x",
"1000",
"1002",
"",
"/home/alberto",
"/bin/sh"
]
}
},
"changed": false,
"failed": false
}
}
MÓDULO GROUP
Argumentos obligatorios
name=nombre Nombre del grupo a gestionar.
Argumentos opcionales (Negrita indica el valor por defecto)
gid Identificador del grupo.
state present Estado del grupo, si debe existir o
absent no.
system no Indica si el grupo es de sistema.
yes
MÓDULO HOSTNAME
Argumentos obligatorios
name=nombre Nombre del servidor a establecer.
MÓDULO IPTABLES
hosts: servidor
tasks:
- iptables:
action: insert
chain: INPUT
source: 0.0.0.0/0
destination_port: "{{ item }}"
protocol: tcp
jump: ACCEPT
state: present
with_items:
- 80
- 443
Redirigir puerto 80 al servidor 192.168.56.102.
- name: Redirigir el puerto 80 a otro servidor
hosts: servidor
become: True
tasks:
- iptables:
table: nat
chain: PREROUTING
action: insert
in_interface: eth0
protocol: tcp
match: tcp
jump: DNAT
destination_port: 80
to_destination: 192.168.56.102
comment: Redigir tráfico al servidor 192.168.56.102
MÓDULO KNOWN_HOSTS
Argumentos obligatorios
name=clave El servidor a añadir o borrar.
host=clave
Argumentos opcionales (Negrita indica el valor por defecto)
hash_host Hash del servidor.
key La clave pública SSH del servidor.
path El fichero known_hosts a editar.
state present Estado de la clave.
absent
MÓDULO LVG
Argumentos obligatorios
vg=nombre El nombre del grupo de volúmenes.
Argumentos opcionales (Negrita indica el valor por defecto).
force no Fuerza la eliminación.
yes
MÓDULO LVOL
Argumentos obligatorios
vg=nombre Nombre del grupo de volúmenes.
lv=nombre Nombre del volumen lógico.
# open 0
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
MÓDULO MODPROBE
Argumentos obligatorios
name=módulo Nombre del módulo Kernel.
Argumentos opcionales (Negrita indica el valor por defecto)
params Parámetros para el módulo.
state present Estado del módulo.
absent
MÓDULO MOUNT
Argumentos obligatorios
path=ruta Ruta donde montar el dispositivo.
state=estado present Estado del punto de montaje.
absent
mounted
unmounted
MÓDULO PARTED
Argumentos obligatorios
device=dispositivo El dispositivo a tratar.
Argumentos opcionales (Negrita indica el valor por defecto)
align optimal Alineación de la partición.
none
cylinder
minimal
flags Lista de flags a especificar.
label msdos Crea una nueva etiqueta de disco.
aix
amiga
bsd
dvh
gpt
loop
mac
pc98
sun
name Especifica el nombre(GPT, Mac,
MIPS y PC98 sólo).
number El número de la partición.
part_end Terminación de la partición. P.e.
10GiB, 15%.
MÓDULO SEBOOLEAN
Argumentos obligatorios
name=nombre Nombre del Boolean a configurar.
state=estado Valor del Boolean.
MÓDULO SEFCONTEXT
Argumentos obligatorios
setype=tipo Tipo SELinux para el destino especificado.
target=ruta Ruta de destino.
path=ruta
Argumentos opcionales (Negrita indica el valor por defecto)
ftype Tipo de fichero. Por defecto "a".
reload yes Releer política SELinux después de
no aplicarla.
selevel Rango SELinux para el destino
serange especificado.
seuser Usuario SELinux para el destino
especificado.
MÓDULO SELINUX
Argumentos obligatorios
state=estado enforcing Modo SELinux
permissive
disabled
Argumentos opcionales
conf Ruta al fichero de configuración SELinux. Por
defecto /etc/selinux/config
policy Nombre de la política SELinux a usar.
# ansible-playbook selinux.yml
PLAY [Establecer SElinux a modo permisivo] ***
TASK [Gathering Facts] ****
ok: [servidor]
TASK [Instalar librería necesaria] **************
ok: [servidor]
TASK [selinux] ************
changed: [servidor]
# getenforce
Permissive
MÓDULO SELINUX_PERMISSIVE
Argumentos obligatorios
permissive=True/False Si el dominio debe ser permisivo o no.
domain=nombre El dominio a tratar.
Argumentos opcionales (Negrita indica el valor por defecto)
no_reload False Releer la política SELinux.
True
MÓDULO SEPORT
Argumentos obligatorios
ports Puertos o rango de puertos separados por
coma.
proto tcp Protocolo a utilizar para el puerto.
udp
setype Tipo SELinux para el puerto.
state present El estado deseado.
absent
Argumentos opcionales
reload Recargar la política SELinux después de
aplicarla.
MÓDULO SERVICE
Argumentos obligatorios
name=nombre Nombre del servicio.
Argumentos opcionales (Negrita indica el valor por defecto)
arguments Argumentos adicionales.
args
enabled no Si debe iniciarse al arrancar el
yes sistema.
pattern Cadena a buscar si el servicio no
responde.
runlevel Para OpenRC init scripts.
MÓDULO SETUP
Argumentos opcionales (Negrita indica el valor por defecto)
fact_path Ruta donde se almacenan los facts locales. Por
defecto /etc/ansible/facts.d
filter Expresión para seleccionar facts. Por defecto
"*".
gather_subset Restringir subconjunto: all, min, hardware,
network, virtual, ohai, and factor. Se puede
utilizar admiración para ignorar un
subconjunto. Por defecto all.
En el siguiente ejemplo se utiliza setup dos veces, la primera vez para obtener
toda la información (equivalente a gather_facts: True) y después de cambiar el
hostname con el módulo con el mismo nombre, se utiliza setup para obtener el
nuevo hostname.
Contenido del playbook.
- name: Cambiar el hostname y ejecutar setup
hosts: servidor
gather_facts: False
tasks:
- name: Ejecutar primer setup para obtener información.
setup:
- name: Mostrar el hostname antiguo
debug: var=ansible_fqdn
- name: Cambiar hostname
hostname:
name: libroansible.oforte.net
- setup:
filter: ansible_fqdn
- name: Mostrar el hostname nuevo
debug: var=ansible_fqdn
Resultado mostrado.
PLAY [Cambiar el hostname y ejecutar setup] **
TASK [Ejecutar primer setup para obtener información.] *****
ok: [servidor]
TASK [Mostrar el hostname antiguo] **********
ok: [servidor] => {
"ansible_fqdn": "localhost.localdomain"
}
TASK [Cambiar hostname] ****
changed: [servidor]
TASK [setup] *************
ok: [servidor]
TASK [Mostrar el hostname nuevo] ************
ok: [servidor] => {
"ansible_fqdn": "libroansible.oforte.net"
}
MÓDULO SYSCTL
Argumentos obligatorios
name=nombre Clave separada por puntos.
key=nombre
Argumentos opcionales (Negrita indica el valor por defecto)
ignoreerrors no Ignorar errores si no existen claves.
yes
reload yes Si ejecutar /sbin/sysctl -p después de
no modificar el documento.
state present Estado de la clave en sysctl.
absent
sysctl_file Especifica la ruta, por defecto
/etc/sysctl.conf.
sysctl_set no Verifica el valor del código.
yes
value Valor para la clave.
MÓDULO SYSTEMD
tasks:
- name: Copiar configuración
copy:
src: httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify: releer_httpd
handlers:
- name: releer_httpd
systemd:
name: httpd
state: reloaded
Releer la configuración propia de systemd.
MÓDULO TIMEZONE
Argumentos opcionales
hwclock Si el reloj del servidor está en UTC o en zona
horaria local.
name Nombre de la zona horaria para el reloj del sistema.
MÓDULO USER
Argumentos obligatorios
name=nombre Nombre del usuario a crear, borrar o
user=nombre modificar.
Argumentos opcionales (Negrita indica el valor por defecto)
append no Indica si añadir los grupos a la
yes lista actual.
comment Comentario para el usuario.
createhome yes Si crea el directorio del usuario
no o no.
expires Fecha de expiración.
force no Fuerza la eliminación del
yes usuario.
MÓDULOS WINDOWS
ansible_host 35.196.65.128
ansible_connection winrm
ansible_winrm_server_cert_validation ignore
ansible_user alberto
ansible_password clave_usuario_alberto
Dicho servidor tiene habilitado en las reglas de firewall el puerto 5986 (TCP)
para WinRM. Para habilitar la administración remota se utilizó PowerShell con el
siguiente script:
https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/Confi
gureRemotingForAnsible.ps1
MÓDULO WIN_PING
MÓDULO WIN_CHOCOLATEY
Argumentos obligatorios
name=nombre Nombre del paquete a instalar.
Argumentos opcionales (Negrita indica el valor por defecto)
allow_empty_checksums no Permite checksums vacíos.
yes
force no Fuerza la instalación.
yes
ignore_checksums no Ignora el checksum.
yes
ignore_dependencies no Ignora dependencias.
yes
install_args Argumentos a pasar al
instalador.
params Parámetros a pasar al
programa.
proxy_password Clave del proxy.
proxy_url Dirección del proxy.
proxy_username Usuario del proxy.
skip_scripts no No ejecutar
yes chocolateyInstall.ps1 o
chocolateyUninstall.ps1.
MÓDULO WIN_COMMAND
Argumentos obligatorios
comando El comando a ejecutar.
Argumentos opcionales (Negrita indica el valor por defecto)
chdir El directorio a donde se mueve antes de ejecutar
el comando.
creates Si el fichero indicado existe no se ejecutará el
comando.
removes Si el fichero indicado no existe no se ejecutará
el comando.
MÓDULO WIN_COPY
Argumentos obligatorios
src=origen Ruta al fichero a copiar al servidor Windows.
dest=destino Ruta absoluta del fichero destino.
Argumentos opcionales (Negrita indica el valor por defecto)
content Se puede especificar esta opción en vez de
src para fijar el contenido.
force yes Sobrescribe el fichero destino si existe.
no
local_follow yes Si debe seguir enlaces simbólicos.
no
remote_src no Indica si la ruta origen ya está en el nodo
yes remoto administrado.
MÓDULO WIN_ENVIRONMENT
Argumentos obligatorios
level=nivel machine El nivel donde se establecerá la
process variable de entorno.
user
name=nombre Nombre de la variable de entorno.
Argumentos opcionales (Negrita indica el valor por defecto)
state present Estado de la variable de entorno.
absent
value Valor de la variable de entorno.
MÓDULO WIN_FEATURE
Argumentos obligatorios
name=nombre Nombre de la característica.
Argumentos opcionales (Negrita indica el valor por defecto)
include_manage True Incluir herramientas de
ment_tools False administración.
include_sub_fe True
Incluye subcaracterísticas.
atures False
source Origen de la característica.
present
state Estado de la característica.
absent
MÓDULO WIN_FILE
Argumentos obligatorios
path=ruta Ruta al fichero a administrar.
dest=ruta
name=ruta
Argumentos opcionales (Negrita indica el valor por defecto)
state file Estado/tipo del fichero a administrar.
directory
touch
absent
MÓDULO WIN_FIREWALL
MÓDULO WIN_FIREWALL_RULE
Argumentos obligatorios
action=acción allow Acción a hacer.
block
bypass
direction=direcció in Indicar si es de entrada o de
n out sl
name=nombre Nombre de la regla.
Argumentos opcionales (Negrita indica el valor por defecto)
description Descripción de la regla.
enabled yes Si la regla debe estar habilitada o
no no.
MÓDULO WIN_GROUP
Argumentos obligatorios
name=nombre Nombre del grupo
Argumentos opcionales (Negrita indica el valor por defecto)
description Descripción del grupo.
state present Estado del grupo.
absent
MÓDULO WIN_LINEINFILE
Argumentos obligatorios
path=ruta Ruta del fichero a modificar.
Argumentos opcionales (Negrita indica el valor por defecto)
backrefs no Especifica si la expresión puede
yes contener referencias anteriores.
create no Especifica si el fichero debe ser
yes creado si no existe.
insertafter EOF Si se especifica, se insertará
*regex* después de la línea encontrada con
dicha expresión. Si no se
especifica, se insertará al final
del fichero.
insertbefore BOF Si se especifica, se insertará
*regex* antes de la línea encontrada con
dicha expresión. Si no se
especifica, se insertará al final
del fichero.
line La línea a insertar o reemplazar.
regexp La expresión regular a buscar en
cada línea del fichero.
state present Indica si la línea debe estar en el
absent fichero o no.
MÓDULO WIN_PACKAGE
MÓDULO WIN_SERVICE
Argumentos obligatorios
name=nombre Nombre del servicio
Argumentos opcionales (Negrita indica el valor por defecto)
dependencies Lista de dependencias
MÓDULO WIN_TEMPLATE
Argumentos obligatorios
src=ruta Ruta de la plantilla Jinja2.
dest=ruta Destino donde la plantilla procesada será
copiada.
Mismas opciones que el módulo template
MÓDULO WIN_USER
Argumentos obligatorios
name=nombre Nombre del usuario a crear, modificar o
eliminar.
Argumentos opcionales (Negrita indica el valor por defecto)
account_disabled no Si la cuenta debe ser
yes deshabilitada.
account_locked no Si la cuenta está
yes bloqueada.
description Descripción del usuario.
fullname Nombre completo del
usuario.
MÓDULO BZR
MÓDULO GIT
Directorio de comprobación.
# ls -1 /usr/src/ansible-examples/
jboss-standalone
lamp_haproxy
lamp_simple
lamp_simple_rhel7
language_features
mongodb
README.md
tomcat-memcached-failover
tomcat-standalone
windows
wordpress-nginx
wordpress-nginx_rhel7
MÓDULO GIT_CONFIG
MÓDULO GITHUB_DEPLOY_KEY
En el siguiente ejemplo se añade la clave ssh pública del usuario que ejecuta el
playbook a un repositorio de GitHub.
gather_facts: False
tasks:
- name: Obtener clave del usuario
command: cat ~/.ssh/id_rsa.pub
register: myclave
- name: Añadir clave pública
github_deploy_key:
owner: "agonzalezrh"
repository: "libro-ansible"
name: "clave-ansible"
key: "{{ myclave.stdout }}"
force: yes
token: "7a9877d7b2ee82683925e61b0f23d9b0d9336"
Comprobación de la acción.
MÓDULO GITHUB_KEY
En el siguiente ejemplo se añade una clave pública a nuestra cuenta (esta clave
no debe estar asociada como clave de despliegue en un proyecto).
hosts: localhost
gather_facts: False
tasks:
- name: Obtener clave del usuario
command: cat /home/alberto/.ssh/id_rsa.pub
register: myclave
- name: Añadir clave pública
github_key:
name: "clave-publica-ansible"
pubkey: "{{ myclave.stdout }}"
token: "7a98d7b2ee82683925e61b0f23d9b0d9336"
Comprobación de la creación de la clave pública.
MÓDULO GITHUB_HOOKS
oauthkey: '7ab2ee82683925e61b0f23d9b0d9336'
repo: https://api.github.com/repos/agonzalezrh/libro-ansible
Comprobación de la creación del hook.
MÓDULO GITHUB_RELEASE
user: agonzalezrh
repo: libro-ansible
action: latest_release
register: informacion_release
- debug: var=informacion_release
Mensaje mostrado por debug.
TASK [debug] ************
ok: [localhost] => {
"informacion_release": {
"changed": false,
"failed": false,
"tag": "v0.1"
}
}
Comprobación en Github.
MÓDULO GITLAB_GROUP
MÓDULO GITLAB_PROJECT
name: libro-ansible
group: ansible
issues_enabled: False
wiki_enabled: True
snippets_enabled: True
state: present
Comprobación de la creación del proyecto.
MÓDULO GITLAB_USER
sshkey_name: agonzalez
sshkey_file: "{{ miclave.stdout }}"
group: ansible
access_level: master
state: present
Comprobación de la creación del usuario.
MÓDULO HG
MÓDULO SUBVERSION
URL: https://core.svn.wordpress.org/trunk
Relative URL: ^/trunk
Repository Root: https://core.svn.wordpress.org
Repository UUID: 1a063a9b-81f0-0310-95a4-ce76da25c4cd
Revision: 42720
Node Kind: directory
Schedule: normal
Last Changed Author: SergeyBiryukov
Last Changed Rev: 42720
Last Changed Date: 2018-03-29 01:25:29 +0200 (Thu, 29 Mar
2018)
MÓDULO APACHE2_MODULE
MÓDULO HTPASSWD
path: /etc/apache2/usuarios
name: ansible
password: 'l1br04ns1bl3'
owner: root
group: www-data
mode: 0640
Comprobación de la creación del usuario.
# cat /etc/apache2/usuarios
ansible:$apr1$YriaRg9u$/HiXRBkwfM60UWsj6I5li.
MÓDULO JBOSS
},
"timestamp": 1522418397,
"status": 200
}
MÓDULO JENKINS_JOB
MÓDULO JENKINS_PLUGIN
MÓDULO JIRA
password: FEyrVMmHGL
project: EJ
operation: create
summary: Crear incidencia
description: Incidencia creada desde Ansible
issuetype: Task
Comprobación de la creación de la incidencia.
MÓDULO LETSENCRYPT
dest: /root/ssl/libroansible.oforte.net.crt
register: peticion
CA Issuers - URI:http://cert.stg-int-x1.letsencrypt.org/
X509v3 Subject Alternative Name:
DNS:libroansible.oforte.net
[..]
MÓDULO SUPERVISORCTL
MÓDULOS CLOUD
AMAZON
Módulo EC2
Módulo EC2_KEY
Módulo EC2_GROUP
En el siguiente ejemplo se crea un security group para permitir el acceso web
(puertos 80 y 443).
Módulo EC2_SUBNET
En el siguiente ejemplo se crea una nueva subnet dentro del VPC indicado.
Módulo EC2_VOL
En el siguiente ejemplo se añade un nuevo disco a una instancia.
Contenido del playbook.
- name: Crear y asignar disco a una instancia
hosts: localhost
gather_facts: False
tasks:
- name: Instalar librería boto
pip:
name: boto
state: latest
Módulo IAM
AZURE
Módulo AZURE_RM_RESOURCEGROUP
Módulo AZURE_RM_MANAGED_DISK
Módulo AZURE_RM_NETWORK
En el siguiente ejemplo se crea una red dentro del Resource Group creado
anteriormente.
Módulo AZURE_RM_SECURITYGROUP
azure_rm_resourcegroup:
subscription_id: a899ede1-dda8-4e88-9305-362a5fdd8775
client_id: bedd86e3-ef1e-4a8d-b779-c23dd27230f9
secret:
"+3PAbVbGWyVbxeW7X8X8N0ynjJKexD88VTcLCc9X3SI="
tenant: 0f57d21c-8c9a-415e-84d9-e0f0742070d2
name: AnsibleRG2
location: northeurope
state: present
Comprobación del SG creado.
Módulo AZURE_RM_VIRTUALMACHINE
DIGITALOCEAN
Módulo DIGITAL_OCEAN
- debug:
msg: "Direccion IP es {{ mi_droplet.droplet.ip_address }}"
Mensaje mostrado por el módulo debug.
TASK [debug] **********
ok: [localhost] => {
"msg": "Direccion IP es 159.89.8.164"
}
Comprobación de la creación del droplet.
Módulo DIGITAL_OCEAN_BLOCK_STORAGE
block_size: 10
region: fra1
- name: Asignar disco
digital_ocean_block_storage:
state: present
command: attach
volume_name: ansible-disco
droplet_id: 87913141
api_token: cfc71eb22f747ef6d3687d177727aa31eed0a
region: fra1
Comprobación del volumen creado.
Módulo DIGITAL_OCEAN_FLOATING_IP
Módulo DIGITAL_OCEAN_SSHKEY
En el siguiente ejemplo se añade una clave pública SSH a la cuenta asociada.
Módulo DIGITAL_OCEAN_TAG
DOCKER
Módulo DOCKER_CONTAINER
Este módulo contiene en total 80 opciones, la lista completa se detalla en la
siguiente dirección:
https://docs.ansible.com/ansible/2.4/docker_container_module.html
Módulo DOCKER_IMAGE
En los siguientes ejemplos se hacen tareas comunes con imágenes (descargar,
publicar).
Módulo DOCKER_LOGIN
En el siguiente ejemplo se autentica en Docker Hub y se sube una imagen a él.
Contenido del playbook.
- name: Hacer login en Docker Registry
hosts: servidor
tasks:
- pip:
name: docker-py
state: latest
- name: Autenticar
docker_login:
email: alberto@oforte.net
username: libroansible
password: l1br04ns1bl3
state: present
Módulo DOCKER_NETWORK
Módulo DOCKER_VOLUME
state: latest
Módulo GCE
Módulo GCE_LABELS
Módulo GCE_NET
with_items:
- apache-libcloud
- credentials
- name: Crear red y subnet
gce_net:
service_account_email: "ansible@oforte-196215."
credentials_file: "/root/oforte.pem"
project_id: oforte-196215
name: ansible-red
mode: custom
subnet_name: "ansible-subred"
subnet_region: europe-west3
ipv4_range: '192.168.10.0/24'
state: "present"
- name: Crear regla de firewall
gce_net:
service_account_email: "ansible@oforte-196215.."
credentials_file: "/root/oforte.pem"
project_id: oforte-196215
name: default
fwname: "ansible-fw-regla"
allowed: tcp:8040
state: "present"
src_tags: "ansible-regla"
Comprobación de la creación de la red subred.
Módulo GCE_PD
- credentials
- name: Crear disco y asociar
gce_pd:
service_account_email: "ansible@oforte-196215.."
credentials_file: "/root/oforte-196215.json"
project_id: oforte-196215
name: ansible-disco
instance_name: ansible01
zone: europe-west3-c
size_gb: 20
state: present
mode: READ_WRITE
Comprobación de la creación y asociación.
Módulo GCE_TAG
LIBVIRT
Módulo VIRT
Módulo VIRT_NET
</dhcp>
</ip>
</network>
Módulo VIRT_POOL
</pool>
- name: Crear almacenamiento
virt_pool:
command: create
name: almacenamiento_ansible
Comprobación de la creación del almacenamiento.
# virsh pool-info almacenamiento_ansible
Name: almacenamiento_ansible
UUID: 782d767e-9dfc-48e0-828e-c94f5f747587
State: running
Persistent: yes
Autostart: no
Capacity: 28.71 GiB
Allocation: 22.22 GiB
Available: 6.49 GiB
OPENSTACK
Módulo OS_PROJECT
tasks:
- name: Instalar librería necesaria
pip:
name: shade
state: latest
- name: Crear proyecto ansible
os_project:
auth: "{{ autenticar }}"
name: ansible
description: Creado por Ansible
domain_id: default
validate_certs: False
Comprobación de la creación.
$ openstack project show ansible -f yaml
description: Creado por Ansible
enabled: true
id: d65ed18f8e2e4fa585f8410a76c146d6
name: ansible
Módulo OS_NETWORK
name: ansible-red
state: present
external: False
validate_certs: False
Comprobación de la creación.
$ openstack network list --project ansible -f yaml
- ID: edd02b43-ff7f-413d-bd0b-a7daaf64ae81
Name: ansible-red
Subnets: ''
Módulo OS_SUBNET
Módulo OS_ROUTER
En el siguiente ejemplo se conecta la subred ansible-subred con la red pública
para poder acceder a la instancia que crearemos a través de una IP flotante
(Floating IP).
Contenido del playbook.
- name: Crear un router que conecte ansible-subnet al ext.
hosts: localhost
gather_facts: False
environment:
OS_IDENTITY_API_VERSION: 3
tasks:
- name: Incluir variables para autenticar
include_vars: autenticar.yml
state: present
network: services
interfaces:
- ansible-subred
validate_certs: False
Comprobación del router y de las conexiones.
Módulo OS_SECURITY_GROUP
gather_facts: False
environment:
OS_IDENTITY_API_VERSION: 3
tasks:
- name: Incluir variables para autenticar
include_vars: autenticar.yml
Comprobación de la creación.
$ openstack security group list --project ansible -f yaml
- Description: Default security group
ID: 1b070218-db51-4025-8356-4b54735a3410
Name: default
Project: ''
- Description: Creado por Ansible
ID: 39412497-db33-49fe-bdb0-41b19e1eda38
Name: ansible-sg
Project: ''
Módulo OS_SECURITY_GROUP_RULE
environment:
OS_IDENTITY_API_VERSION: 3
tasks:
- name: Incluir variables para autenticar
include_vars: autenticar.yml
Módulo OS_SERVER
MÓDULOS CLUSTERING
Estos módulos sirven para gestionar diferentes clusters.
MÓDULOS MONITORING
Estos módulos sirven para gestionar diferentes plataformas de monitorización.
ZABBIX
MÓDULO ZABBIX_GROUP
Comprobación de la creación.
MÓDULO ZABBIX_HOST
Comprobación de la creación.
MÓDULO ZABBIX_HOSTMACRO
MÓDULO ZABBIX_MAINTENANCE
MÓDULO ZABBIX_SCREEN
MÓDULOS IDENTIDAD
CYBERARK
IPA
MÓDULO IPA_DNSRECORD
En este ejemplo añadimos un registro dentro del servidor IPA en la zona DNS
indicada.
MÓDULO IPA_GROUP
MÓDULO IPA_HOST
En el siguiente ejemplo se registra un servidor en IPA.
Contenido del playbook.
- name: Añadir servidor
hosts: servidoripa
gather_facts: False
tasks:
- ipa_host:
ipa_host: libroansible.oforte.net
ipa_pass: l1br04ns1bl3
state: present
validate_certs: False
fqdn: ansible02.libroansible.oforte.net
description: Servidor creado por Ansible
ip_address: 192.168.33.101
Comprobación de la creación del host.
# ipa host-show ansible02.libroansible.oforte.net
MÓDULO IPA_ROLE
MÓDULO IPA_USER
register: miclave
Módulo OPENDJ
MÓDULOS INVENTARIO
Estos módulos sirven para gestionar el inventario dentro de Ansible.
MÓDULO ADD_HOST
digital_ocean:
state: present
command: ssh
name: "Clave SSH Alberto"
api_token: cfc71eb22f747ef6d3687d177727aa31eed0a
register: clave_ssh
MÓDULO GROUP_BY
MÓDULOS MENSAJERÍA
Estos módulos sirven para gestionar RabbitMQ.
rabbitmq_binding Administra rabbitMQ bindings.
rabbitmq_exchange Administra rabbitMQ exchanges.
rabbitmq_parameter Añade o elimina parámetros de RabbitMQ.
rabbitmq_plugin Administra RabbitMQ plugins.
rabbitmq_policy Administra políticas en RabbitMQ.
rabbitmq_queue Administra rabbitMQ queues.
rabbitmq_user Añade o elimina usuarios de RabbitMQ.
rabbitmq_vhost Administra el estado de virtual hosts.
MÓDULOS CRIPTOGRAFÍA
Estos módulos sirven para hacer llamadas a OpenSSL.
EJEMPLO
Version: 3 (0x2)
Serial Number: 72527 (0x11b4f)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=ES, ST=Pontevedra, L=Vigo, O=OforteNet,
CN=libroansible.oforte.net/emailAddress=alberto@oforte.net
Validity
Not Before: Apr 1 16:58:19 2018 GMT
Not After : Mar 29 16:58:19 2028 GMT
Subject: C=ES, ST=Pontevedra, L=Vigo, O=OforteNet,
CN=libroansible.oforte.net/emailAddress=alberto@oforte.net
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
[...]
MÓDULO GET_URL
Comprobación de la descarga.
# ls -l /var/www/html/js/
total 284
-rw-r--r-- 1 www-data www-data 86927 Apr 1 19:47 jquery-3.3.1.min.js
-rw-r--r-- 1 www-data www-data 200143 Apr 1 19:47 jquery.mobile-
1.4.5.min.js
MÓDULO HAPROXY
Estado actual.
MÓDULO LDAP_ENTRY
ldap_entry:
server_uri: ldap://ldap.oforte.net/
bind_dn: cn=admin,dc=oforte,dc=net
bind_pw: 1yGCd11tAwnh
dn: cn=Ansible,ou=People,dc=oforte,dc=net
objectClass:
- inetOrgPerson
- top
- posixAccount
attributes:
description: Usuario creado por Ansible
givenName: Ansible
sn: Creado
uid: ansible
uidNumber: 1005
gidNumber: 1005
homeDirectory: /home/ansible
mail: ansible@oforte.net
userPassword: "{SSHA}4Iz+b/kLfe9OZ2/MEAi+d13hem"
MÓDULO NSUPDATE
MÓDULO SLURP
Este módulo es similar a fetch pero no copia el fichero al nodo Ansible sino que
devuelve el valor en una variable con formato base64. En el siguiente ejemplo
leemos el contenido de un fichero del nodo administrado.
MÓDULO URI
- set_fact:
ip_servidor: "{{ ansible_host }}"
- name: Comprobar conexión a la web
uri:
url: "http://{{ ip_servidor }}"
return_content: yes
register: respuesta
delegate_to: localhost
- debug: msg="Respuesta {{ respuesta.content }}"
Mensaje mostrado por debug.
TASK [debug] **********
ok: [debian01] => {
"msg": "Respuesta Hola desde debian01.c.oforte-196215.internal"
}
MÓDULOS ALMACENAMIENTO
Estos módulos sirven para gestionar distintas plataformas de almacenamiento.
Infinidat
Crea, elimina o modifica NFS Exports
infini_export en Infinibox.
Crea, elimina o modifica NFS
Client(s) para existentes exports en
infini_export_client Infinibox.
Crea, elimina o modifica sistemas de
infini_fs ficheros en Infinibox.
Crea, elimina o modifica Hosts en
infini_host Infinibox.
Crea, elimina o modifica Pools en
infini_pool Infinibox.
Crea, elimina o modifica volúmenes
en Infinibox.
infini_vol
Netapp
Administra los agregados de cDOT
na_cdot_aggregate de NetApp.
Administra el protocolo cDOT de
NetApp y las licencias de
na_cdot_license funciones.
na_cdot_lun Administra NetApp cDOT luns.
na_cdot_qtree Administra qtrees.
na_cdot_svm Administra NetApp cDOT svm.
Configuración y administración de
na_cdot_user useradmin.
Configuración y administración de
na_cdot_user_role useradmin.
Administra los volúmenes cDOT de
na_cdot_volume NetApp.
Crea, elimina y actualiza grupos
netapp_e_amg espejo asíncronos.
Imc
imc_rest Gestiona hardware Cisco IMC usando su REST API.
Ipmi
ipmi_boot Gestiona el orden de los dispositivos de inicio.
ipmi_power Administrador de energía para el servidor.
Manageiq
manageiq_provider Gestiona un proveedor en ManageIQ.
manageiq_user Gestiona usuarios en ManageIQ.
Oneview
oneview_ethernet Administra los recursos de la red Ethernet
_network de OneView.
oneview_ethernet Recupera los datos sobre una o más de las
_network_facts redes Ethernet OneView.
oneview_fc_netwo Administra los recursos de red de canal de
rk fibra de OneView.
oneview_fc_netwo Recupera los hechos sobre una o más de las
rk_facts redes de canal de fibra OneView.
oneview_fcoe_net Administra los recursos de la red OneView
work FCoE.
oneview_fcoe_net Recupera los hechos sobre una o más de las
work_facts redes OneView FCoE.
oneview_network_ Administra los recursos del conjunto de
set redes HPE OneView.
oneview_network_ Recupera datos sobre los conjuntos de red
set_facts OneView.
oneview_san_mana Administra recursos de OneView SAN
ger Manager.
Stacki
stacki_host Agrega o elimina el host al front-end stacki.
MÓDULOS REDES
Ansible tiene módulos soportados para administrar la mayoría de dispositivos
de red de las empresas más reconocidas, entre ellas:
Módulos para:
Cisco IOS
Cisco IOS XR
Cisco NX-OS
ETIQUETAS (TAGS)
Las etiquetas permiten especificar selectivamente qué tareas se ejecutarán o
se omitirán. Se pueden utilizar a nivel de Play, Role o Task (tarea), aunque se
aplican a nivel de tarea: si se especifican las etiquetas a un rol, se asignará esa
etiqueta a todas las tareas dentro del rol. La sintaxis es la siguiente:
Es posible utilizar --list-tasks para listar las tareas que se aplican a las etiquetas
seleccionadas. En el anterior ejemplo se incluyen estas tareas:
LOOKUPS
La directiva lookup nos permite obtener datos desde el servidor que está
ejecutando el Playbook. Por ejemplo si queremos leer el fichero /etc/motd desde
donde ejecutamos ansible-playbook podemos utilizar la siguiente sintaxis para
obtener el contenido del fichero.
debug: msg="{{ lookup('file', '/etc/motd') }}"
CSVFILE
Este plugin nos permite leer datos de un fichero CSV. Los parámetros son:
# cat datos.csv
agonzalez,Alberto,Gonzalez,alberto@oforte.net
jveipen,Jonathan,Veites,jveipen@oforte.net
- name: Plugin csvfile
hosts: ansible01
gather_facts: False
tasks:
- debug:
msg: "Correo {{ lookup('csvfile','agonzalez
file=datos.csv delimiter=, col=3') }}"
PLAY [Plugin csvfile] ****
TASK [debug] **********
ok: [ansible01] => {
"msg": "Correo alberto@oforte.net"
}
PLAY RECAP **********
ansible01 : ok=1 changed=0 unreachable=0 failed=0
DIG
Este plugin nos permite hacer una consola DNS. Los parámetros son los
siguientes:
ENV
FILE
INI
Este plugin nos permite leer datos de un fichero de configuración INI. Como
ejemplo se lee el fichero ansible.cfg del servidor donde se ejecuta ansible-
playbook, para mostrar la ruta del directorio de los roles.
PASSWORD
PIPE
URL
Este plugin nos permite leer el contenido de una página web. Los parámetros
son:
S/8x0ly+tmmIokaE0wwbdUu740YTZjCesroYWiRg5zuQ2xfKxJoV5E+Eh+tYwGDJ
n6HfWhRgnudRRwvuJ45ztYVtKulKw8QQpd2STWrcQQDJaRWmnMooX/PATTjCBExB
9dkz38Druvk7IkHMtsIqlkAOQMdsX1d3Tov6BE2XDjIG0zFxLduJGbVwc/6rIc95
T055j36Ez0HrjxdpTGOOHxRqMK5m9flFbaxxtDnS7w77WqzW7HjFrD0VeTx2vnjj
GqchHEQpfDpFOzb8LTFhgYidyRNUflQY35WLOzLNV+pV3eQ3Jg11UFwelSNLqfQf
uFRGc+zcwkNjHh5yPvm9odR1BIfqJ6sKGPGbtPNXo7ERMRypWyRz0zi0twARAQAB
tChGZWRvcmEgRVBFTCAoNykgPGVwZWxAZmVkb3JhcHJvamVjdC5vcmc+iQI4BBMB
AgAiBQJSrmiEAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBqL66iNSxk
5cfGD/4spqpsTjtDM7qpytKLHKruZtvuWiqt5RfvT9ww9GUUFMZ4ZZGX4nUXg49q
ixDLayWR8ddG/s5kyOi3C0uX/6inzaYyRg+Bh70brqKUK14F1BrrPi29eaKfG+Gu
MFtXdBG2a7OtPmw3yuKmq9Epv6B0mP6E5KSdvSRSqJWtGcA6wRS/wDzXJENHp5re
9Ism3CYydpy0GLRA5wo4fPB5uLdUhLEUDvh2KK//fMjja3o0L+SNz8N0aDZyn5Ax
CU9RB3EHcTecFgoy5umRj99BZrebR1NO+4gBrivIfdvD4fJNfNBHXwhSH9ACGCNv
HnXVjHQF9iHWApKkRIeh8Fr2n5dtfJEF7SEX8GbX7FbsWo29kXMrVgNqHNyDnfAB
VoPubgQdtJZJkVZAkaHrMu8AytwT62Q4eNqmJI1aWbZQNI5jWYqc6RKuCK6/F99q
thFT9gJO17+yRuL6Uv2/vgzVR1RGdwVLKwlUjGPAjYflpCQwWMAASxiv9uPyYPHc
ErSrbRG0wjIfAR3vus1OSOx3xZHZpXFfmQTsDP7zVROLzV98R3JwFAxJ4/xqeON4
vCPFU6OsT3lWQ8w7il5ohY95wmujfr6lk89kEzJdOTzcn7DBbUru33CQMGKZ3Evt
RjsC7FDbL017qxS+ZVA/HGkyfiu4cpgV8VUnbql5eAZ+1Ll6Dw==
=hdPa
-----END PGP PUBLIC KEY BLOCK-----
FILTROS
Cuando se utilizan plantillas (que usan el formato Jinja2) es posible utilizar
filtros para realizar distintas tareas sobre el contenido. Un ejemplo es transformar
un diccionario a formato JSON. La sintaxis de los filtros es la siguiente:
{{ mi_variable | filtro_a_aplicar }}
Las funciones internas de Ansible para las plantillas son las siguientes:
tasks:
- name: Cifrar texto en base64
set_fact: cifrado="{{ 'libro ansible' | b64encode }}"
- debug: var=cifrado
- name: Descifrar texto
debug:
msg: "Texto descifrado: {{ cifrado | b64decode }} "
- name: Mostrar UUID del hostname
debug: msg="UUUID {{ 'libro.oforte.net' | to_uuid }}"
Resultado de la ejecución.
PLAY [Ejemplos filtros base64 y uuid] ******
TASK [Cifrar texto en base64] **************
ok: [localhost]TASK [debug] **********
ok: [localhost] => {
"cifrado": "bGlicm8gYW5zaWJsZQ=="
}
TASK [Descifrar texto] ***
ok: [localhost] => {
"msg": "Texto descifrado: libro ansible "
}
TASK [Mostrar UUID del hostname] ********
ok: [localhost] => {
"msg": "UUUID 6b058c2e-e43c-51d9-9092-4050d98d0105"
}
PLAY RECAP **********
localhost : ok=4 changed=0 unreachable=0 failed=0
" }, ",
" \"jveipen\": {",
" \"apellido\": \"Veites\", ",
" \"email\": \"jveipen@oforte.net\", ",
" \"nombre\": \"Jonathan\"",
" }",
"}"
]
}
TASK [Leer una variable en formato JSON] **
ok: [localhost]
TASK [debug] **********
ok: [localhost] => {
"msg": "Correo alberto@oforte.net"
}
TASK [Mostrar usuarios en formato YAML] ***
ok: [localhost] => {
"msg": "agonzalez: {apellido: Gonzalez, email:
alberto@oforte.net, nombre: Alberto}\njveipen: {apellido:
Veites, email: jveipen@oforte.net, nombre: Jonathan}\n"
}
TASK [Mostrar usuarios en formato YAML (multiple líneas)]
*****
ok: [localhost] => {
"msg": [
"agonzalez:",
" apellido: Gonzalez",
" email: alberto@oforte.net",
" nombre: Alberto",
"jveipen:",
" apellido: Veites",
" email: jveipen@oforte.net",
" nombre: Jonathan",
""
]
}
TASK [Leer una variable en formato YAML] ***
ok: [localhost]
TASK [debug] **********
ok: [localhost] => {
"msg": "Correo alberto@oforte.net"
}
PLAY RECAP **********
localhost : ok=8 changed=0 unreachable=0 failed=0
Resultado de la ejecución.
PLAY [Ejemplos filtros rutas] ****************
TASK [Obtener el fichero de una ruta] *******
ok: [localhost] => {
"msg": "java"
}
TASK [Obtener el directorio de una ruta] ***
ok: [localhost] => {
"msg": "/etc/alternatives"
}
TASK [Convertir ~ a la ruta del usuario] ****
ok: [localhost] => {
"msg": "/root/.ssh/id_rsa.pub"
}
TASK [Mostrar la ruta a donde apunta un enlace] ********
ok: [localhost] => {
"msg": "/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java"
}
TASK [Separar el nombre y extensión] *****
ok: [localhost] => {
"msg": "('apache2', '.conf')"
}
PLAY RECAP **********
localhost : ok=4 changed=0 unreachable=0 failed=0
Resultado de la ejecución.
PLAY [Ejemplo filtros hashing] **************
TASK [Filtro hash] *****
ok: [localhost] => (item=md5) => {
"changed": false,
"item": "md5",
"msg": "c57f3f9c93c9d62baeec82bd2376e3a2"
}
ok: [localhost] => (item=sha1) => {
"changed": false,
"item": "sha1",
"msg": "8fdae2a189f730f7b25e34adc89423e730c1b75b"
}
ok: [localhost] => (item=sha224) => {
"changed": false,
"item": "sha224",
"msg": "7186a5d40164ea5b8414b00f7beed86f7b6c33c589beb13a7168c10e"
}
ok: [localhost] => (item=sha256) => {
"changed": false,
"item": "sha256",
"msg": "1e027b4cf0df2e7efe98a090c812180b315312728fbe80301ca02678659cda8a"
}
ok: [localhost] => (item=sha384) => {
"changed": false,
"item": "sha384",
"msg":
"7ddd65f5abee22d6662919bd83d20cd57c3eba74acb3861cb40e8357d2e2cdc7bb9aa78efa
87e65f79b9c6a0f2857d49"
}
ok: [localhost] => (item=sha512) => {
"changed": false,
"item": "sha512",
"msg":
"acc201b41e895774b870569ede9dd89c68af4e60b5ab558f5feb68f5ccabe16e368bf9137e
17796759f1a9296203ba61dccf54a4a27031c515082deeaf51e0ec"
}
TASK [Filtro checksum] ***
ok: [localhost] => {
"msg": "8fdae2a189f730f7b25e34adc89423e730c1b75b"
}
TASK [Filtro password_hash] **
ok: [localhost] => (item=md5) => {
"changed": false,
"item": "md5",
"msg": "$1$P.wul7vX$4L1MTH75XAYb.s9Vg7jy/."
}
ok: [localhost] => (item=sha256) => {
"changed": false,
"item": "sha256",
"msg":
"$5$rounds=535000$m9U3yZOjrvWJGZ4r$kJNaEH23nxRcvu.tMmmxMe7p.BXGemhuy1EYHwzz
F37"
}
ok: [localhost] => (item=sha512) => {
"changed": false,
"item": "sha512",
"msg":
"$6$rounds=656000$kghrt5191Unm3zgj$yuaMqkVfo5uP0qEz3jzaLCvZ57qY26yxaExZw1tA
jX5OyCeTBMYh.cN.KOFqUznOyn/f4xuoMDDs0r7XMLPME."
}
PLAY RECAP **********
localhost : ok=3 changed=0 unreachable=0 failed=0
Resultado de la ejecución.
PLAY [Filtros de expresiones regulares] ****
TASK [Filtro regex_replace] *****************
ok: [localhost] => (item=plantilla1.j2) => {
"changed": false,
"item": "plantilla1.j2",
"msg": "plantilla1"
}
ok: [localhost] => (item=plantilla2.j2) => {
"changed": false,
"item": "plantilla2.j2",
"msg": "plantilla2"
}
TASK [Filtro regex_escape] *****************
ok: [localhost] => {
"msg": "\\^f\\.\\*o\\(\\.\\*\\)\\$"
}
TASK [Filtro regex_search] **
ok: [localhost] => (item=Distro Debian) => {
"changed": false,
"item": "Distro Debian",
"msg": "Debian"
}
ok: [localhost] => (item=Distro CentOS) => {
"changed": false,
"item": "Distro CentOS",
"msg": "CentOS"
}
TASK [Filtro regex_findall] **
ok: [localhost] => {
"msg": [
"e4",
"a4",
"71",
"69",
"07",
"94"
]
}
PLAY RECAP **********
localhost : ok=4 changed=0 unreachable=0 failed=0
Resultado de la ejecución.
PLAY [Filtros de tratado de listas] *********
TASK [Mostrar un usuario al azar] **********
ok: [localhost] => {
"msg": "usuario3"
}
TASK [Muestra los usuarios mezclados] ***
ok: [localhost] => {
"msg": [
"agonzalez",
"usuario3",
"usuario1",
"usuario2"
]
}
TASK [Une dos listas] ****
ok: [localhost] => {
"msg": [
"usuario1",
"usuario2",
"usuario3",
"agonzalez",
"mperez"
]
}
TASK [Muestra los valores que son administradores] **
ok: [localhost] => {
"msg": [
"agonzalez"
]
}
TASK [Muestra los valores que no son administradores]
***************
ok: [localhost] => {
"msg": [
"usuario1",
"usuario2",
"usuario3"
]
}
PLAY RECAP **********
localhost : ok=5 changed=0 unreachable=0 failed=0
"item": "192.168.100.2",
"msg": "192.168.100.2"
}
ok: [localhost] => (item=192.168.100.2/16) => {
"changed": false,
"item": "192.168.100.2/16",
"msg": "192.168.100.2/16"
}
ok: [localhost] => (item=192.168.300.2) => {
"changed": false,
"item": "192.168.300.2",
"msg": false
}
TASK [Obtener IP de un CIDR] *************
ok: [localhost] => {
"msg": "2a02:8109:b180:66d0:e6a4:71ff:fe69:794"
}
TASK [Obtener red de un CIDR] ************
ok: [localhost] => {
"msg": "192.168.0.0"
}
TASK [Obtener netmask de un CIDR] ******
ok: [localhost] => {
"msg": "255.255.0.0"
}
TASK [Obtener broadcast de un CIDR] ****
ok: [localhost] => {
"msg": "192.168.255.255"
}
TASK [Obtener prefijo de un CIDR] *********
ok: [localhost] => {
"msg": "32"
}
TASK [Convertir a CIDR] ****
ok: [localhost] => {
"msg": "192.168.0.0/24"
}
TASK [Comprobar si es red correcta] *******
ok: [localhost] => (item=192.168.100.2/16) => {
"changed": false,
"item": "192.168.100.2/16",
"msg": "192.168.100.2/16"
}
ok: [localhost] => (item=192.168.100.2/33) => {
"changed": false,
"item": "192.168.100.2/33",
"msg": false
}
TASK [Convertir mac a formato cisco] ******
ok: [localhost] => {
"msg": "5254.003a.7d47"
}
PLAY RECAP **********
localhost : ok=9 changed=0 unreachable=0 failed=0
reemplazada por
una nueva.
reverse Invierte el {{ [3,24,16] | reverse|list }} = [16,24,3]
objeto o {{ "libro" | reverse }} = "orbil"
devuelve un
iterador que lo
repite al revés.
round Redondea el {{ 3.14 | round }} = 3.0
número a una {{ 3.14 | round(method="ceil") }} = 4.0
precisión dada. {{ 3.80 | round(method="floor") }} = 3.0
[
"agonzalez",
{
"apellido": "Gonzalez",
"email": "alberto@oforte.net",
"nombre": "Alberto"
}
],
[
"jveipen",
{
"apellido": "Veites",
"email": "jveipen@oforte.net",
"nombre": "Jonathan"
}
]
]
Resultado
Genero: femenino
Usuario: mperez
Genero: masculino
Usuario: jveipen
Usuario: agonzalez
- mperez
ids:
- 1
- 2
- 3
tasks:
- debug: msg="{{ usuarios|select("equalto", 'agonzalez')
| list | length }}"
- debug: msg="{{ ids|select('odd') | list }}"
Salida de la ejecución.
TASK [debug] **********
ok: [localhost] => {
"msg": "1"
}
TASK [debug] **********
ok: [localhost] => {
"msg": [
1,
3
]
}
{
"apellido": "Gonzalez",
"email": "alberto@oforte.net",
"login": "agonzalez",
"nombre": "Alberto"
}
]
}
VAULT
ANSIBLE-VAULT
La sintaxis es la siguiente:
create
edit
encrypt
decrypt
Comprobar cifrado.
# cat secreto2.yml
$ANSIBLE_VAULT;1.1;AES256
66366239313965343632643238613632383930653533643735366538616465373565383362323563
3565623065663863383339613466393437616364643630610a323438396432356638616565376338
35303033303632353431636163363235336532326239633833303861386631626232656634356564
3736346237393037370a333463356138663134383935356332636436346338336262323237643062
65663335313530363339373438396437323064356333316636383837326135353465
Descifrar fichero.
# ansible-vault decrypt secreto2.yml
Vault password:
Decryption successful
# cat secreto2.yml
clave: l1br04ns1bl3
rekey
view
ANSIBLE-PLAYBOOK
TAREAS ASÍNCRONAS
Cuando se realiza una tarea en un nodo, a través de un módulo, la conexión
permanece abierta esperando a que la acción finalice. En tareas que requieran
tiempo largo de ejecución, puede causar problemas de que la conexión se cierre
por inactividad. Ansible nos da la opción de realizar una tarea en segundo plano y
comprobar su estado periódicamente sin tener que permanecer la conexión
abierta.
Para ello utilizaremos los argumentos async (tiempo máximo a esperar que
una aplicación termine) y poll (la periodicidad en segundos de la comprobación
del estado de la tarea). En el siguiente ejemplo se ejecuta un comando que
tardará 60 segundos en finalizar (comando sleep), con async se esperará un
máximo de 90 segundos y se comprobará con poll cada 5 segundos.
Ansible también nos permite ejecutar una tarea en segundo plano sin esperar
(usando poll con valor 0), realizar distintas tareas y a posteriori comprobar en otra
tarea el estado de la ejecutada en segundo plano utilizando el módulo
async_status. A continuación se muestra un ejemplo.
Es posible utilizar "pool: 0" para ejecutar una tarea sin importanos el
resultado de la tarea, se denomina fire and forget (disparar y olvidar).
OPCIONES AVANZADAS
Hay opciones avanzadas para configurar el funcionamiento de un
Playbook/Rol/Block/Tarea. Se muestran a continuación:
any_errors_fatal: True
tasks:
- name: Tarea que falla en un nodo
command: dpkg --version
- name: Debería ejecutarse en los que no ha fallado
command: dpkg -l
Salida de la ejecución.
PLAY [Ejemplo de any_errors_fatal] ********
TASK [Tarea que falla en un nodo] *********
changed: [ansible01]
changed: [debian01]
fatal: [centos01]: FAILED! => {"changed": false, "cmd":
"dpkg --version", "msg": "[Errno 2] No such file or
directory", "rc": 2}
NO MORE HOSTS LEFT ***
to retry, use: --limit @/root/playbooks/avanzado.retry
EXTENDER ANSIBLE
Ansible nos da la opción de desarrollar nuestros propios filtros y módulos para
extender la funcionalidad que nos proporciona por defecto. Es recomendado
tener conocimientos previos de Python para ello.
LOOKUP
lookup_plugins/whoami.py
# python 3 headers, required if submitting to Ansible
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
DOCUMENTATION = """
lookup: whoami
author: Alberto Gonzalez <alberto@oforte.net>
version_added: "0.1"
short_description: Devuelve el usuario que ejecuta el playbook
description:
- Este lookup devuelve el usuario que ejecuta el playbook
"""
from ansible.errors import AnsibleError, AnsibleParserError
from ansible.plugins.lookup import LookupBase
try:
FILTROS
return {
'cifrar': rot13,
}
Contenido del playbook.
- hosts: localhost
gather_facts: False
tasks:
- debug: msg="{{ 'ejemplo' | cifrar }}"
Resultado de la ejecución.
ok: [localhost] => {
"msg": "rwrzcyb"
}
MÓDULOS
EXAMPLES = '''
- name: Suma 2 + 3
sumar:
a: 2
b: 3
'''
from ansible.module_utils.basic import AnsibleModule
def run_module():
module_args = dict(
a=dict(type='int', required=True),
b=dict(type='int', required=True)
)
result = dict(
changed=False,
resultado=''
)
module = AnsibleModule(
argument_spec=module_args,
supports_check_mode=True
)
result['resultado'] = module.params['a']+module.params['b']
module.exit_json(**result)
def main():
run_module()
if __name__ == '__main__':
main()
Contenido del playbook.
- hosts: localhost
gather_facts: False
tasks:
- sumar:
a: 2
b: 3
register: suma
- debug: var=suma.resultado
Resultado de la ejecución.
INVENTARIO
result = {}
result['all'] = {}
Bucles avanzados
Es posible realizar bucles sobre elementos distintos a listas y diccionarios. En la
siguiente tabla se muestran los elementos que se pueden recorrer y la sintaxis a
utilizar.
"msg": "/etc/mke2fs.conf"
}
Playbook ejemplo con with_filetree.
- name: Ejemplo con with_filetree
hosts: servidor
gather_facts: False
tasks:
- debug: msg="{{ item.src }}"
when: item.state == 'file'
with_filetree: "/etc/supervisor"
Resultado ejemplo with_fileglob.
TASK [debug]
skipping: [servidor] => (item=None)
ok: [servidor] => (item=None) => {
"msg": "/etc/supervisor/supervisord.conf"
}
ok: [servidor] => (item=None) => {
"msg": "/etc/supervisor/conf.d/long_script.conf"
}
Playbook ejemplo con with_together.
TASK [debug]
ok: [servidor] => (item=None) => {
"msg": "a=97"
}
ok: [servidor] => (item=None) => {
"msg": "b=98"
}
ok: [servidor] => (item=None) => {
"msg": "c=99"
}
Playbook ejemplo con with_sequence.
Local facts
El módulo setup obtiene facts con información del sistema, como uso de
memoria, interfaces de red, discos, etc. Ansible nos permite definir nuestros
propios facts, para ello creamos un fichero con extensión .fact en formato INI
dentro del directorio /etc/ansible/facts.d/ del nodo administrado.
INTRODUCCIÓN
En esta captura se observa que los roles más descargados son para
configurar/instalar redis, grafana, logrotate y composer. Al hacer clic sobre uno de
ellos se nos mostrará información detallada.
ANSIBLE
Además, se nos indican las plataformas soportadas y las versiones de este rol.
COMANDO ANSIBLE-GALAXY
Ejemplos:
ejemplorol
=========
Este rol es un ejemplo para el libro Ansible
Requirements
------------
No hay prerrequisitos.
Role Variables
--------------
Las variables por defecto se definen en defaults/main.yml
Dependencies
------------
No dependencias
Example Playbook
----------------
Ejemplo:
- hosts: servers
roles:
- { role: agonzalezrh.ejemplorol }
License
-------
BSD
Author Information
------------------
Alberto Gonzalez <alberto@oforte.net>
galaxy_info:
author: Alberto Gonzalez
description: Rol de ejemplo para el libro de Ansible
company: Oforte
license: BSD
min_ansible_version: 1.2
platforms:
- name: Debian
versions:
- all
- name: EL
versions:
- 7
galaxy_tags: ["libro", "ejemplo"]
dependencies: []
ejemplorol/defaults/main.yml
---
# defaults file for ejemplorol
destinos:
- /etc/issue
- /etc/motd
ejemplorol/tasks/main.yml
---
# tasks file for ejemplorol
- name: Generar fichero /etc/motd y /etc/issue
template:
src: issue.j2
dest: "{{ item }}"
with_items: "{{ destinos }}"
ejemplorol/templates/issue.j2
System Information For Hostname: {{ inventory_hostname }}
Distribution: {{ ansible_distribution }}
Distribution Release: {{ ansible_distribution_release }}
Distribution Version: {{ ansible_distribution_version }}
IP Address: {{ ansible_default_ipv4.address }}
DNS Server(s): {{ ansible_dns.nameservers|join (" ") }}
Kernel: {{ ansible_kernel }}
{% if ansible_lsb is defined %}
LSB: {{ ansible_lsb.description }}
{% endif %}
Memory Installed: {{ (ansible_memtotal_mb / 1024) | round(1) }}GB
Memory Swapfile: {{ (ansible_swaptotal_mb / 1024) | round(1) }}GB
Una vez publicado el código dentro del repositorio, será posible importarlo en
Galaxy.
# git init .
Initialized empty Git repository in /root/libro/ejemplorol/.git/
# git add .
# git commit -a -m "Primera version"
[master (root-commit) 0fed88a] Primera version
9 files changed, 92 insertions(+)
create mode 100644 README.md
create mode 100644 defaults/main.yml
# ansible-galaxy login
We need your Github login to identify you.
This information will not be sent to Galaxy, only to
api.github.com.
The password will not be displayed.
Use --github-token if you do not want to enter your password.
Github Username: agonzalezrh
Password for agonzalezrh:
Successfully logged into Galaxy as agonzalezrh
FICHERO REQUISITOS
En nuestro proyecto de Ansible podemos tener un fichero (normalmente
llamado requirements.yml) que contiene los roles necesarios para nuestro
Playbook. Este fichero será utilizado para descargarlo desde Ansible Galaxy o
desde Gestión de Configuración de Software (SCM).
Para instalar los roles definidos dentro del fichero, es necesario utilizar la
opción -r (--roles-file) con la acción install.
INTRODUCCIÓN
Ansible Tower es una solución web para facilitar las tareas de automatización a
todos los equipos dentro de IT. Los componentes son los siguientes:
● Proyectos: repositorio de Playbooks:
○ Alojados localmente
○ Gestión de Configuración de Software (SCM):
■ Git
■ Mercurial (hg)
■ Subversion
● Inventarios: estáticos o dinámicos (proveedores cloud, otros software de
inventario).
● Plantillas de trabajo: definición de playbook, inventario y diversas
opciones (como sudo, las credenciales a utilizar, etc..)
● Trabajos: se generan al ejecutar una plantilla.
● Configuración:
○ Credenciales.
○ Equipos (Teams).
○ Organizaciones
○ Permisos
○ Configuración de Tower:
■ Autenticación
■ Registros
■ Valores globales
ANSIBLE
INSTALACIÓN
Los requisitos para la instalación se detallan a continuación:
[tower]
localhost ansible_connection=local
[database]
[all:vars]
admin_password= 'l1br04ns1bl3''
pg_host=''
pg_port=''
pg_database='awx'
pg_username='awx'
pg_password='l1br04ns1bl3'
rabbitmq_port=5672
rabbitmq_vhost=tower
rabbitmq_username=tower
rabbitmq_password='l1br04ns1bl3'
rabbitmq_cookie=cookiemonster
rabbitmq_use_long_name=false
Una vez identificados, nos pedirá el fichero de licencia necesario para poder
utilizar el producto.
CONFIGURACIÓN
Una vez instalado Ansible Tower es posible configurar los siguientes
elementos:
ORGANIZACIÓN
USUARIOS
Un usuario es alguien que tiene permiso para acceder a Tower con las
credenciales y los permisos correctos. Existen tres tipos de usuarios:
El usuario por defecto, con el que nos hemos autenticado y hemos definido la
contraseña en el fichero de inventario, es admin.
EQUIPOS
Una vez creado el equipo, podemos asociar usuarios al mismo e indicar el rol
dentro del equipo: administrador o miembro.
CREDENCIALES
Las credenciales son utilizadas por Tower para autenticar al lanzar trabajos
sobre máquinas, sincronizar inventarios e importar proyectos desde un sistema de
control de versiones.
Es posible dar permiso a los usuarios para poder utilizar estas credenciales, sin
necesidad de que dicho usuario tenga acceso real a la información. Al crear una
credencial se especifica la siguiente información: nombre, descripción (opcional),
organización y el tipo de credencial de la siguiente lista:
TRABAJOS DE GESTIÓN
Ansible Tower viene con tres trabajos de gestión para limpiar información
antigua.
SCRIPTS DE INVENTARIO
NOTIFICACIONES
LICENCIA
GRUPO DE INSTANCIAS
[tower]
servidorglobal
[instance_group_europa]
servidorsp
servidorde
[instance_group_americana]
servidormx
servidorco
CONFIGURAR TOWER
Autentificación
● Azure AD
● GitHub
● GitHub Org
● GitHub Team
● Google OAuth2
● LDAP
● RADIUS
● SAML
● TACACS+
Trabajos
Sistema
Miscelánea
Registros
Flujo de actividad
Interfaz de usuario
Proyectos
Un proyecto hace referencia a dónde están alojados los playbooks y todos los
ficheros necesarios (plantillas, roles, etc.). Pueden estar alojados en:
Inventarios
● Amazon EC2
● Google Compute Engine
● Microsoft Azure Resource Manager
● VMware vCenter
FUENTES
Una vez sincronizada la fuente, se llenarán los servidores y los grupos con la
información obtenida desde el proveedor.
AD HOC
Credenciales
Plantillas
Trabajos
Un trabajo contiene la información sobre una plantilla ejecutada u otro trabajo
interno:
● Sincronizar un repositorio.
● Sincronizar un inventario.
● Trabajos internos:
○ Limpiar logs.
○ Otras tareas varias.
● Trabajos programados -> Plantillas ejecutadas periódicamente.
Programar
Notificaciones
Es posible configurar notificaciones para que el trabajo generado cuando se
ejecuta la plantilla notifique al finalizar si ha sido correctamente o ha fallado.
Permisos
Es posible asignar de forma granular permisos dentro de Ansible Tower a los
componentes.
PROYECTOS
INVENTARIOS
● Uso: el usuario o los miembros del equipo podrán usar pero no editar el
inventario.
● Actualización: el usuario o los miembros del equipo, en caso de ser
inventario dinámico podrán actualizar el inventario.
● Ad Hoc: el usuario o los miembros del equipo podrán ejecutar acciones en
los nodos (usando los módulos) sin necesidad de una plantilla.
PLANTILLAS
CREDENCIALES
Avanzado
Algunas de las características avanzadas en Tower son:
INVENTARIO INTELIGENTE
ENCUESTA (SURVEY)
● Texto.
● Área de texto.
● Contraseña.
● Lista (seleccionar opción única).
● Lista (seleccionar múltiples opciones).
● Número (entero).
● Número (decimal).
CALLBACK
Desde un nodo que esté definido dentro del inventario de esa plantilla,
podemos hacer una llamada a la web indicada y la clave indicada para iniciar ese
trabajo en el nodo. Por ejemplo:
En la lista de trabajos podemos ver que un nuevo trabajo aparece para esa
plantilla con la siguiente información.
ansible-tower-setup-bundle-3.2.3-1.el7# ./setup.sh –b
[..]
RUNNING HANDLER [backup : Remove the common tarball.] *******************
changed: [localhost] => {"changed": true, "path":
"/var/backups/tower/common.tar.gz", "state": "absent"}
RUNNING HANDLER [backup : Remove backup dest stage directory.] *********
changed: [localhost] => {"changed": true, "path": "/root/ansible-tower-
setup-bundle-3.2.3-1.el7/2018-04-07-17:28:56", "state": "absent"}
PLAY RECAP **********
localhost : ok=31 changed=23 unreachable=0 failed=0
The setup process completed successfully.
Setup log saved to /var/log/tower/setup-2018-04-07-17:28:51.log
# ls -ltr tower-backup-*
-rw-r--r--. 1 root root 619895 Apr 7 17:29 tower-backup-2018-04-07-17:28:56.tar.gz
lrwxrwxrwx. 1 root root 84 Apr 7 17:29 tower-backup-latest.tar.gz -> /root/ansible-
tower-setup-bundle-3.2.3-1.el7/tower-backup-2018-04-07-17:28:56.tar.gz
ansible-tower-setup-bundle-3.2.3-1.el7# ./setup.sh –r
TASK [Start Tower services on all nodes] **
changed: [localhost] => {"changed": true, "cmd": ["ansible-tower-
service", "start"], "delta": "0:00:03.661157", "end": "2018-04-07
17:33:07.284704", "rc": 0, "start": "2018-04-07 17:33:03.623547",
"stderr": "Redirecting to /bin/systemctl start postgresql-
9.6.service\nRedirecting to /bin/systemctl start rabbitmq-
server.service\nRedirecting to /bin/systemctl start
nginx.service\nRedirecting to /bin/systemctl start
supervisord.service", "stderr_lines": ["Redirecting to
/bin/systemctl start postgresql-9.6.service", "Redirecting to
/bin/systemctl start rabbitmq-server.service", "Redirecting to
/bin/systemctl start nginx.service", "Redirecting to
/bin/systemctl start supervisord.service"], "stdout": "Starting
Tower", "stdout_lines": ["Starting Tower"]}
PLAY [database] *******
skipping: no hosts matched
PLAY RECAP **********
localhost : ok=38 changed=20 unreachable=0 failed=0
The setup process completed successfully.
Setup log saved to /var/log/tower/setup-2018-04-07-17:32:40.log
A C
ad-hoc ........................................................ 26 changed ...................................................... 10
always ........................................................ 70 changed_when........................................... 68
ansible.cfg............................................... 8 check_mode ............................................... 40
ansible_become ..................................... 13 children .................................................... 14
ansible_become_method ..................... 13 código fuente .......................................... 7
ansible_become_user.......................... 13 comentario ............................................... 54
ansible_connection .......................... 111 condición.................................................. 55
ansible_host .......................................... 13 condiciones ............................................. 39
ansible_port .......................................... 13 control_path........................................... 34
ansible_ssh_pass ................................. 13 control_path_dir ................................. 34
ansible_user .......................................... 13 csvfile .................................................... 318
ansible-galaxy ................................... 368 cyberark .................................................. 292
ansible-playbook ................................. 33
ansible-vault ...................................... 348 D
any_errors_fatal ............................... 355
async ................................................. 131, 352 defaults .................................................... 32
azure ......................................................... 253 delegate_facts .................................... 355
delegate_to ............................................ 64
docker ................................................. 13, 263
B
become ................................................ 34, 308 E
--become.................................................... 12
become_ask_pass ................................... 34 env .............................................................. 129
become_method .................................. 34, 40 etiquetas................................................ 315
become_user............................................ 34, --extra-vars........................................... 41
259, 260
bloques ...............................69, 169, 170, 259 F
bucles .......................................... 42, 54, 361
failed ......................................................... 30
failed_when ............................................ 68
ANSIBLE
P
L
password .................................................... 10
libvirt ............................................ 274, 275
permisos .................................................... 13
listen .................................................. 44, 45
pip .................................................................. 5
--lists-tasks ........................................ 41 pipe ................................................... 319, 361
pipelining ............................................... 34
M plantillas ................................. 3, 383, 401
play ............................................................. 37
max_fail_percentage........................ 355 playbook .................................................... 37
meta50, 51, 53, 131, 132, 371, 372, 373, 374, 375, 376 poll ........................................................... 140
módulo command ..................................... 26 post_tasks ............................................... 51
módulo copy............................... 26, 38, 323 pre_tasks.................................................. 51
módulo cpanm ........................................ 105 pywinrm ...................................................... 35
R U
register.................................................... 49 ungrouped.................................................. 16
remote_port............................................. 33 url .............................................................. 111
remote_user............................................. 33
requirements.yml ............................... 377 V
rescue ........................................................ 70
roles ........................................................... 41 -v, --verbose ........................................ 41
run_once.................................................. 355 variables................................................. 13
variables globales .................. 156, 396
vars ............................................................. 14
S
vars_files ............................................... 46
scp_if_ssh ............................................... 34 vault ......................................................... 319
selinux ...................................................... 32
serial ...................................................... 355 W
skipped ...................................................... 39
solaris .................................................... 171 when ............................................................. 55
ssh_args.................................................... 34 windows ...................................................... 13
--start-at-task ................................... 41 winrm ............................................. 35, 36, 208
stderr ........................................................ 29 with_dict.................................................. 61
stderr_lines .......................................... 63 with_file................................................ 361
stdout ........................................................ 29 with_fileglob ...................................... 361
stdout_lines .......................................... 29 with_filetree ...................................... 362
--step ........................................................ 41 with_items .............................................. 58
--syntax-check ..................................... 41 with_nested ............................................ 60
with_random_choice .......................... 362
with_sequence ...................................... 362
T
with_together ...................................... 362
tags ........................................................... 246
tasks ........................................................... 37 Y
template.................................................... 51
templates ................................................. 50 yaml ............................................................. 39
timeout ...................................................... 33
Z
zabbix ....................................................... 287