variables - ansible - 变量中的变量

标签 variables ansible ansible-playbook jinja2

Ansible 1.9.2 版本。

Ansible 在评估变量时是否支持变量内的变量扩展。

我的任务是从 Artifactory 下载 3 个 zip 文件。

我没有在角色中编写 3 个单独的任务,而是在剧本中使用了 ansible 的循环。在 Ansible 角色的 default/main.yml 中,我为角色定义了/可用的所有必需变量,即 jmeterplugins_extras_artifactory_url 和其他(标准/网络驱动程序)对 可见perf_tests 角色。

---
#- 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' }   

但是使用上面的代码,我收到一个错误(如下所示):
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   

如果一个变量包含另一个变量(尤其是当我使用循环时),则 ansible 不支持变量扩展/评估。

我只是不想将我的简单循环任务扩展为 3 个不同的 -name 任务,用于分别下载 jmeterplugins_extras、jmeterplugins_standard 和 jmeterplugins_webdriver 的 zip 文件。错误似乎与 Jinja 有关。

如何使用 var 的值 千兆 在另一个变量中,即如果 var 包含 千兆 ,那么我应该得到变量“special_giga_variable”的值({{special_{{ var }}_variable}})?其中 var 在 defaults/main.yml 中定义为:

变量:千兆

最佳答案

确实如此。

您可以使用

set_fact:
  variable: '{{ vars['my_' + variablename + '_variable'] }}'

到目前为止,这种方法的唯一缺点是,它不会动态扩展获取另一个变量值的变量。一个例子:
roles/xxx/defaults/main.yml :
var1: foo
var2: '{{ var1 }}'

不幸的是,当尝试使用 var2 中的解析值时,这将不起作用。 .因此,
- debug: msg='{{ vars["var2"] }}'

将输出 {{ var1 }}而不是 foo .

解决方法:

在你的 vars 声明中,而不是使用 var2: {{ var1 }} , 使用 var2: '{{ vars["var1"] }}' .这样,它就会起作用。

关于variables - ansible - 变量中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32704247/

相关文章:

php - 如何使用javascript按钮单击更改php的变量而不重新加载页面

Bash - stdir 单词到文件

c - 如何在不调用声明它的函数的情况下修改局部静态变量?

linux - 需要将输出附加到文件

ansible - Ansible剧本中的动态变量名?

jinja2 - 如何将键/值添加到 ansible playbook 中的 dict,有条件

javascript - 我应该将字符串值存储在变量中还是作为隐藏的输入值

linux - 复制文件并使用ansible运行特定命令?

ansible - 将 ansible 列表转换为事件字典

ansible:某种列表理解?