Passer Ansible variables d'un rôle (s'exécutant sur un hôte) à un autre rôle en cours d'exécution sur un autre hôte dans le même système de jeu
J'ai un playbook qui s'exécute différents rôles sur des hôtes différents.
Est-il possible de passer une variable à partir d'un rôle d'exécutant sur un hôte à un autre rôle sur un autre ordinateur hôte exécutant dans le même système de jeu exécuter? Ou de toute solution de contournement ?
playbook
host1
role1
here I get some variables: var1 var2 ...etc
host2
role2
here I need to use var1 var2 ... etc from the above host/role
La tâche dans role1 qui définit la variable db
ressemble à ceci:
- shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/'{print $4}' | awk -F? '{print $1}'
register: db
Mise à JOUR: Sur le premier hôte les valeurs sont dynamiques, c'est comme un fichier de configuration qui est toujours mis à jour. Après je stocker les valeurs dans des variables sur host1 avec le role1 je puis passer à la host2, exécutez la role2 et faire des trucs avec les valeurs de variables stockées par host1.
J'ai essayé avec hostvars:
{{ hostvars.LBL.db.stdout }}
{{ hostvars['LBL']['db'] }}
{{ hostvars['LBL']['db']['stdout'] }}
et je reçois l'erreur:
in get_variables raise Exception("host not found: %s" % hostname) Exception: host not found: LBL
LBL existe dans d'hôtes que sur elle je lance le premier rôle
J'ai mis une variable sur un hôte et je veux que la variable à la disposition de l'autre hôte. Tout cela dans un seul playbook. Peut-il être fait ?
hostvars ne fonctionne pas à l'utiliser comme ceci:
---
- name: test hostvars host1
hosts: LBL
tasks:
- command: "ls /bin"
register: ls_out
- name: test hostvars host2
hosts: LM
tasks:
- debug:
var: "{{ hostvars['LBL']['ls_out']['stdout'] }}"
erreur:
fatal: [10.104.148.138] => host not found: LBL
/etc/ansible/hosts
[root@NS1 ansible]# cat /etc/ansible/hosts
[LBL]
10.104.148.136
[LM]
10.104.148.138
hostvars.LBL.*
devraient ai travaillé. Si le var1/2 sont définis dans le fichier d'inventaire, puis poster aussi.C'est le premier rôle
- name: bla bla shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/ '{print $4}' | awk -F? '{print $1}' register: db
Si je fais l'echo {{ n'.stdout }} dans le même rôle, il fonctionne très bien. Je n'utilise pas d'un inventaire. Dans le deuxième rôle si je ne shell: echo "{{ hostvars['LBL']['db']['stdout'] }}"
il donne l'erreur"hostvars ne fonctionne pas à l'utiliser comme ceci:" ce n'est pas possible. Ces deux tâches fonctionnent très bien pour moi et imprimer
ls_out
comme prévu. Posté mauvais code ou quelque chose...? Veuillez elborate sur "pas de travail"J'ai ajouté la sortie de ce single playbook à la question ci-dessus. Ansible version est 1.9.0.1 ... même sortie pour 1.8.4
OriginalL'auteur ady8531 | 2015-03-31
Vous devez vous connecter pour publier un commentaire.
Le problème est dans votre inventaire.
Ce message:
est parce que
LBL
est un groupe et non d'un hôte. GroupeLBL
a un hôte:10.104.148.136
Effectuez l'une des opérations suivantes:
1. Changer votre inventaire (
/etc/ansible/hosts
):2. ou si vous savez vraiment ce que vous faites et
LBL
est un groupe et vous voulez le garder de cette façon ensuite accéder à la variable avec:Nouveau LBL est un groupe qui n'est pas un hôte. Plus d'infos.
[ow.hosts] LBL LM
, et ça fonctionne. merci beaucoup!est-il possible d'utiliser quelque chose de similaire à ceci:
with_items: "{{ hostvars['LBL']['db_*'] }}"
pour une boucle ? Exemple: sur LBL hôte-je stocker des variables nommées: db_ace, db_abc etc. Comment puis-je les appeler à l'intérieur d'une boucle à partir d'un autre hébergeur? hostvars.LBL.db_* ?rien que du haut de ma tête.. vérifier si il y a quelques Jinja2 un filtre à la liste.. Si il y a ensuite, vous pourrez filtrer
hostvars['LBL'].keys()
, l'affecter à une autre variable à l'aide deset_fact
ou dansvars:
la section..OriginalL'auteur Kashyap
Ce sujet est compliqué, et il y a deux réponses différentes en fonction de ce que vous voulez.
L'accès à une variable définie dans un rôle à l'intérieur d'autres pour le même hôte
Exemple:
Objectif: Vous souhaitez accéder à certaines variables de role1 à l'intérieur de role2.
Utilisation
set_fact
module.À l'intérieur de role1:
À l'intérieur de role2:
L'accès à une variable statique pour un hôte (ou un groupe) à d'autres
Exemple:
group_vars/group_foo
Objectif: Vous voulez l'utiliser dans le playbook pour le groupe2.
C'est beaucoup plus compliqué à faire.
À l'intérieur de group_vars/group_bar
Vous pouvez utiliser d'autres indices en plus de '0'.
vous pouvez set_fact dans un playbook et que l'accès à bien
hostvars: {{ hostvars['serv1']['saved_fact'] }}
--- - name: test hostvars host1 hosts: LBL tasks: - shell: echo hostname register: ls_out - set_fact: ls_down='{{ ls_out.stdout }}' - name: test hostvars host2 hosts: LM tasks: - shell: echo {{ hostvars['LBL']['ls_down'] }}
erreur:fatal: [10.104.148.138] => host not found: LBL
vous aide set_fact mal. Il ne prend foo=bar de la notation, il demande une liste des dicts. Voir les exemples ici: docs.ansible.com/set_fact_module.html. Ici exemple de travail pour le code ci-dessus: gist.github.com/amarao/5ebe4d9c2fd04dfaf287
Merci pour une bonne suggestion quant à la façon de jeter un regard à shiroi pantsu. 😛
OriginalL'auteur George Shuklin
Voici ma solution. Ma tâche était de synchronisation des données entre deux serveurs, et je voulais passer dans les noms de serveur comme ceci: ansible-playbook de synchronisation.yaml -e "source=host1 destination=host2"
Voici les principaux playbook:
Voici la set_sync_facts rôle:
(En fait, je dérivées certaines de ces tâches et d'autres à partir de l'hôte de vars, mais vous obtenez le point)
Et voici le get_sync_facts rôle:
Vous pourriez le faire sans cela et juste référence hostvars directement dans vos pièces, mais cela semblait plus facile à maintenir car il correspond directement avec le set_sync_facts rôle.
fatal: [1.2.3.4]: FAILED! => {"failed": true, "msg": "'ansible.vars.hostvars.HostVars object' has no attribute u'source'"}
où la source est mon var (par exemple, mise en scène). Dans mon premier jeu, j'ai fini avec unset_fact: blah={{somvar}}
et dans le deuxième jeu, j'ai commencer par faireset_fact: blah={{hostvars[source][blah]}}
. Ce que je fais mal?Ah, j'ai fait l'erreur de littéralement en passant
staging
à lahostvars
. Sous-évaluées touthostvars
structure et vu que c'est organisé (évidemment) par le nom d'hôte. Donne-moi quelque chose à travailler avec, cependant, je pourrais avoir à changer mon inventaire de regroupement comme je ne peux pas garantir questaging[0]
par exemple, seront toujours pertinentes hôte de site web (qui peut être un nœud db). Comment est votre inventaire si vous n'avez pas l'esprit de me demander?Mon inventaire est entièrement dynamique. J'appelle un script python qui retourne tous mes hôtes puis-je faire quelque chose comme: ansible-playbook -je dynamic_inventory/get_hosts playbook.yaml -e "groupe=${DESTINATION} ${SOURCE}"
Merci. J'ai fini par la restructuration de ma statique inventaire pour les environnements distincts, et le rôle et sélectionnez avec :les enfants en cas de besoin. Ensuite, j'ai fais deux vars
-e source=[source_group]
et-e target=[target_group]
puis configuration d'hôtes dans le playbook comme{{source}}-web
par exemple.OriginalL'auteur Andy Baker
il est assez vieux sujet, mais il sera peut-être utile à quelqu'un. J'ai utilisé sed pour obtenir le nom d'hôte basé sur la "cible" spécifié dans les paramètres supplémentaires.
À utiliser ce groupe "cible" ne doit contenir que 1 nom d'hôte.
Mon inventaire hôtes:
upgrade_packages.yml
Invoquer avec:
ansible-playbook ./upgrade-packages.yml -e "target=machine1" -v
fail:
module au lieu de /bin/false.OriginalL'auteur Quoing
J'ai eu un semblable de l'installation où il y a trois hôtes h1,h2,h3 et sur chacun d'eux, j'ai voulu définir un fait
{ "important_fact": "foo" }
(et la barre, et baz, respectivement)Pour obtenir une liste contenant tous les différents important_facts sur tous les hôtes, vous pouvez le faire comme ceci:
important_facts_list
contiendra[ 'foo', 'bar', 'baz' ]
, et vous pouvez maintenant effectuer une itération sur eux à l'aide dewith_items
.OriginalL'auteur Johannes Meixner