如何仅在需要时收集角色内部的 ansible_facts ?

Ofe*_*dan 2 ansible ansible-facts

我有一个示例角色,我根据操作系统和包管理器安装一些包:

# THIS IS IN tasks/main.yml
- name: Ensure archlinux-keyring is updated
  community.general.pacman:
    name: archlinux-keyring
    state: latest
    update_cache: yes
  when: ansible_pkg_mgr == "pacman"
Run Code Online (Sandbox Code Playgroud)

如果这个角色作为剧本的一部分运行,Ansible 将收集事实,一切都很好。但是,如果我将其作为独立角色运行:

ansible localhost -m include_role -a name=examplerole
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

localhost | FAILED! => {
    "msg": "The conditional check 'ansible_pkg_mgr == \"pacman\"' failed. The error was: error while evaluating conditional (ansible_pkg_mgr == \"pacman\"): 'ansible_pkg_mgr' is undefined
Run Code Online (Sandbox Code Playgroud)

我知道我可以强制 Ansible 在角色中收集这些事实,但是一遍又一遍地收集事实会非常慢(因为这是我在多个角色中反复出现的问题,而且我不能总是将它们包含在剧本中,而且,如果它们在剧本中,则不需要)。

有什么方法可以检查事实是否已经收集,并仅在需要时将它们收集到角色内部?

U88*_*80D 7

关于

\n
\n

...有什么方法可以检查事实是否已经收集...仅在需要时才将它们收集到角色内部?

\n
\n

如果您想根据条件收集事实,您可以查看以下示例

\n
- hosts: localhost\n  become: false\n\n  gather_facts: false\n\n  tasks:\n\n  - name: Show Gathered Facts\n    debug:\n      msg: "{{ hostvars[\'localhost\'].ansible_facts }}"\n\n  - name: Gather date and time only\n    setup:\n      gather_subset:\n        - "date_time"\n        - "!min"\n    when: ansible_date_time is not defined\n\n  - name: Show Gathered Facts\n    debug:\n      msg: "{{ ansible_facts }}"\n
Run Code Online (Sandbox Code Playgroud)\n

仅收集日期和时间(如果之前未定义)。

\n

这意味着,关于

\n
\n

一遍又一遍地收集事实会非常慢

\n
\n

建议熟悉所收集事实和可能的子集的数据结构,以便仅收集所需的信息。以及缓存事实

\n

进一步的文档

\n\n