Ansible - with_dict: dictionnaire - Comment utiliser les variables définies dans chaque dictionnaire, qui dépend d'autres
Environnement: Ansible 1.9.2, CentOS 6.5
J'ai créé un rôle de télécharger JAVA (.tar.gz) artefact fichiers pour 3 différentes versions de JAVA à partir de Artifactory. Je suis en train d'utiliser Ansible est with_dict fonction (au lieu d'utiliser with_items).
Créé les fichiers suivants:
$ cat rôles/java/defaults/main.yml
---
java_versions:
java7_60:
version: 1.7.60
group_path: com/oracle/jdk
classifier: linux-x64
ext: tar.gz
dist_file: "jdk-{{ version }}-{{ classifier }}-{{ ext }}"
# dist_file: "jdk-{{item.value.version }}-{{ item.value.classifier }}-{{ item.value.ext }}"
dist_url: "{{ artifactory_url }}/{{ group_path }}/{{ version }}/{{ dist_file }}"
# dist_url: "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/{{ dist_file }}"
java7_67:
version: 1.7.67
group_path: com/oracle/jdk
classifier: linux-x64
ext: tar.gz
dist_file: "jdk-{{item.value.version }}-{{ item.value.classifier }}-{{ item.value.ext }}"
dist_url: "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/{{ dist_file }}"
java8_45:
version: 1.8.45
group_path: com/oracle/jdk
classifier: linux-x64
ext: tar.gz
dist_file: "jdk-{{item.value.version }}-{{ item.value.classifier }}-{{ item.value.ext }}"
dist_url: "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/{{ dist_file }}"
Comment puis-je définir ou utiliser dist_file ou dist_url variables qui dépend d'autres variables définies dans la même CLÉ (disons dans les PRINCIPAUX java7_60)?
Droit maintenant, quand j'essaie la dist_file ou dist_url variables OU le commentaire sur les lignes de chemin de paramètre (c'est à dire à l'aide de l'élément.de la valeur.), ce n'est pas la définition de la valeur de ces 2 variables comme souhaité, c'est à dire en fonction d'autres variables version, group_path, classificateur, ext et artifactory_url (qui est défini dans une autre commune du rôle par défaut/main.fichier yml)).
J'ai vu que pour l'aide with_dict: au sein d'un playbook/tâche, je dois utiliser {{ item.valeur.variable_name }} mais comment puis-je définir une variable qui est dépendant des autres au sein de la même section d'un dictionnaire.
Le message d'erreur que j'obtiens en utilisant le dessus de dictionnaire dans la tâche suivante est:
$ cat rôles/java/tâches/main.yml:
- name: Download Java/JDK Versions
command: wget -q "{{ item.value.dist_url }}"
chdir="{{ common_download_dir }}"
creates="{{ common_download_dir }}/{{ item.value.dist_file }}"
with_dict: "{{ java_versions }}"
become_user: "{{ build_user }}"
Message d'erreur avec l'aide de dist_file /dist_url (avec la configuration actuelle, dans les rôles/java/defaults/main.yml):
TASK: [java | Download Java/JDK Versions] *************************************
failed: [server01.poc.jenkins] => (item={'key': 'java7_60', 'value': {'dist_file': u'jdk-{# version #}-{# classifier #}-{# ext #}', 'ext': 'tar.gz', 'version': '1.7.60', 'dist_url': u'{# artifactory_ur #}/{# group_path #}/{# version #}/{# dist_file #}', 'group_path': 'com/oracle/jdk', 'classifier': 'linux-x64'}}) => {"changed": true, "cmd": ["wget", "-q", "{# artifactory_url #}/{# group_path #}/{# version }/{# dist_file #}"], "delta": "0:00:00.006081", "end": "2015-11-23 12:50:18.383728", "item": {"key": "java7_60", "value": {"classifier": "linux-x64", "dist_file": "jdk-{# version #}-{# classifier #}-{# ext #}, "dist_url": "{# artifactory_url #}/{# group_path #}/{# version #}/{# dist_file #}", "ext": "tar.gz", "group_path": "com/oracle/jdk", "version": "1.7.60"}}, "rc": 4, "start": "2015-11-23 12:50:18.377647", "wrnings": ["Consider using get_url module rather than running wget"]}
Message d'erreur avec l'aide de dist_file /dist_url (avec les lignes qui sont actuellement en commentaire dans les rôles/java/defaults/main.yml):
TASK: [java | Download Java/JDK Versions] *************************************
failed: [server01.poc.jenkins] => (item={'key': 'java7_60', 'value': {'dist_file': u'jdk-{#item.value.version #}-{# item.value.classifier #}-{# item.value.ext #}', 'ext': 'tar.gz', 'version': '1.7.60' , 'dist_url': u'{# artifactory_url #}/{# item.value.group_path #}/{# item.value.version #}/{# dist_file #}', 'group_path': 'com/oracle/jdk', 'classifier': 'linux-x64'}}) => {"changed": true, "cmd": ["wget", "-q", "{# artifactory_url #}/{# item.value.group_path #}/{# item.value.version #}/{# dist_file #}"], "delta": "0:00:00.005900", "end": "2015-11-23 12:36:24.131327", "item": {"key": "java7_60", "value": {"cla ssifier": "linux-x64", "dist_file": "jdk-{#item.value.version #}-{# item.value.classifier #}-{# item.value.ext #}", "dist_url": "{# artifactory_url #}/{# item.value.group_path #}/{# item.value.version #}/{# dist_file #}", "ext": "tar.gz", "group_path": "com/oracle/jdk", "version": "1.7.60"}}, "rc": 4, "start": "2015-11-23 12:36:24.125427", "warnings": ["Consider using get_url module rather than running wget"]}
dict_url
et de référencement dans votre tâche, ne serait-il pas juste être plus facile d'avoir la tâche d'effectuer wget -q "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/{{ dist_file }}"
lui-même?Merci pour le commentaire. J'ai essayé, mais cela rend la tâche de chercher un peu moche. Même si je le fais, je pense que la question est de savoir si vous pouvez définir un dictionnaire variable en utilisant un autre dictionnaire variable au sein de la même CLÉ. De toute façon, il semble que la question est de variables au sein d'un dictionnaire de variable ne sont pas d'être remplacé. Je vais essayer ce que vous avez dit et voir si cela fonctionne! Demandais est-il un moyen de combiner / ré-utilisation des variables au sein d'une section CLÉ d'un dictionnaire.
Je crois que le plus simple (et peut-être la meilleure façon serait de créer de la dist_file et dist_url chaînes dans le rôle, plutôt que la définition dans le dictionnaire.
J'aime cette idée!, Vous pouvez poster comment faire? Tu veux dire, je vais encore être en mesure d'utiliser with_dict: avec seulement les 4 premiers dictionnaire des variables (version, group_path, classifier et ext) et de créer 2 variables: dist_file et dist_url dans les rôles/java/tâches/main.yml?
OriginalL'auteur Arun Sangal | 2015-11-23
Vous devez vous connecter pour publier un commentaire.
Je crois que la meilleure façon de faire ce que vous voulez (car je ne crois pas que les variables de boucle peut faire référence à eux-mêmes) serait d'avoir votre tâche sera de:
essentiellement insérant manuellement les variables dans votre tâche.
C'est pas joli si vous avez besoin d'utiliser les variables pour des tâches multiples, mais dans ansible 1.x je ne pense pas qu'il y a un moyen pour faire joli. Ansible 2.0 a blocs, avec laquelle vous serez en mesure de boucle de plusieurs tâches sur une dict, et vous seriez en mesure de définir des variables pour toutes les tâches dans ce bloc à utiliser.
Grâce Sepehr. Je suis d'accord avec vous.
OriginalL'auteur Sepehr Nazari
J'étais curieux de savoir ce que je fait un peu de creuser, et ce faisant, je suis tombé sur cette réponse. C'est seulement une partie de la solution dans votre cas.
Il semble que Ansible ne vous laisseront pas de référence à une variable à partir de son propre définition, qui je pense a du sens puisqu'il n'est pas entièrement défini. Donc, quelque chose comme cela ne fonctionne pas, et va, en fait, de jeter un peu déroutant d'erreur lorsque la variable est référencée:
Il apparaît également, à partir de votre propre exemple, que Ansible ne vous laissent pas utiliser
item
des constructions dans les variables de référence à d'autres variables complexes. Ce genre de fait du sens pour moi, car il semble Ansible résout jinja2 des constructions dans les variables au moment de la variable est définie, et non pas au moment de l'exécution lorsque la variable est référencée.Donc bien que ce n'est pas exactement ce que vous cherchiez, je pense que si vous séparer de votre variable en deux parties, vous pouvez obtenir que cela fonctionne en faisant quelque chose le long de ces lignes:
Lorsque vous déboguez
java_downloads
cette façon, vous obtenez l'URL complète vous êtes à la recherche pour:OriginalL'auteur Bruce P
Grâce à Bruce P et Sepehr N. je n'ai la suite après la prise de la solutions/conseils de leur répondre. Maintenant, ma tâche est de travailler pour de multiples outils (jdk, mvn, gradle, maven, etc), avec de multiples versions avec un minimum de modifications apportées aux fichiers et sans exiger (2ème définition du dictionnaire).
Ce que j'ai fait:
Dans un haut niveau de certaines communes de rôle/par défaut principal.yml je vais avoir le suivant:
$ cat rôles/some_common_global_role/defaults/main.yml
Dans
$ cat rôles/java/defaults/main.yml
Dans la personne de l'outil de rôles/default/main.yml, je vais mettre le même dictionnaire et un outil de variable et il va télécharger plusieurs outils/versions. Dans ce cas, votre niveau commun de rôle/par défaut principal.yml ressemblera:
Si j'utilise l'approche ci-dessus, je peux définir l'outil de "variable" à l'une de ses rôles//defaults/main.yml niveau de la tâche et il sera disponible à dist_file /dist_url.
Aussi au lieu de l'aide de la commande: wget -q "...", je peux utiliser get_url (module) dans Ansible.
et assurez-vous de la machine DISTANTE, vous êtes en mesure d'exécuter la commande ping Artifactory serveur (vérifiez ping .... ou /etc/resolv.fichier conf de recherche/serveur de noms entrées) et si tout semble bon, alors les solutions posté ici fonctionne!
Personnellement, j'ai aimé la solution pour passer outil variable (au rôle/tâche) niveau (ainsi, la négation de l'utilisation de l'outil de définition: le dictionnaire le niveau) et ne nécessitant pas de définir le niveau individuel _dist_file/dist_url variables.
OriginalL'auteur Arun Sangal