变量

可以使用以下一个或两个命令行参数将变量解析到 rulebook 中

--vars VARS           Variables file
--env-vars ENV_VARS   Comma separated list of variables to import from the environment

要从 JSON 或 YAML 格式的文件导入变量,应使用 –vars 参数。要导入环境变量,应使用 –env-vars 参数。可以使用逗号分隔来指定多个环境变量。

重要

通过 –vars 参数提供的变量将保留其数据类型,但通过 –env-vars 解析的环境变量始终被视为字符串。在将变量解析到 rulebook 时,这一点至关重要。

注意

如果同一个变量同时通过 –env-vars–vars 提供,则 –env-vars 中的变量将始终优先。

在 rulebook 中访问变量

在 rulebook 中访问变量时,有两个重要的注意事项

1. 为了在条件(conditions)中使用变量,运行时提供的变量将被放入一个名为 vars 的命名空间中。您必须使用 vars. 前缀后跟变量名才能在条件中使用变量。

2. 在 rulebook 的任何其他部分访问变量时(例如在源配置或操作中),应使用 Jinja 替换。

让我们看下面的 rulebook 示例

---
- name: Testing vars
  hosts: all
  sources:
    - eda.builtin.range:
        limit: "{{ src_range_limit }}"
  rules:
    - name: Say Hello
      condition: event.i == vars.match_this_int
      action:
        debug:
          msg: "Hi, I'm {{ MY_NAME }}."

在这个 rulebook 中,我们使用了三个不同的变量。其中 MY_NAME 将通过环境变量提供。另外两个将在一个名为 vars.yml 的文件中提供,内容如下

---
src_range_limit: 4
match_this_int: 2

要运行此 rulebook,我们需要同时使用 –vars–env-vars 将变量解析到 rulebook 中。因此,我们将按如下方式执行 rulebook

$ MY_NAME="Bob" ansible-rulebook -i inventory.yml --rulebook hello_there.yml --vars vars.yml --env-vars MY_NAME

这将返回以下输出

2023-02-09 13:37:73.311337 : Hi, I'm Bob

注意

  • 为了避免变量扩展可能出现的问题,我们建议将任何包含 Jinja 替换变量的值用引号括起来,如上述示例所示。

  • 请注意在条件中使用了 vars. 前缀而不是 Jinja 替换,因为 Jinja 替换在条件中使用时不起作用。更多信息请参阅 条件 (Conditions) 页面。

向操作提供额外变量 (extra vars)

run_playbookrun_job_template 操作包含一个名为 extra_vars 的可选参数,可用于向相应的操作发送额外变量。例如,您可能有一个在检测到主机问题时运行修复任务的 playbook,但该 playbook 需要在运行时提供一些变量才能正确执行。这就是 extra_vars 参数的作用。

每个 playbook 或 job template 所需的额外变量应在 rulebook 中操作下的 extra_vars 部分明确指定。额外变量的值可以是字面量,也可以是对其他 rulebook 变量的引用。除了上述用户提供的运行时变量外,rulebook 引擎还会自动在顶级键 ansible_eda 下插入 event(单次匹配)或 events(多次匹配)、ruleset 和 rule。

run_playbook 操作示例

action:
  run_playbook:
    name: playbooks/hello.yml
    extra_vars:
      foo: "{{ FOO }}"
      bar: BAR

run_job_template 操作示例

action:
  run_job_template:
    name: Demo
    organization: Default
    job_args:
      extra_vars:
          foo: "{{ FOO }}"
          bar: BAR

使用 extra_vars 的 playbook 示例

- name: Print extra_vars
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Print variable foo set by user
      ansible.builtin.debug:
        msg: '{{ foo }}'
    - name: Print variable event set by rulebook engine
      ansible.builtin.debug:
        msg: '{{ ansible_eda.event }}'

对变量使用加密字符串 (vaulted strings)

变量文件可以包含加密字符串。更多信息请参阅 Rulebooks 页面。