安装集合

注意

如果您按照本段所述手动安装集合,则在升级 ansible 软件包或 ansible-core 时,不会自动升级该集合。

在容器中安装集合

您可以在称为执行环境的容器中安装其依赖项的集合。有关详细信息,请参阅 执行环境入门

使用 ansible-galaxy 安装集合

默认情况下,ansible-galaxy collection install 使用 https://galaxy.ansible.com 作为 Galaxy 服务器(如 ansible.cfg 文件中 GALAXY_SERVER 中所列)。您不需要任何其他配置。默认情况下,Ansible 将集合安装在 ~/.ansible/collections 下的 ansible_collections 目录中。

如果您使用的是任何其他 Galaxy 服务器(例如 Red Hat Automation Hub),请参阅 配置 ansible-galaxy 客户端

要安装在 Galaxy 中托管的集合:

ansible-galaxy collection install my_namespace.my_collection

要将集合升级到 Galaxy 服务器上最新的可用版本,您可以使用 --upgrade 选项

ansible-galaxy collection install my_namespace.my_collection --upgrade

您也可以直接使用构建中的 tarball

ansible-galaxy collection install my_namespace-my_collection-1.0.0.tar.gz -p ./collections

您可以从本地源目录构建和安装集合。 ansible-galaxy 实用程序使用目录中的 MANIFEST.jsongalaxy.yml 元数据构建集合。

ansible-galaxy collection install /path/to/collection -p ./collections

您也可以在命名空间目录中安装多个集合。

ns/
├── collection1/
│   ├── MANIFEST.json
│   └── plugins/
└── collection2/
    ├── galaxy.yml
    └── plugins/
ansible-galaxy collection install /path/to/ns -p ./collections

注意

除非父目录已在名为 ansible_collections 的文件夹中,否则 install 命令会自动将路径 ansible_collections 附加到使用 -p 选项指定的路径。

当使用 -p 选项指定安装路径时,请使用 COLLECTIONS_PATHS 中配置的值之一,因为 Ansible 本身将在此处查找集合。如果您没有指定路径,ansible-galaxy collection install 将集合安装到 COLLECTIONS_PATHS 中定义的第一个路径,默认情况下为 ~/.ansible/collections

使用签名验证安装集合

如果集合已由 分发服务器 签名,则服务器将提供 ASCII 编码的独立签名,以在使用它验证集合内容之前验证 MANIFEST.json 的真实性。此选项并非所有分发服务器都可用。有关支持集合签名的服务器列表,请参阅 分发集合

要对已签名的集合使用签名验证:

  1. 配置 GnuPG 密钥环 用于 ansible-galaxy,或者在安装已签名的集合时使用 --keyring 选项提供密钥环的路径。

  2. 将公钥从分发服务器导入到该密钥环。

    gpg --import --no-default-keyring --keyring ~/.ansible/pubring.kbx my-public-key.asc
    
  3. 安装集合时验证签名。

    ansible-galaxy collection install my_namespace.my_collection --keyring ~/.ansible/pubring.kbx
    

    如果您已 配置 GnuPG 密钥环,则不需要 --keyring 选项。

  4. 可选地,在安装后随时验证签名,以证明集合未被篡改。有关详细信息,请参阅 验证已签名的集合

您还可以包含除分发服务器提供的签名之外的签名。使用 --signature 选项使用这些附加签名验证集合的 MANIFEST.json。补充签名应作为 URI 提供。

ansible-galaxy collection install my_namespace.my_collection --signature https://examplehost.com/detached_signature.asc --keyring ~/.ansible/pubring.kbx

GnuPG 验证仅针对从分发服务器安装的集合进行。用户提供的签名不用于验证从 Git 仓库、源目录或 URL/tar.gz 文件路径安装的集合。

您还可以将附加签名包含在集合的 requirements.yml 文件的 signatures 密钥下。

# requirements.yml
collections:
  - name: ns.coll
    version: 1.0.0
    signatures:
      - https://examplehost.com/detached_signature.asc
      - file:///path/to/local/detached_signature.asc

