Hace unos días, discutimos cómo configurar un laboratorio Ansible de tres nodos usando Vagrant. en linux En este artículo, aprenderemos en detalle los conceptos fundamentales de Ansible, como el inventario de Ansible y los archivos de configuración.
Estructura básica de Ansible
Cuando comienza a trabajar con ansible, hay dos archivos importantes que debe conocer. Uno es el inventario de Ansible y el segundo es la configuración de Ansible archivo.
La configuración El archivo contiene todas las configuraciones que ansible usará durante el tiempo de ejecución. Cuando instala ansible con el administrador de paquetes del sistema operativo, puede ver que hay un archivo de configuración predeterminado llamado "ansible.cfg
" creado en /etc/ansible
directorio.
El archivo de inventario contiene la dirección IP o la información de DNS sobre la lista de hosts administrados con los que queremos trabajar. Ansible leerá los nombres de host del archivo de inventario y las tareas/juegos se ejecutarán en esos nodos. Los archivos de inventario se pueden crear en ini
, yaml
y json
formatos.
A continuación se muestra la estructura de mi proyecto. Tengo un ansible.cfg
archivo de configuración, un archivo de hosts y un libro de jugadas que está escrito en yaml
formato.
Cuando active el libro de jugadas, ansible leerá la configuración de ansible.cfg
y los detalles del anfitrión del archivo de anfitriones para ejecutar las reproducciones.
[email protected]:~/ansible_project$ tree .
.
├── ansible.cfg
├── hosts
└── playbook.yml
0 directories, 3 files
Hablemos en detalle sobre estos dos archivos y finalmente ejecutaremos algunos comandos adhoc.
Archivo de configuración de Ansible
Ansible usa el archivo de configuración para cargar los parámetros necesarios para ejecutar la tarea de ansible. Si ha instalado ansible mediante el administrador de paquetes , tendrá un ansible.cfg
archivo en /etc/ansible
directorio.
A continuación se muestra el ejemplo de ansible.cfg
archivo.
Ansible buscará el archivo de configuración en el siguiente orden.
ANSIBLE_CONFIG
- variable de entorno
ansible.cfg
- Directorio actual desde donde está ejecutando el comando
.ansible.cfg
- Directorio de inicio de usuarios
/etc/ansible/ansible.cfg
- En /etc/ansible
directorio
Ejecute ansible --version
comando para ver qué archivo de configuración está eligiendo ansible.
$ ansible --version
ansible [core 2.12.3]
config file = /home/vagrant/ansible_project/ansible.cfg
configured module search path = ['/home/vagrant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible
ansible collection location = /home/vagrant/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible
python version = 3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0]
jinja version = 2.10.1
libyaml = True
Creé un directorio de proyecto personalizado y creé un ansible.cfg
expediente. Mi archivo de configuración contiene solo dos propiedades, ubicación de inventario y verificación de clave de host deshabilitada.
[defaults]
inventory = /home/karthick/ansible_project/hosts
host_key_checking = False
Hay toneladas de otras propiedades, pero por el momento puede comenzar a usarlas agregando solo la propiedad "inventario".
Archivo de inventario de Ansible
En el archivo de inventario, proporcionaremos la dirección IP o DNS de los nombres de servidor, dispositivos de red, servicios en la nube o cualquier cosa con la que pueda trabajar ansible.
Los inventarios se pueden escribir en ini
, json
y yaml
y también tiene scripts para convertir un formato de inventario a otros formatos.
De forma predeterminada, puede encontrar un archivo de inventario (hosts) en /etc/ansible
directorio si instaló ansible usando el administrador de paquetes del sistema operativo. Siempre se recomienda crear un directorio de proyecto separado y crear un archivo de inventario y configuración.
La siguiente tabla representa cómo está configurado mi laboratorio ansible. Voy a crear el archivo de inventario para la configuración de este laboratorio y ejecutaré el módulo de ping para demostrar cómo funcionan las cosas en el archivo de inventario.
TIPO DE NODO | NOMBRE DEL NODO | DIRECCIÓN IP | SABOR SO |
Nodo de control | controlador.anslab.com | 192.168.10.3 | ubuntu/focal64 |
Nodo administrado | gestionado1.anslab.com | 192.168.10.4 | ubuntu/focal64 |
Nodo administrado | gestionado2.anslab.com | 192.168.10.5 | ubuntu/focal64 |
Archivo de inventario sin agrupación explícita
El archivo de inventario tiene un concepto llamado agrupación en el que agrupará sus recursos y ejecutará tareas en ese grupo. Tendrá la siguiente estructura.
[group-name]
Resource1
Resource2
....
Resource N
Puede crear el archivo de inventario sin usar grupos. En este caso, Ansible utilizará dos grupos predeterminados "todos" y "desagrupado" .
- TODO EL GRUPO - Todos los recursos que están disponibles en el archivo de inventario de forma predeterminada se asignarán a todos los grupos .
- SIN GRUPO - Los recursos que no forman parte de ningún grupo definido por el usuario se asignarán automáticamente al grupo sin agrupar .
He creado un archivo de inventario sin ningún grupo. Ahora, estos dos nodos estarán en todos los grupos, así como en el grupo no agrupado.
$ cat hosts
managed1.anslab.com
managed2.anslab.com
Puede ejecutar el siguiente comando ansible para verificar la lista de hosts en todos y en el grupo no agrupado.
$ ansible all --list-hosts
hosts (2):
managed1.anslab.com
managed2.anslab.com
$ ansible ungrouped --list-hosts
hosts (2):
managed1.anslab.com
managed2.anslab.com
Archivo de inventario con agrupación
Como se predijo, la agrupación es una excelente manera de organizar sus recursos, por lo que le resultará fácil ejecutar la tarea en el grupo específico. Tengo dos nodos administrados y ejecutan Ubuntu 20.04LTS.
Digamos que quiero agrupar mi archivo de inventario según el tipo de sistema operativo, entonces el archivo de inventario se verá como se muestra a continuación. Aquí ubuntu es el nombre del grupo.
[ubuntu]
managed1.anslab.com
managed2.anslab.com
Las tareas se pueden ejecutar contra este grupo.
$ ansible ubuntu -m ping -o
managed1.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
managed2.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
Si busco el grupo "desagrupado" ahora, no habrá ningún anfitrión.
$ ansible ungrouped --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):
Puede crear tantos grupos como desee en el archivo de inventario y usar los mismos nombres de recursos.
[ubuntu]
managed1.anslab.com
managed2.anslab.com
[dev]
managed1.anslab.com
[test]
managed2.anslab.com
$ ansible ubuntu -m ping -o
$ ansible dev -m ping -o
$ ansible test -m ping -o
Archivo de inventario con rangos
Cuando tiene un patrón de nomenclatura común para sus recursos, puede usar rangos. Eche un vistazo al siguiente ejemplo donde, en lugar de repetir el DNS, he usado el rango para acortarlo.
[ubuntu]
managed[1:2].anslab.com
Archivo de inventario con grupos secundarios
Puede crear un grupo y usar otros nombres de grupo debajo de él. Eche un vistazo al siguiente ejemplo, tengo el grupo ubuntu que tiene los nombres de mi servidor. Creé otro grupo llamado servidor que contiene el grupo ubuntu.
Es importante que agregues :niños al nombre del grupo; de lo contrario, el grupo de servidores tratará "ubuntu " como el nombre del servidor en lugar del nombre del grupo.
[ubuntu]
managed[1:2].anslab.com
[server:children]
ubuntu
Archivo de inventario con variables de host y variables de grupo
El archivo de inventario admite variables de host y grupo. Las variables del host no son más que variables y sus valores se pasan al host en el archivo de inventario. En la siguiente configuración, le digo a ansible que use ostechnix como mi usuario y en lugar de usar el puerto ssh estándar, use puerto 2222 .
[ubuntu]
managed1.anslab.com ansible_user=ostechnix ansible_port=2222
managed2.anslab.com ansible_user=ostechnix ansible_port=2222
Group vars es lo mismo que host vars, pero las variables se aplicarán a todo el grupo en lugar de a un solo host. Puede ver en la configuración anterior, ansible_user y ansible_port son iguales para ambos nodos. Entonces puede crear un grupo var donde las variables serán heredadas por todos los nodos del grupo. Debe agregar :vars para hacer el grupo como grupo vars.
[ubuntu]
managed1.anslab.com
managed2.anslab.com
[ubuntu:vars]
ansible_user=ostechnix
ansible_port=2222
Aviso: Cuando tiene una variable de grupo y una variable de host para el mismo nodo, entonces la variable de host tiene una prioridad alta.
Hay muchos parámetros de inventario que puede usar y puede obtener la lista del documento oficial .
Archivo de inventario con alias
Puede crear un alias para el recurso como se muestra a continuación. Aquí m1 y m2 son alias.
[ubuntu]
m1 ansible_host=managed1.anslab.com
m2 ansible_host=managed2.anslab.com
Ahora este alias se puede usar para ejecutar algunas tareas.
$ ansible m1 -m ping -o
m1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
$ ansible m2 -m ping -o
m2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
Archivo de inventario en formato YAML
Los archivos de inventario también se pueden escribir en formato YAML. Todo lo que hemos discutido en las secciones anteriores está escrito en formato YAML.
La siguiente imagen representa dos nodos con un par de variables de host.
La imagen de abajo representa dos nodos con variables de grupo.
Comando de inventario de Ansible
Ansible tiene un comando de inventario que será muy útil para ver la información de los archivos de inventario.
Para obtener la lista de opciones admitidas, ejecute el comando de ayuda.
$ ansible-inventory --help
Para obtener los detalles del inventario en formato gráfico, use --graph
bandera. Si tiene diferentes archivos de inventario, puede usar -i
bandera para apuntar explícitamente al archivo de inventario.
$ ansible-inventory --graph
Puede imprimir la información de var del host y del grupo pasando --vars
bandera junto con --graph
bandera.
$ ansible-inventory --graph --vars
Cuando usas la --list
flag, la salida estará en formato JSON.
$ ansible-inventory -list
Puede obtener información sobre un nodo en particular usando --host
bandera.
$ ansible-inventory --host managed1.anslab.com
Conclusión
En este artículo, hemos visto un concepto importante que forma el núcleo de la arquitectura ansible. Si es un principiante, concéntrese en crear el inventario con formato ini y, en el futuro, conocerá más sobre las mejores prácticas cuando comience a trabajar en proyectos de producción.
Leer a continuación:
- Autenticación SSH de Ansible y escalada de privilegios
- Introducción a los comandos ad hoc de Ansible