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