我正在学习有趣的角色,并且尝试使用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模板呢?
答案 0 :(得分:1)
我知道只有在set_fact和其他条件下,我才能使用ansible做到这一点。但是我怎么也可以使用Jinja2模板呢?
您不能; Jinja2模板不会改变其环境,因为Jinja2不是一种编程语言,所以它是模板标记。
您必须使用set_fact:
来更改剧本的hostvars
答案 1 :(得分:0)
您在模板中使用的set
仅在模板内部有效。 c
的值对于ansible本身保持不变。如果以后需要将该值用于其他任务,则不能采用这种方式。
角色vars的order of precedence仍然低于set_fact
,因此可以解决问题。
同时,如果c
始终是可以根据a
和b
进行更改的计算得出的var,那么我会这样做。
a
和b
,以便在任何情况下都可以轻松地使它们超载---
# defaults/main.yml
a: 2
b: 3
c
和a
的值在角色变量中声明b
---
# vars/main.yml
c: "{{ (a > b) | ternary(a, b) }}"
现在,您可以在任务中的任意位置使用c
并使用其正确值,而无需计算其他任何内容。