如何解析Ansible组变量文件?

时间:2017-04-18 23:57:04

标签: ansible jinja2

特别是,我有一个group_vars/all.yml文件,基本上有以下内容:

my_foo: asdf
my_bar: '{{ my_foo }}'

如果我以后,在模板中模板化文件,例如:

- name: template a file
  template:
    src: something.j2
    dest: '....'

something.j2文件中,我使用{{ my_bar }},我以某种方式得到asdf如何吗

我之前的理解是group_vars/all.yml这样的文件基本上被解析为parse_yaml(parse_and_evaluate_jinja2(contents_of_the_file))。但是如果这是真的,则行my_bar: '{{ my_foo }}'将无法正确评估:我们要么出错,因为my_foo未定义到Jinja ,或者某些默认文本,例如"undefined"''。就像YAML与Jinja2同时被解析一样,这似乎不太可能。这真的是Ansible的作用吗?或者我完全错过了其他什么?

(我无法找到有关如何在Ansibles文档中解析变量文件的任何确切文档,因此如果它们存在,则表示赞赏。)

1 个答案:

答案 0 :(得分:0)

  

我之前的理解是像group_vars / all.yml这样的文件基本上被解析为parse_yaml(parse_and_evaluate_jinja2(contents_of_the_file))

错误。 Ansible在运行时进行所有评估,例如:

你告诉Ansible:

- debug:
    msg: "{{ my_bar }}"

因此,当Ansible将msg参数传递给debug模块时,它会执行:

  1. 参数是什么?
  2. 参数为{{ my_bar }}。哦,它是一个模板和变量my_bar
  3. my_bar的价值是多少?
  4. 值为{{ my_foo }}。哦,它又是一个模板,还有变量my_foo
  5. my_foo的价值是多少?
  6. 值为asdf。好!没有更多的模板。
  7. 因此,my_bar的值现在为asdf
  8. 参数值不是asdf
  9. 让我们打印asdf
  10. 写作:

    my_var: "{{ my_other_var }}"
    

    您不像通常的编程那样分配变量,而是编写一个简单的模板来计算my_var在任何给定时间(运行时)的值,而不是在解析时。< / p>