ansible - variable au sein de variable
Ansible version 1.9.2.
Ne Ansible prend en charge l'expansion des variables à l'intérieur d'une variable pendant l'évaluation.
J'ai une tâche à télécharger les 3 fichiers zip de Artifactory.
Au lieu d'écrire des 3 tâches distinctes dans le rôle, j'ai utilisé ansible de la boucle dans le playbook. Dans Ansible rôle par défaut de/main.yml, j'ai toutes les variables définies/disponible dans le rôle c jmeterplugins_extras_artifactory_url et autres (standard /webdriver) sont visibles à perf_tests rôle.
---
#- Download and install JMeterPlugins
# Use get_url when Ansible is 2.0+ is available on the machine (otherwise, we can't use get_url) thus, using wget.
- name: Download JMeterPlugins-*
command: wget {{ jmeterplugins_{{ item.plugin }}_artifactory_url }}
chdir="{{ common_download_dir }}"
creates="{{ common_download_dir }}/{{ jmeterplugins_{{ item.plugin }}_file }}"
with_items:
- { plugin: 'extras' }
- { plugin: 'standard' }
- { plugin: 'webdriver' }
Mais avec le code ci-dessus, j'obtiens une erreur (comme illustré ci-dessous):
15:58:57 TASK: [perf_tests | Download JMeterPlugins-*] *********************************
15:58:57 <jmeter01.super.fast.jenkins> ESTABLISH CONNECTION FOR USER: cmuser on PORT 22 TO jmeter01.super.fast.jenkins
15:58:57 fatal: [jmeter01.super.fast.jenkins] => Failed to template wget {{ jmeterplugins_{{ item.plugin }}_artifactory_url }} chdir="{{ common_download_dir }}" creates="{{ common_download_dir }}/{{ jmeterplugins_{{ item.plugin }}_file }}": template error while templating string: expected token 'variable_end', got '{'
15:58:57
15:58:57 FATAL: all hosts have already failed -- aborting
15:58:57
15:58:57 PLAY RECAP ********************************************************************
15:58:57 to retry, use: --limit @/home/cmuser/perf_tests.retry
15:58:57
15:58:57 jmeter01.super.fast.jenkins : ok=23 changed=6 unreachable=1 failed=0
N'est pas ansible prend en charge l'expansion des variables/évaluation si une variable contient une autre variable (surtout quand je suis à l'aide d'une boucle).
Je juste ne veux élargir mon simple tâche de boucle de 3-nom de tâches pour le téléchargement de fichiers zip pour jmeterplugins_extras, jmeterplugins_standard et jmeterplugins_webdriver séparément. Il semble que l'erreur est liée en raison de Jinja.
Comment puis-je utiliser la var de la valeur giga dans une autre variable, c'est à dire si var contient giga, ensuite je devrais obtenir la valeur de la variable "special_giga_variable" ({{special_{{ var }}_variable}})? où var a été défini dans les paramètres par défaut/main.yml:
var: giga
OriginalL'auteur Arun Sangal | 2015-09-21
Vous devez vous connecter pour publier un commentaire.
Non, il ne le fait pas. Mais cela ne signifie pas que vous devez développer en 3 différentes tâches. Ce que vous pouvez faire est en fait développez-vous "dictionnaire" pour ressembler à ceci:
Ensuite dans votre tâche viens d'appeler les différents paramètres:
{{ item.url }} and {{ item.file }}
Autres Options:
Écrire votre propre filtre qui vous permettra d'étendre votre variable en fonction de la valeur
{{ jmeterplugins_url | my_custom_filter(item.plugin) }}
Écrire un module personnalisé, qui va encapsuler toutes les fonctionnalités de chercher l'url dans le fichier en fonction de vos entrées
Écrire personnalisé
lookup_plugin
qui va parcourir votre liste de variables et de produire des résultats corrects.Puisque vous utilisez
command
module, vous pouvez tirer parti debash
pour concaténer votre url, fichier dans la même commande ( ce serait probablement le messiest solution )J'ai ajouté quelques solutions de rechange. Ils fournissent beaucoup plus "propre" tablettes playbook mais exige un peu plus de travail pour cacher le désordre de concaténation.
Assurez-vous. Je suis à la recherche de ceux-ci. Comment est-ce différent: {{ hostvars[inventory_hostname][fact_name] }}. Je me demande si cela va fonctionner: {{ jmeterplugins_[point.plugin]_artifactory_url }} ... c'est à dire au lieu d'utiliser {{ }} pour envelopper la variable (qui doit être élargi), si je peux utiliser de grands crochets [ ]
{{var_[other_var]_doesnot_work}}
OriginalL'auteur Vor
Il n'.
Vous pouvez utiliser
le seul inconvénient de cette approche, il ne sera pas s'étendre dynamiquement les variables d'obtenir la valeur d'une autre variable. un exemple:
roles/xxx/defaults/main.yml
:Cela, malheureusement ne fonctionne pas lorsque vous essayez d'utiliser la valeur résolue dans
var2
. Par conséquent,sortie
{{ var1 }}
au lieu defoo
.Solution de contournement:
Dans votre vars déclaration, au lieu d'utiliser
var2: {{ var1 }}
, utilisezvar2: '{{ vars["var1"] }}'
. De cette façon, il va fonctionner.OriginalL'auteur karolyi