在 Ansible 中评估 Jinja2 字符串作为模板

问题描述 投票:0回答:1

我有一种正在循环的配置变量文件,

checks:
  - name: "x"
    setting: "y"
    eval: "{{ 'OK' if var == 'x' else 'NOK' }}"

main.yml

- hosts: all
  tasks:
  - name: Loop
    include_tasks: do.yml
    loop: "{{ checks }}"

现在的问题是 eval 在进入循环时被模板化/扩展......

在 do.yml 中

---
- debug:
    var: item

# (shows eval as NOK)

- name: Do stuff
  shell:
  register: var

- name: Save stuff
  set_fact
    result: "{{ result | d([]) + [ res ] }}"
  vars:
    res:
      name: "{{ item.name }}"
      setting: "{{ item.setting }}"
      result: "{{ item.eval }}"

如何在注册 var 后重新评估

item.eval

我更想要的是,如果我只提供字符串,而不在
checks.yml
文件中使用大括号,那么它将在循环内进行模板化。我就是无法让它发挥作用。

发生的情况是,eval 部分在进入循环之前就被模板化,然后它使用模板化值而不是在

Save stuff
任务发生时评估变量引用。

ansible jinja2
1个回答
0
投票

问:“

eval
在进入循环时被模板化/扩展

对,这就是设计和预期的行为。

问:“在循环内进行模板化

当时只是模板。

一个最小的示例手册

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    checks:
      - name: "x"
        setting: "y"
      - name: "y"
        setting: "x"

  tasks:

    - name: Loop
      debug:
        msg: "{{ result | d([]) + [ res ] }}"
      vars:
        res:
          name: "{{ item.name }}"
          setting: "{{ item.setting }}"
          eval: "{{ 'OK' if item.name == 'x' else 'NOK' }}"
      loop: "{{ checks }}"

将产生

的输出
TASK [Loop] **********************************************
ok: [localhost] => (item={'name': 'x', 'setting': 'y'}) =>
  msg:
  - eval: OK
    name: x
    setting: y
ok: [localhost] => (item={'name': 'y', 'setting': 'x'}) =>
  msg:
  - eval: NOK
    name: y
    setting: x
© www.soinside.com 2019 - 2024. All rights reserved.