ansible
Roles
Buscar..
Usando roles
Ansible utiliza el concepto de roles para permitir mejor el código modular y evitar que se repita.
Un rol es simplemente una estructura de carpetas que Ansible sabe desde dónde cargar archivos vars, tareas y controladores desde. Un ejemplo podría parecer algo como esto:
apache/
├── defaults
│ └── main.yml
├── files
│ ├── mod-pagespeed-stable_current_i386.deb
│ ├── mod-pagespeed-stable_current_i386.rpm
│ ├── mod-pagespeed-stable_current_amd64.deb
| └── mod-pagespeed-stable_current_x86_64.rpm
├── tasks
│ ├── debian.yml
│ ├── main.yml
│ └── redhat.yml
├── templates
│ ├── httpd.conf.j2
│ └── sites-available
│ └── virthualhost.conf.j2
└── vars
├── debian
└── redhat
Luego puedes usar el rol con un libro de jugadas básico que se ve así:
- hosts: webservers
roles:
- apache
Cuando ejecute Ansible contra este libro de jugadas, se dirigirá a todos los hosts del grupo de webservers
y ejecutará la función de apache
definida anteriormente, cargando automáticamente las variables predeterminadas para la función y ejecutando todas las tareas incluidas en tasks/main.yml
. Ansible también sabe buscar ciertos tipos de archivos en ubicaciones amigables con los roles:
Si existen roles / x / tasks / main.yml, las tareas enumeradas allí se agregarán al juego
Si los roles / x / handlers / main.yml existen, los manejadores enumerados allí se agregarán a la obra
Si existen roles / x / vars / main.yml, las variables enumeradas allí se agregarán a la obra
Si existen roles / x / meta / main.yml, las dependencias de los roles que se enumeran allí se agregarán a la lista de roles (1.3 y posteriores)
Cualquier copia, script, plantilla o tareas de inclusión (en el rol) pueden hacer referencia a archivos en roles / x / {archivos, plantillas, tareas} / (el directorio depende de la tarea) sin tener que realizar una ruta de acceso relativa o absoluta
Dependencias de roles
Los roles también le permiten definir otros roles como una dependencia al crear un archivo meta/main.yml
con un bloque de dependencies
:
dependencies:
- role: common
También es posible pasar un valor a un parámetro / variable en el rol dependiente:
dependencies:
- { role: common, some_parameter: 3 }
O incluso ejecutar el rol dependiente condicionalmente:
dependencies:
- { role: common, some_parameter: 3 }
- { role: sshd, enable_sshd: false,
when: environment == 'production' }
Los roles dependientes siempre se ejecutan antes que los roles que dependen de ellos. Además, solo se ejecutan una vez. Si dos roles establecen el mismo que su dependencia, solo se ejecutará la primera vez.
Imagine los roles role1, role2 y role3 con los siguientes meta/main.yml
's:
role1 / meta / main.yml:
dependencies:
- role: role3
role2 / meta / main.yml:
dependencies:
- role: role3
Al ejecutar role1 y role2 en el mismo libro de jugadas (con role1 llamado antes de role2), el orden de ejecución sería el siguiente:
role3 -> role1 -> role2
Puede anular este comportamiento especificando allow_duplicates: yes
en meta/main.yml
de role1 y role2. La orden de ejecución resultante sería:
role3 -> role1 -> role3 -> role2
Separar tareas y variables específicas de distribución dentro de un rol
Podemos separar fácilmente tareas y variables específicas de distribución en diferentes archivos .yml dedicados. Ansible nos ayuda a identificar automáticamente la distribución de los hosts de destino a través de {{ ansible_distribution }}
y {{ ansible_distribution_version }}
, por lo que solo tenemos que nombrar los archivos .yml dedicados a la distribución en consecuencia.
Para Ubuntu Xenial, el árbol de dir de rol básico se vería así:
role
├── tasks
│ ├── main.yml
│ └── Ubuntu16.04.yml
└── vars
└── Ubuntu16.04.yml
Dentro de las tasks/main.yml
ahora podemos incluir automáticamente las variables y tareas adecuadas para la distribución de los hosts de destino.
tareas / main.yml
---
- name: include distribution specific vars
include_vars: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"
- name: include distribution specific install
include: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"
Dentro de las tasks/Ubuntu16.06.yml
y vars/Ubuntu16.04.yml
ahora podemos definir tareas y variables para Ubuntu Xenial respectivamente.