有关如何使用此文件安装集合的详细信息,请参阅 集合 requirements 文件

默认情况下,如果至少有 1 个签名成功验证了集合,则验证被认为成功。所需签名的数量可以使用 --required-valid-signature-countGALAXY_REQUIRED_VALID_SIGNATURE_COUNT 进行配置。可以通过将选项设置为 all 来要求所有签名。如果未找到有效的签名,则要使签名验证失败,请在值前添加 +,例如 +all+1

export ANSIBLE_GALAXY_GPG_KEYRING=~/.ansible/pubring.kbx
export ANSIBLE_GALAXY_REQUIRED_VALID_SIGNATURE_COUNT=2
ansible-galaxy collection install my_namespace.my_collection --signature https://examplehost.com/detached_signature.asc --signature file:///path/to/local/detached_signature.asc

可以使用 --ignore-signature-status-codeGALAXY_REQUIRED_VALID_SIGNATURE_COUNT 忽略某些 GnuPG 错误。GALAXY_REQUIRED_VALID_SIGNATURE_COUNT 应为列表,并且可以多次提供 --ignore-signature-status-code 以忽略多个其他错误状态代码。

此示例要求分发服务器提供的任何签名来验证集合,除非它们由于 NO_PUBKEY 而失败

export ANSIBLE_GALAXY_GPG_KEYRING=~/.ansible/pubring.kbx
export ANSIBLE_GALAXY_REQUIRED_VALID_SIGNATURE_COUNT=all
ansible-galaxy collection install my_namespace.my_collection --ignore-signature-status-code NO_PUBKEY

如果上述示例的验证失败,则只会显示除 NO_PUBKEY 之外的错误。

如果验证失败,则不会安装集合。可以使用--disable-gpg-verify或配置GALAXY_DISABLE_GPG_VERIFY禁用GnuPG签名验证。

安装旧版本的集合

一次只能安装一个版本的集合。默认情况下,ansible-galaxy安装最新版本。如果要安装特定版本,可以添加版本范围标识符。例如,要安装集合的1.0.0-beta.1版本

ansible-galaxy collection install my_namespace.my_collection:==1.0.0-beta.1

您可以使用,分隔多个范围标识符。使用单引号,以便shell传递整个命令,包括>!和其他运算符。例如,要安装大于或等于1.0.0且小于2.0.0的最新版本

ansible-galaxy collection install 'my_namespace.my_collection:>=1.0.0,<2.0.0'

Ansible将始终安装满足您指定的范围标识符的最新版本。您可以使用以下范围标识符

  • *:最新版本。这是默认值。

  • !=:不等于指定的版本。

  • ==:完全等于指定的版本。

  • >=:大于或等于指定的版本。

  • >:大于指定的版本。

  • <=:小于或等于指定的版本。

  • <:小于指定的版本。

注意

默认情况下,ansible-galaxy会忽略预发行版本。要安装预发行版本,必须使用==范围标识符显式要求。

使用requirements文件安装多个集合

您可以设置一个requirements.yml文件,以便使用一个命令安装多个集合。此文件是一个YAML文件,格式为

---
collections:
# With just the collection name
- my_namespace.my_collection

# With the collection name, version, and source options
- name: my_namespace.my_other_collection
  version: ">=1.2.0" # Version range identifiers (default: ``*``)
  source: ... # The Galaxy URL to pull the collection from (default: ``--api-server`` from cmdline)

您可以为每个集合条目指定以下键

  • 名称 (name)

  • 版本 (version)

  • 签名 (signatures)

  • 来源 (source)

  • 类型 (type)

version键使用安装旧版本的集合中记录的相同范围标识符格式。

signatures键接受签名源列表,这些源用于补充在集合安装和ansible-galaxy collection verify期间在Galaxy服务器上找到的签名源。签名源应该是包含分离签名的URI。--keyring CLI选项必须在指定签名时提供。

签名仅用于验证Galaxy服务器上的集合。用户提供的签名不用于验证从git仓库、源目录或tar.gz文件的URL/路径安装的集合。

