为什么 Ansible 事实在角色部分不可用?

Why Ansible facts not available in Roles section?

问题

为什么 ansible_distribution 等 Ansible 事实在角色部分不可用?

---
- name: Test
  hosts: all
  tasks:
    - name: debug
      debug:
        msg: "{{ ansible_distribution }}" <----- Works

  roles:
    - "{{ ansible_distribution }}/somerole" <---- ERROR! 'ansible_distribution' is undefined

ansible.cfg

[defaults]
error_on_undefined_vars = True

Why Ansible facts such as ansible_distribution are not available in Roles section?

因为 roles 剧本中的字典在执行收集事实的 setup 任务之前被解析。

也就是说,根据常识,您应该可以在您的任务中使用 include_role 模块,但是在那里也不可能使用事实作为角色名称(类似于 ,但是您可以使用我在那里建议的解决方法,即包含一个具有静态名称的角色并使用 when 条件来控制哪个)。


一般来说,参考您的示例,角色旨在提供抽象级别,并且应该处理它们内部而非外部的架构差异。