Introducción
Un playbook reutilizable debería consumir datos del entorno en lugar de codificar de forma fija respuestas separadas para desarrollo y producción. La selección del inventario, el alcance de las variables y los datos recopilados del destino determinan qué recibe cada nodo.
Usarás dos inventarios que seleccionan nodos SSH distintos, guardarás datos de grupo y host junto a cada fuente y generarás ajustes con un único playbook. También aplicarás un valor temporal mediante una variable extra y restablecerás una configuración de referencia estable.
Separar los datos del inventario por entorno
En este paso, darás a desarrollo y producción fuentes de inventario separadas y valores distintos de variables de grupo.
Entra en el proyecto:
cd /home/labex/project
El laboratorio proporciona dos inventarios pequeños. Lee cada uno antes de ejecutar la automatización:
cat inventories/dev/hosts.ini
cat inventories/prod/hosts.ini
El grupo app de dev contiene web1; el grupo app de prod contiene web2. Sus direcciones y ajustes SSH están preparados. Son nodos realmente distintos, no dos nombres para localhost.
-i selecciona una fuente de inventario para esta invocación y tiene prioridad sobre el inventario predeterminado del proyecto. Previsualiza cada entorno por separado:
ansible app -i inventories/dev/hosts.ini --list-hosts
ansible app -i inventories/prod/hosts.ini --list-hosts
Deberías obtener web1 para dev y web2 para prod. No combines estas dos fuentes para simular entornos aislados: las fuentes pueden fusionarse y un mismo nombre de host del inventario sigue identificando un único host. Mantén explícita la invocación de cada entorno.
Una variable es un valor con nombre que consume la automatización. Un mapa YAML usa líneas name: value. Ansible carga group_vars/app.yml junto a un inventario para su grupo app. Crea datos distintos para el mismo nombre de grupo en cada entorno:
cat > inventories/dev/group_vars/app.yml <<'EOF'
environment_label: development
release_channel: preview
EOF
cat > inventories/prod/group_vars/app.yml <<'EOF'
environment_label: production
release_channel: stable
EOF
Inspecciona los datos resueltos del inventario. --list devuelve JSON, incluido un objeto _meta.hostvars para los valores de los hosts:
ansible-inventory -i inventories/dev/hosts.ini --list
ansible-inventory -i inventories/prod/hosts.ini --list
El host dev debería resolver development/preview; el host prod, production/stable. Un archivo de variables solo tiene valor cuando el inventario y el grupo previstos lo cargan realmente.
Consumir variables de host y datos reales recopilados
En este paso, sobrescribirás el valor de grupo de un host y generarás ajustes administrados reales con los datos del entorno.
Un archivo bajo host_vars lleva el nombre de un host del inventario. Para el mismo host y la misma clave, su variable de host tiene prioridad sobre la variable de grupo utilizada aquí. Da al host canary de desarrollo un canal de versiones específico del host:
cat > inventories/dev/host_vars/web1.yml <<'EOF'
release_channel: canary
EOF
Desarrollo sigue teniendo environment_label development, pero web1 ahora resuelve release_channel canary. Producción permanece en stable. Confirma la resolución de dev:
ansible-inventory -i inventories/dev/hosts.ini --list
Escribe un playbook reutilizable para cualquiera de los dos inventarios:
cat > deploy-info.yml <<'EOF'
- name: Configure environment-specific application settings
hosts: app
gather_facts: true
vars:
banner_prefix: Managed environment
tasks:
- name: Write settings from variables and facts
ansible.builtin.copy:
dest: /home/automation/app-settings.conf
content: |
[application]
environment={{ environment_label }}
channel={{ release_channel }}
host={{ inventory_hostname }}
distribution={{ ansible_facts.distribution }}
label={{ banner_prefix }}
mode: "0640"
EOF
vars define un valor a nivel de play, banner_prefix. Dentro del contenido de copy, {{ variable_name }} inserta un valor durante la ejecución. Es una sustitución básica de valores; en un laboratorio posterior administrarás plantillas Jinja independientes.
El | de YAML conserva el contenido indentado siguiente como texto de varias líneas, incluido su salto de línea final. inventory_hostname es el nombre del host actual en el inventario. Con gather_facts true, Ansible recopila datos del destino antes de las tareas; ansible_facts.distribution proporciona la distribución real del sistema operativo. Es un dato del destino, no un dato sobre el controlador.
Comprueba la sintaxis y después ejecuta el mismo playbook por separado para cada entorno:
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --syntax-check
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml
Lee ambos archivos reales mediante sus inventarios respectivos:
ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
ansible app -i inventories/prod/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
Desarrollo debería contener environment=development, channel=canary y host=web1. Producción debería contener environment=production, channel=stable y host=web2. Ambos deberían contener distribution=Ubuntu y label=Managed environment. El playbook compartido produjo contenido distinto en los destinos al consumir datos distintos.
Sobrescribir un valor en una invocación y restablecer la configuración de referencia
En este paso, usarás una variable extra sin editar los datos guardados del inventario y después volverás a una configuración de referencia convergente.
-e proporciona una variable extra para esta ejecución. Tiene prioridad sobre los valores de grupo y host demostrados aquí. Selecciona temporalmente un canal hotfix únicamente en desarrollo:
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml -e release_channel=hotfix
Lee la configuración dev resultante:
ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
Su canal debería ser hotfix. -e no editó los archivos de origen group_vars y host_vars, y producción no fue seleccionada.
Ejecuta sin la variable extra para restablecer el canal canary guardado de web1:
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
Ahora previsualiza ambos entornos con sus configuraciones de referencia:
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --check
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml --check
Cada host seleccionado debería informar de cero cambios pendientes y ningún resultado de fallo o inaccesibilidad. Las relaciones limitadas de precedencia practicadas aquí son los datos de grupo, un valor de host que los sobrescribe y una variable extra que sobrescribe el valor. Las reglas de precedencia más complejas quedan fuera de este ejercicio.
Resumen
Has seleccionado inventarios de entornos distintos, cargado datos de grupo, aplicado un valor específico del host que sobrescribe el del grupo y generado contenido con datos reales del destino usando un playbook compartido. Una variable extra temporal cambió una invocación, y las ejecuciones posteriores con los valores de referencia devolvieron ambos entornos a ajustes declarados estables.


