【问题标题】:How to update variables of ansible roles through jinja2 template如何通过jinja2模板更新ansible角色的变量
【发布时间】:2019-11-01 06:00:12
【问题描述】:

我正在学习 ansible 角色,我正在尝试使用 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 playbook 中,将其打印到控制台时会给出

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

我知道我只能在 set_fact 和 if else 条件的帮助下使用 ansible 来做到这一点。但是我怎么也可以使用 Jinja2 模板呢??

【问题讨论】:

    标签: ansible jinja2


    【解决方案1】:

    我知道我只能在 set_fact 和 if else 条件的帮助下使用 ansible 来做到这一点。但是我怎么也可以使用 Jinja2 模板呢??

    你不能; Jinja2 模板不会改变它们的环境,因为 Jinja2 不是一种编程语言,它是模板标记。

    您必须使用 set_fact: 来更改 playbook 运行的 hostvars

    【讨论】:

      【解决方案2】:

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

      角色变量的order of precedence 仍然低于set_fact,所以这可以解决问题。

      同时,如果c 始终是一个可以根据ab 改变的计算变量,我会这样做。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        相关资源
        最近更新 更多