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

如何通过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:

我正在学习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: 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) }}"