Cuadernos de jugadas de Ansible vs roles

97

Según los documentos de Ansible, un Playbook es:

... la base para un sistema de implementación de múltiples máquinas y administración de configuración realmente simple, diferente a todos los que ya existen, y que es muy adecuado para implementar aplicaciones complejas.

Y, nuevamente, de acuerdo con esos mismos documentos, los roles son:

... formas de cargar automáticamente ciertos vars_files, tareas y manejadores basados ​​en una estructura de archivo conocida. La agrupación de contenido por funciones también permite compartir funciones fácilmente con otros usuarios.

Sin embargo, la distinción entre estos y sus diferentes casos de uso no me resulta inmediatamente obvia. Por ejemplo, si configuro mi /etc/ansible/hostsarchivo para que se vea así:

[databases]
mydb01.example.org
mydb02.example.org

[mail_servers]
mymail01.example.org
mymail_dr.example.org

... entonces, ¿qué es esta " [databases]" entrada ... un rol ? ¿O el nombre de un archivo YAML de libro de jugadas en alguna parte? ¿¡¿O algo mas?!?

Si alguien pudiera explicarme las diferencias entre estos, ¡mi comprensión de Ansible mejoraría enormemente!

  • Playbook vs Role vs [databases]y entradas similares en/etc/ansible/hosts
  • Si los Playbooks se definen dentro de los archivos YAML, ¿dónde se definen los roles?
  • Aparte de ansible.cfgvivir en el servidor de Ansible, ¿cómo agrego / configuro Ansible con Playbooks / Roles disponibles? Por ejemplo, cuando corro ansible-playbook someplaybook.yaml, ¿cómo sabe Ansible dónde encontrar ese libro de jugadas?
smeeb
fuente
1
Los roles son una forma de hacer que el código en los libros de jugadas sea reutilizable al colocar la funcionalidad en "bibliotecas" generalizadas que luego se pueden usar en cualquier libro de jugadas según sea necesario.
Juan Jimenez
taskshacer cosas. playbooksorganizar y lanzar tareas. rolesorganizar grupos de tareas, manipuladores, etc. que realizan una función particular. Se playbooknecesita algo para iniciar el role(los). ¿Cómo llamarías una colección de rolesy playbooks? Digamos, por ejemplo, uno que gestiona la configuración de todos los hosts de su sitio.
fbicknel

Respuestas:

110

Playbook vs Role vs [bases de datos] y entradas similares en / etc / ansible / hosts

[databases]es un nombre único para un grupo de hosts. Le permite hacer referencia a varios hosts con un solo nombre.

El rol es un conjunto de tareas y archivos adicionales para configurar el host para que sirva para un rol determinado .

Playbook es un mapeo entre hosts y roles.

El ejemplo de la documentación describe el proyecto de ejemplo. Contiene dos cosas:

  • Playbooks. site.yml, webservers.yml, fooservers.ymlSon libros de jugadas.
  • Roles: roles/common/y roles/webservers/contienen definiciones commony webserversroles en consecuencia.

Dentro del libro de jugadas ( webservers.yml) tienes algo como:

---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
  roles: <- this is list of roles to assign to these hosts
     - common
     - webservers

Si los Playbooks se definen dentro de los archivos YAML, ¿dónde se definen los roles?