collections:
  - name: namespace.name
    version: 1.0.0
    type: galaxy
    signatures:
      - https://examplehost.com/detached_signature.asc
      - file:///path/to/local/detached_signature.asc

type键可以设置为filegalaxygiturldirsubdirs。如果省略type,则name键用于隐式确定集合的来源。

使用type: git安装集合时,version键可以指分支或git commit-ish对象(提交或标签)。例如

collections:
  - name: https://github.com/organization/repo_name.git
    type: git
    version: devel

您还可以将角色添加到requirements.yml文件中的roles键下。这些值遵循旧版Ansible发行版中使用的requirements文件的相同格式。

---
roles:
  # Install a role from Ansible Galaxy.
  - name: geerlingguy.java
    version: "1.9.6" # note that ranges are not supported for roles


collections:
  # Install a collection from Ansible Galaxy.
  - name: geerlingguy.php_roles
    version: ">=0.9.3"
    source: https://galaxy.ansible.com

要同时使用一个命令安装角色和集合,请运行以下命令:

$ ansible-galaxy install -r requirements.yml

运行ansible-galaxy collection install -ransible-galaxy role install -r将分别仅安装集合或角色。

注意

当指定自定义集合或角色安装路径时,从同一requirements文件安装角色和集合将不起作用。在这种情况下,集合将被跳过,命令将像ansible-galaxy role install一样处理每个项目。

下载集合以供离线使用

要下载Galaxy中的集合tarball以供离线使用

  1. 导航到集合页面。

  2. 单击下载tarball

您可能还需要手动下载任何依赖的集合。

在剧本旁边安装集合

您可以将集合本地安装在项目中的剧本旁边,而不是安装在系统或AWX上的全局位置。

在剧本旁边使用本地安装的集合有一些好处,例如:

  • 确保项目的所有用户都使用相同的集合版本。

  • 使用自包含项目可以轻松地在不同环境之间移动。更高的可移植性还可以减少设置新环境时的开销。这在云环境中部署Ansible剧本时是一个优势。

  • 本地管理集合允许您将它们与剧本一起版本化。

  • 本地安装集合可以将它们与具有多个项目的环境中的全局安装隔离开。

以下是在collections/ansible_collections/目录结构下将集合保留在当前剧本旁边的示例。

./
├── play.yml
├── collections/
│   └── ansible_collections/
│               └── my_namespace/
│                   └── my_collection/<collection structure lives here>

有关集合目录结构的详细信息,请参阅集合结构

从源文件安装集合

Ansible还可以通过多种方式从源目录安装:

collections:
  # directory containing the collection
  - name: ./my_namespace/my_collection/
    type: dir

  # directory containing a namespace, with collections as subdirectories
  - name: ./my_namespace/
    type: subdirs

Ansible还可以通过直接指定输出文件来安装使用ansible-galaxy collection build收集或从Galaxy下载以供离线使用的集合

collections:
  - name: /tmp/my_namespace-my_collection-1.0.0.tar.gz
    type: file

注意

相对路径是从当前工作目录(您从中调用ansible-galaxy install -r的地方)计算的。它们不是相对于requirements.yml文件计算的。

从Git仓库安装集合

您可以从git仓库而不是从Galaxy或Automation Hub安装集合。作为开发人员,从git仓库安装允许您在创建tarball并发布集合之前查看您的集合。作为用户,从git仓库安装允许您使用尚未在Galaxy或Automation Hub中的集合或版本。此功能旨在作为对内容开发人员的最小捷径,如前所述,git仓库可能不支持ansible-galaxy CLI的全部功能。在复杂情况下,更灵活的选择可能是将仓库git clone到集合安装目录的正确文件结构中。

仓库必须包含galaxy.ymlMANIFEST.json文件。此文件提供元数据,例如集合的版本号和命名空间。

在命令行从Git仓库安装集合

要在命令行从git仓库安装集合,请使用仓库的URI,而不是集合名称或tar.gz文件的路径。使用前缀git+,除非您使用用户git进行SSH身份验证(例如,[email protected]:ansible-collections/ansible.windows.git)。您可以使用逗号分隔的git commit-ish语法指定分支、提交或标签。

