在剧本中使用集合

安装完成后,您可以通过完整限定集合名称 (FQCN) 来引用集合内容

- name: Reference a collection content using its FQCN
  hosts: all
  tasks:

    - name: Call a module using FQCN
      my_namespace.my_collection.my_module:
        option1: value

这适用于角色或在集合中分发的任何类型的插件

- name: Reference collections contents using their FQCNs
  hosts: all
  tasks:

    - name: Import a role
      ansible.builtin.import_role:
        name: my_namespace.my_collection.role1

    - name: Call a module
      my_namespace.mycollection.my_module:
        option1: value

    - name: Call a debug task
      ansible.builtin.debug:
        msg: '{{ lookup("my_namespace.my_collection.lookup1", "param1") | my_namespace.my_collection.filter1 }}'

使用 collections 关键字简化模块名称

collections 关键字允许您定义一个集合列表,以便您的角色或剧本在此列表中搜索不带限定符的模块和操作名称。因此,您可以使用 collections 关键字,然后在该角色或剧本中简单地通过简写名称引用模块和操作插件。

警告

如果您的剧本同时使用了 collections 关键字和一个或多个角色,那么这些角色不会继承剧本中设置的集合。这也是我们建议您始终使用 FQCN 的原因之一。关于角色的详细信息请参阅下文。

在角色中使用 collections

在角色内部,您可以使用角色 meta/main.yml 中的 collections 关键字来控制 Ansible 为角色内任务搜索哪些集合。即使调用该角色的剧本在单独的 collections 关键字条目中定义了不同的集合,Ansible 仍将使用角色内部定义的集合列表。定义在集合内部的角色总是隐式地首先搜索其自身的集合,因此您不需要使用 collections 关键字来访问同一集合中包含的模块、操作或其他角色。

# myrole/meta/main.yml
collections:
  - my_namespace.first_collection
  - my_namespace.second_collection
  - other_namespace.other_collection

在剧本中使用 collections

在剧本中,您可以控制 Ansible 为要执行的模块和操作插件搜索哪些集合。然而,您在剧本中调用的任何角色都会定义自己的集合搜索顺序;它们不会继承调用剧本的设置。即使该角色没有定义自己的 collections 关键字,情况也是如此。

- name: Run a play using the collections keyword
  hosts: all
  collections:
    - my_namespace.my_collection

  tasks:

    - name: Import a role
      ansible.builtin.import_role:
        name: role1

    - name: Run a module not specifying FQCN
      my_module:
        option1: value

    - name: Run a debug task
      ansible.builtin.debug:
        msg: '{{ lookup("my_namespace.my_collection.lookup1", "param1")| my_namespace.my_collection.filter1 }}'

collections 关键字仅为非命名空间插件和角色引用创建了一个有序的“搜索路径”。它不会安装内容,也不会以其他方式改变 Ansible 加载插件或角色的行为。请注意,对于非操作或非模块插件(例如 lookups、filters 和 tests),仍然需要 FQCN。

使用 collections 关键字时,无需将 ansible.builtin 添加到搜索列表中。当省略时,默认可用以下内容:

  1. 通过 ansible-base/ansible-core 提供的标准 ansible 模块和插件

  2. 对旧版第三方插件路径的支持

通常情况下,使用模块或插件的 FQCN 优于使用 collections 关键字。

使用集合中的剧本

2.11 版本新增。

您也可以在集合中分发剧本,并使用与插件相同的语义来调用它们

ansible-playbook my_namespace.my_collection.playbook1 -i ./myinventory

从剧本内部调用

- name: Import a playbook
  ansible.builtin.import_playbook: my_namespace.my_collection.playbookX

创建此类剧本时的几点建议:hosts: 应该是通用的,或者至少具有变量输入。

- hosts: all  # Use --limit or customized inventory to restrict hosts targeted

- hosts: localhost  # For things you want to restrict to the control node

- hosts: '{{target|default("webservers")}}'  # Assumes inventory provides a 'webservers' group, but can also use ``-e 'target=host1,host2'``

这将在 collections: 关键字中拥有一个隐含的 my_namespace.my_collection 条目,就像角色一样。

注意

  • 剧本名称与其他集合资源一样,有一套受限的有效字符集。名称只能包含小写字母数字字符以及下划线 _,且必须以字母字符开头。破折号 - 字符在集合的剧本名称中是无效的。名称包含无效字符的剧本无法被寻址:这是用于加载集合资源的 Python 导入器的限制。

  • 集合中的剧本不支持“相邻”插件,所有插件必须位于集合特定的目录中。