web-dev-qa-db-fra.com

Ansible - lit les hôtes et les variables d'inventaire dans group_vars / all file

J'ai un doute factice qui me tient coincé pendant longtemps. J'ai un fichier d'inventaire très banal avec des hôtes et des 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 je dois 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 d'accéder à l'hôte IP:

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

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

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

Tous ont tort !!! Quelqu'un peut-il m'aider à trouver la meilleure pratique pour accéder aux hôtes et aux variables, non pas d'un livre de jeu, mais d'un fichier de variables?

EDIT:

D'accord. Clarifions.

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

Exemple: J'ai un hôte de base de données avec IP:10.112.83.37.

Fichier d'inventaire:

[db]
10.112.83.37

Dans le groupe: vars/all file, je souhaite utiliser cette adresse IP pour créer une variable.

group_vars/all file:

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

Dans un modèle, j'utilise la variable intégrée au 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’adresse IP de l’hôte de base de données. L'utilisateur peut uniquement modifier le fichier d'inventaire.

25
Tiago Sousa
- name: Host
   debug: msg="{{ item }}" 
   with_items:
    - "{{ groups['tests'] }}"

Ce morceau de code donnera le message:

'10.112.84.122'
'10.112.84.124'

comme groups['tests'] _ renvoie en gros une liste d’adresses IP uniques ['10.112.84.122','10.112.84.124'] tandis que groups['Tomcat'][0] résultats 10.112.84.124.

27
eldos

Si vous souhaitez accéder par programme aux entrées d'inventaire, vous devez les inclure dans une tâche, par exemple. Vous pouvez vous y référer comme ceci:

{{ hostvars.Tomcat }}

Cela vous renvoie une structure avec toutes les variables liées à cet hôte. Si vous voulez juste une adresse IP (ou 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: click . De plus, vous pouvez déclarer une variable et la définir avec, par exemple, le résultat d'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 depuis jboss5 comme ça:

- name: Print out the result of chown
  debug: msg="{{ hostvars.Tomcat.chown_result }}"
20
wpodgorski

Juste au cas où le problème persiste, vous pouvez vous référer à l'inventaire ansible via ‘hostvars’, ‘group_names’, et ‘groups’ variables ansibles.

Exemple:

Pour pouvoir obtenir les adresses IP de tous les serveurs du groupe "mygroup", utilisez la construction ci-dessous:

- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}" 
  with_items:
     - "{{ groups['mygroup'] }}"
14
odzhu

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

JOUER [localhost]


TÂCHE [configuration] ******************************************** ********************* ok: [hôte local]

TÂCHE [noms d'hôtes de l'inventaire de débogage en boucle] ***************************************** ok : [localhost] => (item = myhost2) => {"item": "myhost2", "msg": "l'hôte de menu fixe est myhost2"} ok: [localhost] => (item = myhost1) => {" item ":" myhost1 "," msg ":" l'hôte de menu fixe est myhost1 "}

TÂCHE [éléments de débogage en boucle] ******************************************* ************ ok: [localhost] => (item = myhost1) => {"item": "myhost1", "msg": "l'hôte de menu fixe est barbara"} ok: [ localhost] => (item = myhost2) => {"item": "myhost2", "msg": "l'hôte de docker est heather"}

PLAY RECAP *********************************************** ********************* localhost: ok = 3 changé = 0 inaccessible = 0
a échoué = 0

merci!

3
nettie

Compte tenu de votre exemple précédent:

fichier d'inventaire:

[db]
10.112.83.37

group_vars/all

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

fichier modèle:

Oracle_url = {{ data_base_url }}

Vous voudrez peut-être remplacer vos group_vars/all par

data_base_url="jdbc:Oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb"
2
Antonio Pérez