例如

# Install a collection in a repository using the latest commit on the branch 'devel'
ansible-galaxy collection install git+https://github.com/organization/repo_name.git,devel

# Install a collection from a private GitHub repository
ansible-galaxy collection install [email protected]:organization/repo_name.git

# Install a collection from a local git repository
ansible-galaxy collection install git+file:///home/user/path/to/repo_name.git

警告

将凭据嵌入到git URI中是不安全的。使用安全的身份验证选项,以防止您的凭据在日志或其他地方暴露。

指定git仓库中的集合位置

从git仓库安装集合时,Ansible使用集合galaxy.ymlMANIFEST.json元数据文件来构建集合。默认情况下,Ansible搜索两条路径以查找集合galaxy.ymlMANIFEST.json元数据文件

  • 仓库的顶层。

  • 仓库路径中的每个目录(一层深)。

如果仓库的顶层存在galaxy.ymlMANIFEST.json文件,则Ansible使用该文件中的集合元数据来安装单个集合。

├── galaxy.yml
├── plugins/
│   ├── lookup/
│   ├── modules/
│   └── module_utils/
└─── README.md

如果存储库路径(一层深度)中的一个或多个目录中存在galaxy.ymlMANIFEST.json文件,Ansible 将安装每个包含元数据文件的目录作为一个集合。例如,Ansible 默认情况下会从以下存储库结构中安装 collection1 和 collection2

├── collection1
│   ├── docs/
│   ├── galaxy.yml
│   └── plugins/
│       ├── inventory/
│       └── modules/
└── collection2
    ├── docs/
    ├── galaxy.yml
    ├── plugins/
    |   ├── filter/
    |   └── modules/
    └── roles/

如果您有不同的存储库结构,或者只想安装一部分集合,您可以在 URI 的末尾(可选的逗号分隔的版本之前)添加一个片段,以指示元数据文件的位置。路径应该是一个目录,而不是元数据文件本身。例如,要仅从包含两个集合的示例存储库中安装 collection2

ansible-galaxy collection install git+https://github.com/organization/repo_name.git#/collection2/

在某些存储库中,主目录对应于命名空间

namespace/
├── collectionA/
|   ├── docs/
|   ├── galaxy.yml
|   ├── plugins/
|   │   ├── README.md
|   │   └── modules/
|   ├── README.md
|   └── roles/
└── collectionB/
    ├── docs/
    ├── galaxy.yml
    ├── plugins/
    │   ├── connection/
    │   └── modules/
    ├── README.md
    └── roles/

您可以安装此存储库中的所有集合,或从特定提交安装一个集合

# Install all collections in the namespace
ansible-galaxy collection install git+https://github.com/organization/repo_name.git#/namespace/

# Install an individual collection using a specific commit
ansible-galaxy collection install git+https://github.com/organization/repo_name.git#/namespace/collectionA/,7b60ddc245bc416b72d8ea6ed7b799885110f5e5

配置 ansible-galaxy 客户端

默认情况下,ansible-galaxy 使用 https://galaxy.ansible.com 作为 Galaxy 服务器(如 ansible.cfg 文件中 GALAXY_SERVER 中所列)。

您可以使用以下任一选项来配置 ansible-galaxy collection 以使用其他服务器(例如自定义 Galaxy 服务器)

  • GALAXY_SERVER_LIST 配置选项中设置服务器列表,该选项位于 配置文件 中。

  • 使用 --server 命令行参数限制为单个服务器。

要在 ansible.cfg 中配置 Galaxy 服务器列表

  1. [galaxy] 部分下添加 server_list 选项,以包含一个或多个服务器名称。

  2. 为每个服务器名称创建一个新部分。

  3. 为每个服务器名称设置 url 选项。

  4. 可选:为每个服务器名称设置 API 令牌。访问 https://galaxy.ansible.com/me/preferences 并单击 显示 API 密钥

注意

