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