playbook modules group_vars example ansible ansible-inventory

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 .