如何通过jinja2模板更新ansible角色的变量
我正在学习ansible角色,并尝试使用Jinja2模板设置角色的变量。但是变量值没有被更新 这是工作目录 样品 vars/main.yml文件夹的内容如下如何通过jinja2模板更新ansible角色的变量,ansible,jinja2,Ansible,Jinja2,我正在学习ansible角色,并尝试使用Jinja2模板设置角色的变量。但是变量值没有被更新 这是工作目录 样品 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:
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
模板/main.j2的内容如下
{% if a > b %}
{% set c = a %}
{% else %}
{% set c = b %}
{% endif %}
The Value of C : {{c}}
执行该角色的代码是
---
- hosts: localhost
roles:
- sample2
在文件/main.out文件中,我将获得输出
C:3的值
但在ansible playbook中,当将其打印到控制台时
ok: [localhost] => {
"c": 0
}
我知道我只能在set_-fact和if-else条件的帮助下使用ansible来完成它。但是我怎样才能使用Jinja2模板呢
我知道我只能在set_-fact和if-else条件的帮助下使用ansible来完成它。但是我怎样才能使用Jinja2模板呢
你不能;Jinja2模板不会改变其环境,因为Jinja2不是编程语言,而是模板标记
您必须使用set\u事实:
来更改playbook运行的hostvars
您在模板中使用的set
仅在模板中有效。ansible本身的c
值保持不变。如果以后需要在其他任务中使用该值,则不能这样做
变量的角色仍然低于set\u fact
,因此这可以实现这一目的
同时,如果c
始终是一个计算的var,它可以根据a
和b
变化,这就是我要做的
- 在角色的默认值中声明
a
和b
,以便在任何情况下都可以轻松重载它们
- 根据
a
和b
值在角色变量中声明c
现在,您可以在任务中的任意位置使用c
,并使用它的正确值,而无需计算任何其他内容
ok: [localhost] => {
"c": 0
}
---
# defaults/main.yml
a: 2
b: 3
---
# vars/main.yml
c: "{{ (a > b) | ternary(a, b) }}"