modules - Ansible: lee los hosts y las variables de inventario en group_vars/all file
ansible playbook hosts (6)
Tengo una duda falsa que me mantiene estancado durante mucho tiempo. Tengo un archivo de inventario muy banal con hosts y variables:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
tests
[tests:vars]
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb
El problema es que necesito acceder a todos estos hosts y variables, en el archivo de inventario, desde el archivo group_vars / all.
He intentado los siguientes modales para acceder a la IP del host:
{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars[''lb''] }}"
{{ hostvars[lb] }}
Para acceder a una variable de host intenté:
"{{ hostvars[tests].[''data_base_host''] }}"
Todos ellos están equivocados !!! ¿Puede alguien ayudarme a encontrar la mejor práctica para acceder a hosts y variables, no desde un libro de jugadas sino desde un archivo de variables?
EDITAR:
De acuerdo. Vamos a aclarar.
Problema: use un host declarado en el archivo de inventario en un archivo variable, digamos: group_vars / all.
Ejemplo: Tengo un host DB con IP:10.112.83.37
.
Archivo de inventario:
[db]
10.112.83.37
En el grupo: vars / all file quiero usar esa IP para construir una variable.
group_vars / all file:
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
En una plantilla utilizo la variable incorporada en el archivo group_vars / all.
Archivo de plantilla:
oracle_url = {{ data_base_url }}
El problema es que la variable {{ db }}
en el group_vars / all file no es reemplazada por la IP del host DB. El usuario solo puede editar el archivo de inventario.
En caso de que el problema ''hostvars''
, puede consultar el inventario disponible a través de ''hostvars''
, ''group_names''
y ''groups''
.
Ejemplo:
Para poder obtener las direcciones IP de todos los servidores dentro del grupo "mi grupo", use la siguiente construcción:
- debug: msg="{{ hostvars[item][''ansible_eth0''][''ipv4''][''address''] }}"
with_items:
- "{{ groups[''mygroup''] }}"
Sí, el ejemplo de nixlike funciona muy bien.
Inventario:
[docker-host]
myhost1 user=barbara
myhost2 user=heather
libro de jugadas:
---
- hosts: localhost
connection: local
tasks:
- name: loop debug inventory hostnames
debug:
msg: "the docker host is {{ item }}"
with_inventory_hostnames: docker-host
- name: loop debug items
debug:
msg: "the docker host is {{ hostvars[item][''user''] }}"
with_items: "{{ groups[''docker-host''] }}"
salida:
ansible-playbook ansible / tests / vars-test-local.yml
PLAY [localhost]
TAREA [configuración] ********************************************** ********************* ok: [localhost]
TAREA [nombres de host de inventario de depuración de bucle] ****************************************** ok : [localhost] => (item = myhost2) => {"item": "myhost2", "msg": "el host docker es myhost2"} ok: [localhost] => (item = myhost1) => {" item ":" myhost1 "," msg ":" el host de la ventana acoplable es myhost1 "}
TAREA [elementos de depuración de bucle] ******************************************** ************ ok: [localhost] => (item = myhost1) => {"item": "myhost1", "msg": "el host docker es barbara"} ok: [ localhost] => (item = myhost2) => {"item": "myhost2", "msg": "el host de la ventana acoplable es heather"}
PLAY RECAP ************************************************ ********************* localhost: ok = 3 cambiado = 0 inalcanzable = 0
fallido = 0
¡Gracias!
Si desea acceder a las entradas de inventario mediante programación para incluirlas en una tarea, por ejemplo. Puedes referirte a esto así:
{{ hostvars.tomcat }}
Esto le devuelve una estructura con todas las variables relacionadas con ese host. Si solo desea una dirección IP (o nombre de host), puede referirse a ella así:
{{ hostvars.jboss5.ansible_ssh_host }}
Aquí hay una lista de variables a las que puede referirse: click . Además, puede declarar una variable y establecerla con, por ejemplo, el resultado de algún paso en un libro de jugadas.
- name: Change owner and group of some file
file: path=/tmp/my-file owner=new-owner group=new-group
register: chown_result
Luego, si juegas este paso en tomcat
, puedes acceder desde jboss5
esta manera:
- name: Print out the result of chown
debug: msg="{{ hostvars.tomcat.chown_result }}"
Si desea tener sus vars en archivos bajo group_vars, simplemente muévalos aquí. Los vars pueden estar en el inventario (sección [ group : vars]) pero también (y principalmente) en archivos bajo group_vars
o hosts_vars
.
Por ejemplo, con su ejemplo anterior, puede mover sus variables para tests
grupo en el archivo group_vars/tests
:
Archivo de inventario:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
tests
archivo de group_vars/tests
:
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb
Teniendo en cuenta tu ejemplo anterior:
archivo de inventario:
[db]
10.112.83.37
group_vars / all
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
archivo de plantilla:
oracle_url = {{ data_base_url }}
Es posible que desee reemplazar sus group_vars / all con
data_base_url="jdbc:oracle:thin:@{{ groups[''db''][0] }}:1521/ssdenwdb"
- name: host
debug: msg="{{ item }}"
with_items:
- "{{ groups[''tests''] }}"
Esta pieza de código dará el mensaje:
''10.112.84.122''
''10.112.84.124''
como groups[''tests'']
básicamente devuelven una lista de direcciones ip únicas [''10.112.84.122'',''10.112.84.124'']
mientras que los groups[''tomcat''][0]
devuelven 10.112.84.124
.