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"]}
Plutôt que de regrouper tous vos variables ensemble dans la variable 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