每个服务器名称的 url 选项必须以正斜杠 / 结尾。如果您未在 Galaxy 服务器列表中设置 API 令牌,请使用 --api-key 参数将令牌传递到 ansible-galaxy collection publish 命令。

以下示例显示了如何配置多个服务器

[galaxy]
server_list = my_org_hub, release_galaxy, test_galaxy, my_galaxy_ng

[galaxy_server.my_org_hub]
url=https://automation.my_org/
username=my_user
password=my_pass

[galaxy_server.release_galaxy]
url=https://galaxy.ansible.com/
token=my_token

[galaxy_server.test_galaxy]
url=https://galaxy-dev.ansible.com/
token=my_test_token

[galaxy_server.my_galaxy_ng]
url=http://my_galaxy_ng:8000/api/automation-hub/
auth_url=http://my_keycloak:8080/auth/realms/myco/protocol/openid-connect/token
client_id=galaxy-ng
token=my_keycloak_access_token

注意

您可以使用 --server 命令行参数在 server_list 中选择一个明确的 Galaxy 服务器,此参数的值应与服务器的名称匹配。要使用服务器列表中不存在的服务器,请将值设置为访问该服务器的 URL(服务器列表中的所有服务器都将被忽略)。此外,您不能对任何预定义的服务器使用 --api-key 参数。只有在您未定义服务器列表或在 --server 参数中指定 URL 的情况下,才能使用 api_key 参数。

Galaxy 服务器列表配置选项

GALAXY_SERVER_LIST 选项是一个按优先级排序的服务器标识符列表。搜索集合时,安装过程将按此顺序搜索,例如,首先搜索 automation_hub,然后搜索 my_org_hubrelease_galaxy,最后搜索 test_galaxy,直到找到集合为止。然后,在 [galaxy_server.{{ id }}] 部分下定义实际的 Galaxy 实例,其中 {{ id }} 是列表中定义的服务器标识符。然后,此部分可以定义以下键

  • url:要连接到的 Galaxy 实例的 URL。必需。

  • token:用于针对 Galaxy 实例进行身份验证的 API 令牌密钥。与 username 互斥。

  • username:用于针对 Galaxy 实例进行基本身份验证的用户名。与 token 互斥。

  • password:与 username 一起用于基本身份验证的密码。

  • auth_url:如果使用 SSO 身份验证(例如 galaxyNG),则为 Keycloak 服务器“token_endpoint”的 URL。与 username 互斥。需要 token

  • validate_certs:是否验证 Galaxy 服务器的 TLS 证书。除非提供 --ignore-certs 选项或将 GALAXY_IGNORE_CERTS 配置为 True,否则默认为 True。

  • client_id:用于身份验证的 Keycloak 令牌的 client_id。需要 auth_urltoken。默认的 client_id 是 cloud-services,用于与 Red Hat SSO 配合使用。

  • timeout:等待 Galaxy 服务器响应的最大秒数。

除了在 ansible.cfg 文件中定义这些服务器选项外,您还可以将它们定义为环境变量。环境变量的形式为 ANSIBLE_GALAXY_SERVER_{{ id }}_{{ key }},其中 {{ id }} 是服务器标识符的大写形式,{{ key }} 是要定义的键。例如,您可以通过设置 ANSIBLE_GALAXY_SERVER_RELEASE_GALAXY_TOKEN=secret_token 来为 release_galaxy 定义 token

对于仅使用一个 Galaxy 服务器的操作(例如,publishinfoinstall 命令),ansible-galaxy collection 命令使用 server_list 中的第一项,除非您使用 --server 参数传入显式服务器。

注意

ansible-galaxy 可以查找其他已配置的 Galaxy 实例上的依赖项,以支持集合可以依赖于另一个 Galaxy 实例中的集合的用例。

删除集合

如果您不再需要某个集合,只需从文件系统中删除其安装目录即可。路径可能因操作系统而异。

rm -rf ~/.ansible/collections/ansible_collections/community/general
rm -rf ./venv/lib/python3.9/site-packages/ansible_collections/community/general