变量
可以使用以下一个或两个命令行参数将变量解析到规则手册中
--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_playbook 和 run_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 }}'