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/hosts
archivo 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.cfg
vivir en el servidor de Ansible, ¿cómo agrego / configuro Ansible con Playbooks / Roles disponibles? Por ejemplo, cuando corroansible-playbook someplaybook.yaml
, ¿cómo sabe Ansible dónde encontrar ese libro de jugadas?
fuente
tasks
hacer cosas.playbooks
organizar y lanzar tareas.roles
organizar grupos de tareas, manipuladores, etc. que realizan una función particular. Seplaybook
necesita algo para iniciar elrole
(los). ¿Cómo llamarías una colección deroles
yplaybooks
? Digamos, por ejemplo, uno que gestiona la configuración de todos los hosts de su sitio.Respuestas:
[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:
site.yml
,webservers.yml
,fooservers.yml
Son libros de jugadas.roles/common/
yroles/webservers/
contienen definicionescommon
ywebservers
roles en consecuencia.Dentro del libro de jugadas (
webservers.yml
) tienes algo como: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: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.Buscará un libro de jugadas dentro del directorio actual.
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.
fuente
webservers.yml
libro de jugadas asigna los[webservers]
anfitriones al rolcommon
ywebservers
. Pero, ¿qué se incluye exactamente con elcommon
papel? No hay forma de definir eso en los directorios, entonces, ¿hay típicamente archivos YAML dentro de esos "directorios de roles"? ¡Gracias de nuevo!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
postfix
en el grupo de hostmail_servers
y el rolmysql
en el grupo de hostdatabases
:En Ansible casi todo está definido en YAML, eso cuenta para roles y guías.
AFAIK, debe proporcionar la ruta al libro de jugadas al invocar
ansible-playbook
. Entoncesansible-playbook someplaybook.yaml
esperaríasomeplaybook.yaml
estar en su directorio actual. Pero puede proporcionar la ruta completa:ansible-playbook /path/to/someplaybook.yaml
fuente
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:
source data
- datos utilizados para crear la configuración del host de destinotarget data
- datos utilizados para identificar hosts de destinoconfig changes
- lista / conjunto de reglas / acciones que aplicamos consource data
el host objetivo en función detarget data
En términos de Ansible:
source data
- son los varios lugares donde podemos poner datos -group_vars
,playbook
vars,role
vars, 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 duranteansible
/ansible-playbook
ejecucióntarget data
- es el inventario (¡y también es posible definir variables de inventario / grupo de host dentro del inventario!)config changes
- ansible tiene 4 niveles de abstracción para ello:role
/task
s / s (y tareas especiales comohandlers
)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 unoplaybook
. Además, vale la pena mencionar, 1 artículo YAML en un libro de jugadas (incluyendohosts:
y uno otasks
,pre_tasks
,post_tasks
,roles
) se llamaplay
Ahora para tu pregunta:
Sí, es confuso al principio.
Por lo general, conecta su
source data
semántica con la de su rol, por lo que cuando ve que el rolsetup_db
se aplica en una obra de teatro en un grupo de host relacionado (por ejemplodb_hosts
), aplay
puede 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.
fuente
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
La carpeta de funciones y el esquema de archivos se verán así:
fuente
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 URIrolesfile.yml
y 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 aldatabase
grupo. También puede especificar un grupo de servidores web especificando algo comoAgrupar
web
odatabase
luego se puede usar en libros de jugadas o roles para especificar los hosts a aplicar.Los grupos también se pueden usar en comando
ansible
para ejecutar comandos ad-hoc.fuente