Se definen dentro de roles/*directorios. Los roles se definen principalmente mediante archivos YAML, pero también pueden contener recursos de cualquier tipo ( files/, templates/). De acuerdo con la documentación, la definición de roles se estructura de esta manera:

  • Si existe roles / x / tasks / main.yml, las tareas enumeradas allí se agregarán a la obra
  • Si existe roles / x / handlers / main.yml, los controladores enumerados allí se agregarán al juego
  • Si existe roles / x / vars / main.yml, las variables enumeradas en él se agregarán a la obra
  • Si existe roles / x / meta / main.yml, todas las dependencias de roles enumeradas allí se agregarán a la lista de roles (1.3 y posteriores)
  • Cualquier tarea de copia puede hacer referencia a archivos en roles / x / files / sin tener que hacer una ruta relativa o absoluta
  • Cualquier tarea de secuencia de comandos puede hacer referencia a secuencias de comandos en roles / x / archivos / sin tener que establecer una ruta relativa o absoluta.
  • Cualquier tarea de plantilla puede hacer referencia a archivos en roles / x / templates / sin tener que establecer una ruta relativa o absoluta
  • Cualquier tarea de inclusión puede hacer referencia a archivos en roles / x / tasks / sin tener que hacer una ruta relativa o absoluta

El archivo más importante es roles/x/tasks/main.yml, aquí se definen las tareas que se ejecutarán cuando se ejecute el rol.

Aparte de ansible.cfg que se encuentra en el servidor de Ansible, ¿cómo agrego / configuro Ansible con Playbooks / Roles disponibles? Por ejemplo, cuando ejecuto ansible-playbook someplaybook.yaml, ¿cómo sabe Ansible dónde encontrar ese libro de jugadas?

$ ansible-playbook someplaybook.yaml

Buscará un libro de jugadas dentro del directorio actual.

$ ansible-playbook somedir/somedir/someplaybook.yaml

Buscará un libro de jugadas dentro del somedir/somedir/directorio.

Es su responsabilidad poner su proyecto con todos los libros de jugadas y roles en el servidor. Ansible no tiene nada que ver con eso.

Administrador de Yaroslav
fuente
Gracias @Yaroslav Admin (+1): una pregunta de seguimiento rápida: usted afirma que los roles se definen dentro de los directorios , pero ¿qué configura realmente el rol? En otras palabras, el webservers.ymllibro de jugadas asigna los [webservers]anfitriones al rol commony webservers. Pero, ¿qué se incluye exactamente con el commonpapel? No hay forma de definir eso en los directorios, entonces, ¿hay típicamente archivos YAML dentro de esos "directorios de roles"? ¡Gracias de nuevo!
smeeb
@smeeb Sí, su rol correcto está definido por archivos dentro de ese directorio. En su mayoría son YAML, pero también pueden contener otros tipos de archivos. Consulte la respuesta actualizada para obtener más detalles.
Yaroslav Admin
36

Playbook vs Role vs [bases de datos] y entradas similares en / etc / ansible / hosts

Los roles son una forma de agrupar tareas en un contenedor. Podría tener un rol para configurar MySQL, otro para configurar Postfix, etc.

Un libro de jugadas define qué está sucediendo y dónde . Este es el lugar donde define los hosts (grupos de hosts, ver más abajo) y los roles que se aplicarán a esos hosts.

[databases]y las otras entradas de su inventario son grupos de host. Los grupos de hosts definen un conjunto de hosts en los que se ejecutará una obra.

Una obra de teatro es un conjunto de tareas o roles (o ambos) dentro de un libro de jugadas. En la mayoría de los casos (y ejemplos), un libro de jugadas contendrá solo una jugada. Pero puedes tener tantos como quieras. Eso significa que podría tener un libro de jugadas que ejecutará el rol postfixen el grupo de host mail_serversy el rol mysqlen el grupo de host databases:

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

Si los Playbooks se definen dentro de los archivos YAML, ¿dónde se definen los roles?

En Ansible casi todo está definido en YAML, eso cuenta para roles y guías.

Aparte de ansible.cfg que se encuentra en el servidor de Ansible, ¿cómo agrego / configuro Ansible con Playbooks / Roles disponibles? Por ejemplo, cuando ejecuto ansible-playbook someplaybook.yaml, ¿cómo sabe Ansible dónde encontrar ese libro de jugadas?

AFAIK, debe proporcionar la ruta al libro de jugadas al invocar ansible-playbook. Entonces ansible-playbook someplaybook.yamlesperaría someplaybook.yamlestar en su directorio actual. Pero puede proporcionar la ruta completa:ansible-playbook /path/to/someplaybook.yaml

udondan
fuente
13

Es una cuestión de terminología / semántica. Puede ser subjetivo, aunque existe una definición básica.

Mi opinión es la siguiente:

Cualquier sistema de implementación / gestión de configuración tiene:

  1. source data - datos utilizados para crear la configuración del host de destino
  2. target data - datos utilizados para identificar hosts de destino
  3. config changes- lista / conjunto de reglas / acciones que aplicamos con source datael host objetivo en función detarget data

En términos de Ansible:

  1. source data- son los varios lugares donde podemos poner datos - group_vars, playbookvars, rolevars, etc., estos lugares afectan la precedencia (si una variable con el mismo nombre se redefine en diferentes ubicaciones, existen reglas muy específicas de cuál sería el valor de la variable durante ansible/ ansible-playbookejecución
  2. target data - es el inventario (¡y también es posible definir variables de inventario / grupo de host dentro del inventario!)
  3. config changes - ansible tiene 4 niveles de abstracción para ello:
    1. tarea - acción única
    2. lista de tareas - lista de acciones
    3. rol: lista de acciones (o lista de listas) agrupadas por el mismo 'tema', generalmente todos los objetivos están operando en el mismo host / grupo de host
    4. libro de jugadas: lista de jugadas, cada una operando en un grupo de host posiblemente diferente, aplicando varias listas de tareas role/ tasks / s (y tareas especiales como handlers)

Desde el aspecto de "software", el rol debe ser lo suficientemente genérico como para ser reutilizado .

También en algunas organizaciones (bastante grandes), los 'roles' son enviados por el grupo A, mientras que se usan en los libros de jugadas mantenidos por el grupo B.

resumen

Todo lo anterior permite agrupar configuraciones similares en un archivo role. agrupando subsistemas / componentes relacionados en uno playbook. Además, vale la pena mencionar, 1 artículo YAML en un libro de jugadas (incluyendo hosts:y uno o tasks, pre_tasks, post_tasks, roles) se llamaplay

Ahora para tu pregunta:

Sí, es confuso al principio.

Por lo general, conecta su source datasemántica con la de su rol, por lo que cuando ve que el rol setup_dbse aplica en una obra de teatro en un grupo de host relacionado (por ejemplo db_hosts), a playpuede estar ejecutándose sobre una unión de varios grupos de host. Es solo una cuestión de convención frente a flexibilidad.

PD

Por favor escríbame si esto contribuyó a la confusión o si se aclaró. Gracias.

mvk_il
fuente
1

También tenga en cuenta que un libro de jugadas puede llamar a más de un rol si se usa un metaarchivo que está destinado a afectar los diferentes roles.

Ejemplo de Playbook: dual_role-playbook.yml

- name: Some Action for two roles
  hosts: localhost

  vars_files:
    - roles/dual_role/meta/main.yml

  roles:
    - dual_role/container-1
    - dual_role/container-2

La carpeta de funciones y el esquema de archivos se verán así:

dual_role-playbook.yml
  -- roles
     -- dual_role
        -- meta/main.yml
        -- container-1
           -- tasks/main.yml
           -- templates/template.j2
        -- container-2
           -- tasks/main.yml
           -- templates/template.j2
José H. Rosa
fuente
0

Simplemente pon:

Un libro de jugadas es como el programa principal, contiene instrucciones completas para terminar el trabajo. Sin embargo, para proyectos grandes, no es deseable poner todos los detalles en él. Entonces necesitas un papel.

Un rol es una subrutina y generalmente logra un objetivo, por ejemplo, configurar un servidor de base de datos. Puede ponerlo en el roles/directorio o descargar roles de terceros proporcionando URI rolesfile.ymly pedirle a ansible-galaxy que los descargue por usted.

El [database]es un grupo de hosts se define en el archivo de inventario que enumera los hosts que pertenecen al databasegrupo. También puede especificar un grupo de servidores web especificando algo como

[web]
web1.example.com
web2.example.com

Agrupar webo databaseluego se puede usar en libros de jugadas o roles para especificar los hosts a aplicar.

Los grupos también se pueden usar en comando ansiblepara ejecutar comandos ad-hoc.

Ding-Yi Chen
fuente