ansible.builtin.set_fact 模块 – 设置主机变量和事实。

注意

此模块是 ansible-core 的一部分,并包含在所有 Ansible 安装中。 在大多数情况下,即使不指定集合关键字,也可以使用短模块名称 set_fact。 但是,我们建议您使用完全限定的集合名称 (FQCN) ansible.builtin.set_fact,以便轻松链接到模块文档并避免与其他可能具有相同模块名称的集合冲突。

概要

  • 此操作允许设置与当前主机关联的变量。

  • 这些变量将在 ansible-playbook 运行期间,通过它们所设置的主机提供给后续的剧本。

  • cacheable 设置为 true 可使用事实缓存跨执行保存变量。 变量将在当前运行中保留 set_fact 优先级,但在后续运行中将使用“缓存事实”优先级。

  • 根据标准的 Ansible 变量优先级规则,其他类型的变量具有更高的优先级,因此此值可能会被覆盖。

注意

此模块具有相应的操作插件

参数

参数

注释

cacheable

布尔值

此布尔值将变量转换为实际的“事实”,该事实也将添加到事实缓存中。 它不会跨运行启用事实缓存,它只是意味着如果已启用,它将与它一起工作。

通常,此模块创建“主机级别变量”并具有更高的优先级,此选项会更改创建的变量的性质和优先级(降低 7 步)。 https://docs.ansible.org.cn/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

这实际上会创建变量的 2 个副本,一个具有高优先级的普通“set_fact”主机变量和一个较低的“ansible_fact”变量,该变量可通过事实缓存插件进行持久化。 这会与 meta: clear_facts 创建一个可能令人困惑的交互,因为它会删除“ansible_fact”,但不会删除主机变量。

选项

  • false ← (默认)

  • true

key_value

字符串 / 必需

ansible.builtin.set_fact 模块接受 key=value 对或 key: value (YAML 表示法) 作为要在 playbook 范围内设置的变量。“key”是生成的变量名称,而 value 当然是所述变量的值。

您可以通过提供多个对一次创建多个变量,但不要混合使用表示法。

属性

属性

支持

描述

action

支持:部分

虽然操作插件确实完成了一些工作,但它依赖于核心引擎来实际创建变量,这部分无法被覆盖

表示这有一个对应的操作插件,因此某些选项的部分可以在控制器上执行

async

支持:

支持与 async 关键字一起使用

become

支持:

可与 become 关键字一起使用

bypass_host_loop

支持:

强制执行不按主机执行的“全局”任务,这会绕过按主机模板化以及串行、节流和其他循环注意事项

条件表达式的工作方式与使用 run_once 时一样,使用的变量将来自第一个可用的主机

此操作在锁定步骤策略之外无法正常工作

bypass_task_loop

支持:

这些任务会忽略 loopwith_ 关键字

check_mode

支持:完整

可以在 check_mode 中运行,并返回已更改状态预测,而无需修改目标,如果不支持,则会跳过该操作。

connection

支持:

使用目标配置的连接信息在其上执行代码

core

支持:部分

虽然此操作的部分在核心中实现,但其他部分仍作为普通插件提供,并且可以部分覆盖

这是一个“核心引擎”功能,其实现方式与大多数任务操作不同,因此无法通过插件系统以任何方式覆盖。

delegation

支持:部分

虽然变量分配可以委托给不同的主机,但执行上下文始终是当前的 inventory_hostname

连接变量(如果设置)会反映其将要定位的主机,即使在这种情况下我们根本没有连接

可以与 delegate_to 和相关关键字结合使用

diff_mode

支持:

当处于 diff 模式时,将返回有关已更改(或可能需要在 check_mode 中更改)的内容的详细信息

ignore_conditional

支持:

此操作不受条件执行的约束,因此它将忽略 when: 关键字。

平台

平台: 全部

可以操作的目标操作系统/系列

标签

支持:完整

允许使用“tags”关键字来控制此操作的选择执行

直到

支持:完整

表示此操作是否遵循 until/retry/poll 关键字

说明

注意

  • 由于任务的性质,set_fact 将为变量生成“静态”值。与普通的“惰性”变量不同,该值在赋值时进行评估和模板化。

  • 一些布尔值(yes、no、true、false)将始终转换为布尔类型,除非启用了 DEFAULT_JINJA2_NATIVE。这样做是为了 var=value 布尔值,否则它只能创建字符串,但也阻止使用这些值来创建 YAML 字符串。使用此设置会将 k=v 限制为字符串,但允许您在 YAML 中指定字符串或布尔值。

  • 要创建列表/数组或字典/哈希,请使用 YAML 表示法 var: [val1, val2]

  • 由于“cacheable”现在是一个模块参数,“cacheable”不再是有效的 fact 名称。

另请参阅

另请参阅

ansible.builtin.include_vars

从文件中动态加载任务中的变量。

变量优先级:我应该把变量放在哪里?

有关变量优先级以及哪种类型的变量优先于其他变量的更多信息。

示例

- name: Setting host facts using key=value pairs, this format can only create strings or booleans
  ansible.builtin.set_fact: one_fact="something" other_fact="{{ local_var }}"

- name: Setting host facts using complex arguments
  ansible.builtin.set_fact:
    one_fact: something
    other_fact: "{{ local_var * 2 }}"
    another_fact: "{{ some_registered_var.results | map(attribute='ansible_facts.some_fact') | list }}"

- name: Setting facts so that they will be persisted in the fact cache
  ansible.builtin.set_fact:
    one_fact: something
    other_fact: "{{ local_var * 2 }}"
    cacheable: yes

- name: Creating list and dictionary variables
  ansible.builtin.set_fact:
    one_dict:
        something: here
        other: there
    one_list:
        - a
        - b
        - c
# As of Ansible 1.8, Ansible will convert boolean strings ('true', 'false', 'yes', 'no')
# to proper boolean values when using the key=value syntax, however it is still
# recommended that booleans be set using the complex argument style:
- name: Setting booleans using complex argument style
  ansible.builtin.set_fact:
    one_fact: yes
    other_fact: no

- name: Creating list and dictionary variables using 'shorthand' YAML
  ansible.builtin.set_fact:
    two_dict: {'something': here2, 'other': somewhere}
    two_list: [1,2,3]

作者

  • Dag Wieers (@dagwieers)