变量
可以使用以下一个或两个命令行参数将变量解析到 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_playbook 和 run_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 页面。