如何通过jinja2模板更新角色的变量

时间:2019-06-18 14:42:36

标签: ansible jinja2

我正在学习有趣的角色,并且尝试使用Jinja2模板设置角色的变量。但是变量值没有被更新。

这是工作目录 样本

sample
├── README.md
├── defaults
│   └── main.yml
├── files
│   └── main.out
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
│   └── main.j2
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

vars / main.yml文件夹的内容为

a: 2
b: 3
c: 0

tasks / main.yml的内容是

---
 - name: Jagadish Sagi
   template:
           src: "sample2/templates/main.j2"
           dest: "sample2/files/main.out"
 - name: Printing value of c
   debug:
           var: c

templates / main.j2的内容是

{% if a > b %}
{% set c = a %}
{% else %}
{% set c = b %}
{% endif %}
The Value of C : {{c}}

执行角色的代码是

---
 - hosts: localhost
   roles:
         - sample2

在files / main.out文件中,我得到输出

The Value of C : 3

但是在ansible剧本中,将其打印到控制台时会显示

ok: [localhost] => {
    "c": 0
}

我知道只有在set_fact和其他条件下,我才能使用ansible做到这一点。但是我怎么也可以使用Jinja2模板呢?

2 个答案:

答案 0 :(得分:1)

  

我知道只有在set_fact和其他条件下,我才能使用ansible做到这一点。但是我怎么也可以使用Jinja2模板呢?

您不能; Jinja2模板不会改变其环境,因为Jinja2不是一种编程语言,所以它是模板标记。

您必须使用set_fact:来更改剧本的hostvars

答案 1 :(得分:0)

您在模板中使用的set仅在模板内部有效。 c的值对于ansible本身保持不变。如果以后需要将该值用于其他任务,则不能采用这种方式。

角色vars的order of precedence仍然低于set_fact,因此可以解决问题。

同时,如果c始终是可以根据ab进行更改的计算得出的var,那么我会这样做。

  • 在角色的默认情况下声明ab,以便在任何情况下都可以轻松地使它们超载
---
# defaults/main.yml
a: 2
b: 3
  • 根据ca的值在角色变量中声明b
---
# vars/main.yml
c: "{{ (a > b) | ternary(a, b) }}"

现在,您可以在任务中的任意位置使用c并使用其正确值,而无需计算其他任何内容。