变量

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

--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 解析的环境变量始终被视为字符串。在将变量解析到规则手册时,这一点很重要。

注意

如果通过 –env-vars–vars 提供了相同的变量,则始终优先使用来自 –env-vars 的变量。

在规则手册中访问变量

在规则手册中访问变量时,需要考虑两个重要事项

1. 为了在条件中使用变量,运行时提供的变量将被放置到名为 vars 的命名空间中。必须使用 vars. 前缀后跟变量名称才能在条件中使用变量。

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

让我们以以下规则手册为例

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

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

---
src_range_limit: 4
match_this_int: 2

要运行此规则手册,我们需要使用 –vars–env-vars 将变量解析到规则手册中。因此,我们将如下执行规则手册

$ 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 替换在条件中不起作用。有关更多信息,请参阅 条件 页面。

向操作提供额外的变量

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

每个剧本或作业模板所需的额外变量应在规则手册中操作下的 extra_vars 部分中明确指定。额外变量的值可以是字面量,也可以是对其他规则手册变量的引用。除了上面描述的用户提供的运行时变量之外,规则手册引擎还会自动在顶级键 ansible_eda 下插入事件(单个匹配)或事件(多个匹配)、规则集和规则。

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 的剧本示例

- 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 }}'