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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow