【问题标题】:How do I use a yaml anchor in an Ansible when conditional?有条件时如何在 Ansible 中使用 yaml 锚?
【发布时间】:2021-04-30 09:41:07
【问题描述】:

我正在尝试检查角色中变量的值,但我不知道变量名是什么,因为它是在角色之外设置的。

我尝试使用 yaml 锚来实现这一点:

- set_fact:
    set_anchor: &job_status_data_key "{{ job_running_check_key }}"
[...]
- name: Set current state
  set_fact:
    loop_finished_successfully: true
  when: *job_status_data_key != "Running"

job_running_check_key 开头的位置设置在角色之外,并包含我将要检查的变量名。

但 ansible 似乎不喜欢条件句中的指针

ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: Expecting value: line 1 column 1 (char 0)

Syntax Error while loading YAML.
  did not find expected key

The error appears to be in 'path/to/role/task.yml': line 15, column 30, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

    loop_finished_succesfully: true
  when: *job_status_data_key != "Running"
                             ^ here

可能有一个合适的语法来实现这一点,但我直到现在才弄清楚。

【问题讨论】:

    标签: ansible yaml conditional-statements anchor


    【解决方案1】:

    您将 ansible 功能与 YAML 功能混淆了。 YAML 别名是对现有节点的引用。 ansible 条件是一个不带引号的 Jinja2 表达式。

    YAML 不知道 ansible 或 Jinja。 YAML 别名必须是 YAML 结构的一部分。另一方面,Jinja 不知道 YAML。后果是:

    *job_status_data_key != "Running"
    

    是无效的 YAML。 YAML 语法定义别名以* 开头,并包含一个锚点名称。因此,以下!=… 内容是语法错误。现在你可能会想“好吧,让我们引用它,以便 YAML 将它作为字符串读取,Jinja 可以评估它”:

    '*job_status_data_key != "Running"'
    

    现在这是一个有效的 YAML 标量。如果作为 when: 的值给出,它将被评估为 Jinja 表达式。问题是,Jinja 不知道 *job_status_data_key 应该是 YAML 别名,事实上,在评估此表达式时,有关该名称的锚定值的信息已经消失了。

    底线是:不要对变量使用锚点和别名。它们是为在 YAML 中序列化循环数据结构而设计的工具。 Ansible 提供variables,您应该使用它们。

    【讨论】:

    • 感谢您的解释。显然我已经在使用 ansible 变量:),但是我看不到使用 ansible 变量来实现我想要的方法,因为无法根据变量的值执行条件。无论如何,我确实实现了一种不同的方法,它不涉及锚点,但我希望有更优雅的东西。哦,好吧:)
    • @Db0 我不完全理解您的问题,因为即使您显示的代码有效,它也会简单地将 *job_status_data_key 替换为 "{{ job_running_check_key }}" 所以我不太明白为什么您不能直接写吧。
    • 当我尝试这样做时,ansible 开始抱怨这并不酷
    • @Db0 是的,实际上它应该只是job_status_data_key,因为when 已经包含一个Jinja 表达式。
    • 然后将与我要比较的变量的名称进行比较。 job_running_check_key 包含变量的名称。我正在尝试与该变量的值进行比较
    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2020-07-07
    • 2016-03-29
    • 2015-10-19
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多