2017-06-16 102 views
0

我存储所有ansible变量YAML文件(过滤掉那些以“ansible_”)这个剧本:如何使所有ansible变量YML文件,ansible 2.3

- hosts: localhost 
    tasks: 
    - set_fact: 
     all_vars: "{{all_vars | default({}) |combine({item.key: item.value})}}" 
    when: "{{not item.key.startswith('ansible_')}}" 
    with_dict: "{{vars}}" 
    - copy: 
     content: "{{ all_vars }}" 
     dest: "/tmp/tmp.yml" 

这是group_vars/all/defaults.yml

SOME_FACT1: "some-fact" 
SOME_FACT2: "{{ SOME_FACT1 }}" 
SOME_FACT3: "{{ SOME_FACT2 }}" 

这与理论2.2完美结合。但是在2.3(2.3.1.0)中,变量不会被渲染。 我得到的结果是这样的:

... "SOME_FACT1": "some-fact", "SOME_FACT3": "{{ SOME_FACT2 }}", "SOME_FACT2": "{{ SOME_FACT1 }}" ... 

我怎么能强迫ansible 2.3渲染变量?

+0

我编辑了问题以获得更多清晰度 – Nathan

+0

'vars'是内部对象,并以特殊方式模板化(更好地说是_not_模板)。你为什么需要做这个任务? –

+0

我想执行一个可以访问所有可变变量的python脚本(用对流层创建一个cloudformation文件)。 – Nathan

回答

0

问题似乎是,ansible不会渲染变量和(我不知道为什么)all_vars。但是,直接使用时,vars/all_vars中的任何变量均可正确呈现。

所以此工程:

- hosts: localhost 
    tasks: 
    - set_fact: 
      all_vars: "{{all_vars | default([]) |union([item.key + ':{{' + item.key + '|to_json}}'])}}" 
    when: "{{not item.key.startswith('ansible_')}}" 
    with_dict: "{{vars}}" 
    - copy: 
     content: "{{ all_vars | join('\n') }}" 
     dest: "/tmp/tmp1.yml" 
    - template: 
     src: "/tmp/tmp1.yml" 
     dest: "/tmp/tmp.yml" 

的理念是:

  1. 创建列出格式

    SOME_VAR所有变量的文件:{{SOME_VAR | to_json}} ...

  2. 使用模板呈现该文件。

不是很好,但它的工作原理。