Ansible - inventaire des hôtes et des variables de groupe vars/tous les fichiers

j'ai un doute factice qui me retient longtemps. J'ai un très banal fichier d'inventaire avec les hôtes et les 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

le problème est que j'ai besoin d'accéder à tous ces hôtes et variables, dans le fichier d'inventaire, à partir du fichier group_vars/all.

j'ai essayé les manières suivantes pour accéder à L'IP hôte:

{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars['lb'] }}"
{{ hostvars[lb] }}

Pour accéder à une variable hôte, j'ai essayé:

"{{ hostvars[tests].['data_base_host'] }}"

ils ont tous tort!!! Quelqu'un peut-il m'aider à trouver le meilleure pratique pour accéder aux hôtes et aux variables, pas à partir d'un playbook mais à partir d'un fichier de variables?

EDIT:

Ok. Nous allons préciser.

Problème: utiliser un hôte déclaré dans le fichier d'inventaire dans un fichier variable, disons: group_vars/all.

Exemple: j'ai un hôte DB avec IP:10.112.83.37.

fichier d'Inventaire:

[db]
10.112.83.37

dans le groupe: vars / tous les fichiers Je veux utiliser cette IP pour construire un variable.

group_vars/tous les fichiers:

data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb

dans un template j'utilise la variable construite dans le fichier group_vars/all.

fichier de Modèle:

oracle_url = {{ data_base_url }}

le problème est que Le {{ db }} la variable du fichier group_vars/all n'est pas remplacée par L'IP hôte DB. L'utilisateur ne peut modifier le fichier de stock.

23
demandé sur freginold 2014-02-20 16:51:33

6 réponses

- name: host
   debug: msg="{{ item }}" 
   with_items:
    - "{{ groups['tests'] }}"

Ce bout de code va donner le message:

'10.112.84.122'
'10.112.84.124'

groups['tests'] fondamentalement retourner une liste d'adresses ip uniques ['10.112.84.122','10.112.84.124'] alors que groups['tomcat'][0] retourne 10.112.84.124.

23
répondu eldos 2017-03-31 22:33:55

si vous voulez accéder programmatiquement aux entrées d'inventaire pour les inclure dans une tâche par exemple. Vous pouvez vous référer à elle comme ceci:

{{ hostvars.tomcat }}

ceci vous renvoie une structure avec toutes les variables liées à cet hôte. Si vous voulez juste une adresse IP( ou un nom d'hôte), vous pouvez vous y référer comme ceci:

{{ hostvars.jboss5.ansible_ssh_host }}

Voici une liste de variables auxquelles vous pouvez vous référer:cliquez sur. De plus, vous pouvez déclarer une variable et la définir avec par exemple le résultat de une étape dans un livre de jeu.

- name: Change owner and group of some file
  file: path=/tmp/my-file owner=new-owner group=new-group
  register: chown_result

Ensuite, si vous jouez cette étape sur tomcat, vous pouvez y accéder à partir de jboss5 comme ceci:

- name: Print out the result of chown
  debug: msg="{{ hostvars.tomcat.chown_result }}"
20
répondu wpodgorski 2014-08-20 16:28:45

Juste au cas où si le problème est toujours là, Vous pouvez vous référer à l'inventaire possible par ‘hostvars’,‘group_names’ et ‘groups’ ansible variables.

Exemple:

pour obtenir les adresses ip de tous les serveurs du groupe "mygroup", utilisez la construction suivante:

- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}" 
  with_items:
     - "{{ groups['mygroup'] }}"
14
répondu nixlike 2015-09-28 13:17:52

Oui l'exemple de nixlike fonctionne très bien.

Inventaire:

[docker-host]
myhost1 user=barbara
myhost2 user=heather

playbook:

---

- 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'] }}"

sortie:

ansible-playbook ansible/tests / vars-test-local.yml

PLAY [localhost]


tâche [setup] ******************************************************************* ok: [localhost]

tâche [débogage en boucle des noms d'hôtes de l'inventaire] ****************************************** ok: [localhost] => (élément=myhost2) => { "item": "myhost2", "msg": "le docker hôte est myhost2",} ok: [localhost] => (élément=myhost1) => { "item": "myhost1", "msg": "le docker hôte est myhost1" }

tâche [débogage en boucle] ******************************************************** ok: [localhost] => (élément=myhost1) => { "item": "myhost1", "msg": "le docker hôte est barbara",} ok: [localhost] => (item=myhost2) => { "item": "myhost2", "msg": "le docker hôte est heather" }

RÉCAPITULATION DU JEU ********************************************************************* localhost : ok=3 changé=0 inaccessible=0

echec=0

merci!

1
répondu nettie 2017-01-19 15:54:29

compte tenu de votre exemple précédent:

fichier d'inventaire:

[db]
10.112.83.37

group_vars/

data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb

fichier de modèle:

oracle_url = {{ data_base_url }}

Vous pouvez remplacer votre group_vars/tous

data_base_url="jdbc:oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb"
0
répondu Antonio Pérez 2016-09-27 11:06:38

si vous voulez avoir vos vars dans des fichiers sous group_vars, déplacez-les ici. Vars peut être dans l'inventaire ([groupe: vars] section) mais aussi (et surtout) dans les fichiers sous group_vars ou hosts_vars.

Par exemple, avec votre exemple ci-dessus, vous pouvez déplacer votre vars pour le groupe tests dans le fichier group_vars/tests:

fichier d'Inventaire :

[lb]
10.112.84.122

[tomcat]
10.112.84.124

[jboss5]
10.112.84.122

...

[tests:children]
lb
tomcat
jboss5

[default:children]
tests

group_vars/tests fichier :

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
-1
répondu leucos 2015-09-28 13:02:03