11. 自定义凭据类型

作为具有超级用户访问权限的管理员,您可以使用 YAML/JSON 类定义以标准格式定义自定义凭据类型,允许将新的凭据类型分配给作业和库存更新。这允许您定义与现有凭据类型类似方式工作的自定义凭据类型。例如,您可以创建一种自定义凭据类型,它将第三方 Web 服务的 API 令牌注入环境变量,您的剧本或自定义库存脚本可以利用该变量。

自定义凭据支持以下注入其身份验证信息的方式

  • 环境变量

  • Ansible 附加变量

  • 基于文件的模板(例如,生成 .ini.conf 文件,其中包含凭据值)

您可以将一个 SSH 和多个云凭据附加到作业模板。每个云凭据必须是不同类型。换句话说,只允许一个 AWS 凭据、一个 GCE 凭据等。Vault 凭据和机器凭据是独立的实体。

注意

创建新的凭据类型时,您有责任避免 extra_varsenv 和文件命名空间中的冲突。此外,避免以 ANSIBLE_ 开头的环境变量或附加变量名称,因为它们是保留的。您必须拥有超级用户权限才能创建和编辑凭据类型 (CredentialType) 以及查看 CredentialType.injection 字段。

11.1. 从集合获取内容

一种“托管”的凭据类型 kind=galaxy 代表内容来源,用于在运行项目更新时(例如,galaxy.ansible.com、cloud.redhat.com、内部部署的 Automation Hub)获取在 requirements.yml 中定义的集合。这种新类型将代表一个 URL 和(可选)身份验证详细信息,这些信息在项目更新运行 ansible-galaxy collection install 时,根据 Ansible 文档 配置 ansible-galaxy 客户端 所述来构建环境变量。它包含直接映射到 Ansible Galaxy CLI 公开配置选项的字段,例如,每服务器。API 中的一个端点反映了组织级别这些凭据的有序列表

/api/v2/organizations/N/galaxy_credentials/

AWX 的安装以一种方式迁移现有的面向 Galaxy 的设置值,即在升级后,将创建适当的凭据并将其附加到每个组织。升级到最新版本后,每个在升级之前存在的组织现在都与它关联的(一个或多个)“Galaxy”凭据列表。

此外,在升级后,这些设置将不再从 /api/v2/settings/jobs/ 端点可见(或可编辑)。

即使 galaxy.ansible.com 不是组织列表中的第一个凭据,AWX 仍应继续直接从公共 Galaxy 获取角色。全局“Galaxy”设置不再在作业级别配置,而是在用户界面的组织级别配置。组织的“添加”和“编辑”窗口具有一个可选的 **凭据** 查找字段,用于 kind=galaxy 的凭据。

Create a new Organization with Galaxy Credentials

指定这些凭据的顺序非常重要,因为顺序会设置内容同步和查找的优先级。有关更多信息,请参见 创建新的组织。有关如何使用集合设置项目的详细信息,请参见 通过 Hub 使用集合

11.2. 向后兼容的 API 考虑因素

对 API 版本 2 (api/v2/) 的支持意味着作业模板与凭据之间的一对多关系(包括多云支持)。凭据可以使用 v2 API 进行过滤

$ curl "https://awx.example.org/api/v2/credentials/?credential_type__namespace=aws"

在 V2 CredentialType 模型中,关系定义如下

机器

SSH

Vault

Vault

网络

