Variables ansible-变量中的变量
Ansible 1.9.2版本 Ansible在计算变量时是否支持变量内部的变量扩展 我的任务是从Artifactory下载3个zip文件 我在剧本中使用了ansible的循环,而不是在角色中编写3个单独的任务。在Ansible角色的default/main.yml中,我定义了角色所需的所有变量,即jmeterplugins\u extras\u artifactory\u url和其他(标准/webdriver)对性能测试可见Variables ansible-变量中的变量,variables,ansible,ansible-playbook,jinja2,Variables,Ansible,Ansible Playbook,Jinja2,Ansible 1.9.2版本 Ansible在计算变量时是否支持变量内部的变量扩展 我的任务是从Artifactory下载3个zip文件 我在剧本中使用了ansible的循环,而不是在角色中编写3个单独的任务。在Ansible角色的default/main.yml中,我定义了角色所需的所有变量,即jmeterplugins\u extras\u artifactory\u url和其他(标准/webdriver)对性能测试可见 --- #- Download and install JMete
---
#- 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任务:[性能测试|下载JMeterPlugins-*]**************************************
15:58:57为端口22上的用户:cmuser建立到jmeter01.super.fast.jenkins的连接
15:58:57致命:[jmeter01.super.fast.jenkins]=>模板wget{{jmeterplugins{{{item.plugin}}}{u artifactory{u url}}chdir=“{{common_download_dir}”creates=“{common_download_dir}}}/{jmeterplugins{{{item.plugin}}}}}}}模板字符串时出错:预期标记为“variable_end”,得到“{”
15:58:57
15:58:57致命:所有主机都已失败--正在中止
15:58:57
15:58:57播放回顾***************************************************************************************************************************
15:58:57要重试,请使用:--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个不同名称的任务,分别下载jmeterplugins_extras、jmeterplugins_standard和jmeterplugins_webdriver的zip文件。似乎错误与Jinja有关
如何在另一个变量中使用var的值giga,即如果var包含giga,那么我应该得到变量“special_giga_variable”({{special_{var}}}}})的值,其中var在defaults/main.yml中定义为:
var:giga不,不需要。但这并不意味着您必须将其扩展为3个不同的任务。您可以做的实际上是将“字典”扩展为类似于以下内容:
with_items:
- {"url": "https://xxxxx", "file": "/tmp/xxxxx" }
- {"url": "https://yyyyy", "file": "/tmp/yyyyy" }
- {"url": "https://zzzzz", "file": "/tmp/zzzzz" }
然后在任务中只需调用不同的参数:{{item.url}}和{{item.file}}
备选方案:
{{jmeterplugins\uurl{my_custom\ufilter(item.plugin)}}
lookup\u插件
,它将遍历变量列表并生成正确的结果命令
模块,因此可以利用bash
将url、文件连接到同一个命令中(这可能是最麻烦的解决方案)set_fact:
variable: '{{ vars['my_' + variablename + '_variable'] }}'
到目前为止,这种方法的唯一缺点是,它不会动态扩展获取另一个变量值的变量。例如:
角色/xxx/defaults/main.yml
:
var1: foo
var2: '{{ var1 }}'
不幸的是,当尝试在var2
中使用解析值时,这将不起作用
- debug: msg='{{ vars["var2"] }}'
将输出{{var1}}
而不是foo
解决方法:
在您的vars声明中,不要使用
var2:{{{var1}}
,而是使用var2:{{vars[“var1]}}}
。这样,它就可以工作了。我喜欢这样,上周我确实研究了这些,我认为应该尝试最简单的方法。唯一的问题是,现在我必须在任务本身中定义实际的URL和文件值(并让它变得更混乱)而不是更干净的方法。但是谢谢你,我会尝试这个项目。xxx方法。我想知道,是否有其他方法可以实现我真正想要的。@ArunSangal我已经添加了一些替代解决方案。它们将提供更“干净”的解决方案游戏手册,但将需要更多的工作来隐藏所有混乱的连接。当然。我正在看这些。这有什么不同:{{hostvars[inventory\u hostname][fact\u name]}。我想知道这是否会起作用:{{jmeterplugins\uitem.plugin][u artifactory\u url}…也就是说,不使用{{{}来包装变量(需要扩展),如果我可以使用大括号[]超级有用!看起来有一个名为vars的全局变量。你每天都会学到一些新的东西。如果能看到一个官方的Ansible页面来记录这一点,那将非常高兴。我还没有找到一个,如果有人找到这方面的官方文档,我将不胜感激。
- debug: msg='{{ vars["var2"] }}'