Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables ansible-变量中的变量_Variables_Ansible_Ansible Playbook_Jinja2 - Fatal编程技术网

Variables ansible-变量中的变量

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

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 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)}}

  • 编写一个自定义模块,它将根据您的输入将获取url的所有功能封装到文件中

  • 编写自定义的
    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"] }}'