设置环境变量(例如,ANSIBLE_NET_AUTHORIZE

SCM

源代码控制

EC2、AWS

许多其他

Insights

Insights

Galaxy

galaxy.ansible.com、cloud.redhat.com

内部部署的 Automation Hub

11.3. 内容验证

AWX 使用 GNU Privacy Guard (GPG) 来验证内容。有关更多信息,请参阅 GNU Privacy 手册

11.4. 凭据类型入门

从左导航栏中单击 **凭据类型** 访问凭据。如果没有创建自定义凭据类型,则“凭据类型”视图将没有任何内容显示,并会提示您添加一个。

Credential Types view without any credential types populated

如果已创建凭据类型,则此页面将显示所有现有且可用的凭据类型的列表。

Credential Types list view with example credential types

要查看有关凭据类型的更多信息,请单击其名称或 **操作** 列中的编辑 (Edit button) 按钮。

每个凭据类型在 **输入配置** 字段和 **注入器配置** 字段(如果适用)中显示其自己的唯一配置。两种配置字段都支持 YAML 和 JSON 格式。

11.5. 创建新的凭据类型

要创建新的凭据类型

  1. 在 **凭据类型** 屏幕中单击 **添加** 按钮。

Create new credential type form

  1. 在 **名称** 和 **描述** 字段中输入相应的详细信息。

注意

创建新的凭据类型时,请勿将以 ANSIBLE_ 开头的保留变量名称用于 **输入** 和 **注入器** 的名称和 ID,因为它们对于自定义凭据类型无效。

  1. 在 **输入配置** 字段中,指定一个输入模式,该模式定义了该类型的有序字段集。格式可以是 YAML 或 JSON,如下所示

YAML

fields:
  - type: string
    id: username
    label: Username
  - type: string
    id: password
    label: Password
    secret: true
required:
  - username
  - password

JSON

{
"fields": [
  {
  "type": "string",
  "id": "username",
  "label": "Username"
  },
  {
  "secret": true,
  "type": "string",
  "id": "password",
  "label": "Password"
   }
  ],
 "required": ["username", "password"]
}

以下 JSON 格式的配置显示每个字段及其使用方法

{
  "fields": [{
    "id": "api_token",               # required - a unique name used to
                                     # reference the field value

    "label": "API Token",            # required - a unique label for the
                                     # field

    "help_text": "User-facing short text describing the field.",

    "type": ("string" | "boolean")   # defaults to 'string'

    "choices": ["A", "B", "C"]       # (only applicable to `type=string`)

    "format": "ssh_private_key"      # optional, can be used to enforce data
                                     # format validity for SSH private key
                                     # data (only applicable to `type=string`)

    "secret": true,                  # if true, the field value will be encrypted

    "multiline": false               # if true, the field should be rendered
                                     # as multi-line for input entry
                                     # (only applicable to `type=string`)
},{
    # field 2...
},{
    # field 3...
}],

"required": ["api_token"]            # optional; one or more fields can be marked as required
},

type=string 时,字段可以选择性地指定多个选项

{
  "fields": [{
      "id": "api_token",          # required - a unique name used to reference the field value
      "label": "API Token",       # required - a unique label for the field
      "type": "string",
      "choices": ["A", "B", "C"]
  }]
},
  1. 在 **注入器配置** 字段中,输入环境变量或附加变量,以指定凭据类型可以注入的值。格式可以是 YAML 或 JSON(请参见上一步中的示例)。以下 JSON 格式的配置显示每个字段及其使用方法

{
  "file": {
      "template": "[mycloud]\ntoken={{ api_token }}"
  },
  "env": {
      "THIRD_PARTY_CLOUD_API_TOKEN": "{{ api_token }}"
  },
  "extra_vars": {
      "some_extra_var": "{{ username }}:{{ password }}"
  }
}

凭据类型还可以生成临时文件以支持 .ini 文件或证书/密钥数据

{
  "file": {
      "template": "[mycloud]\ntoken={{ api_token }}"
  },
  "env": {
      "MY_CLOUD_INI_FILE": "{{ awx.filename }}"
  }
}

在此示例中,AWX 将写入一个包含以下内容的临时文件

[mycloud]\ntoken=SOME_TOKEN_VALUE

生成的文件的绝对文件路径将存储在名为 MY_CLOUD_INI_FILE 的环境变量中。

以下是如何在自定义凭据模板中引用多个文件的示例

输入

{
  "fields": [{
    "id": "cert",
    "label": "Certificate",
    "type": "string"
  },{
    "id": "key",
    "label": "Key",
    "type": "string"
  }]
}

注入器

  {
    "file": {
      "template.cert_file": "[mycert]\n{{ cert }}",
      "template.key_file": "[mykey]\n{{ key }}"
  },
  "env": {
      "MY_CERT_INI_FILE": "{{ awx.filename.cert_file }}",
      "MY_KEY_INI_FILE": "{{ awx.filename.key_file }}"
  }
}
  1. 完成后单击 **保存**。

  2. 向下滚动到屏幕底部,您新创建的凭据类型将出现在凭据类型列表中

Credential Types list view with newly created credential type shown

单击 Edit button 以修改操作列下的凭据类型选项。

注意

在“编辑”屏幕中,您可以修改详细信息或删除凭据。如果“删除”按钮呈灰色,则表示该凭据类型正在被凭据使用,您必须从使用它的所有凭据中删除该凭据类型,然后才能删除它。以下是一个这样的消息示例

Credential type delete confirmation
  1. 验证新创建的凭据类型是否可以在创建新凭据时从“凭据类型”选择窗口中选择

Newly created credential type selected from the credentials drop-down menu

有关如何创建新凭据的详细信息,请参阅凭据.