Aru*_*gal 13 variables jinja2 ansible ansible-playbook
Ansible 1.9.2版本.
Ansible在评估变量时是否支持变量内的变量扩展.
我有一个任务是从Artifactory下载3个zip文件.
我没有在角色中编写3个单独的任务,而是在剧本中使用了ansible的循环.在Ansible角色的默认值/ main.yml中,我具有角色定义/可用的所有必需变量,即jtpplugins_extras_artifactory_url和其他(标准/ webdriver)对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中定义为:
var:千兆
kar*_*lyi 16
确实如此.
您可以使用
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"] }}'.这样,它会起作用.
不,没有。但这并不意味着您必须将其扩展为 3 个不同的任务。您实际上可以做的就是扩展您的“字典”,使其看起来与此类似:
with_items:
 - {"url": "https://xxxxx", "file": "/tmp/xxxxx" }
 - {"url": "https://yyyyy", "file": "/tmp/yyyyy" }
 - {"url": "https://zzzzz", "file": "/tmp/zzzzz" }
然后在您的任务中只需调用不同的参数:{{ item.url }} and {{ item.file }}
替代选项:
编写您自己的过滤器,该过滤器将根据值扩展您的变量{{ jmeterplugins_url | my_custom_filter(item.plugin) }}
编写一个自定义模块,它将根据您的输入将获取 url 的所有功能封装到文件中
编写lookup_plugin将迭代变量列表并产生正确结果的自定义。
由于您使用的是command模块,因此您可以利用bash同一命令连接您的 url、文件(这可能是最混乱的解决方案)