无法在 ansible 中获取 azure key vault secret

Unable to obtain azure key vault secret in ansible

我尝试使用 azcollection 1.9.0.

从我的 ansible 4 剧本中的 azure key vault 获取秘密
- name: Get secret value
  azure_rm_keyvaultsecret_info:
    vault_uri: https://my-vault.vault.azure.net/
  register: kvSecret

根据 docs,结果应包含机密列表,其中 属性 称为 secret,其中包含机密值。

但是,结果集中不存在此 属性。这是我得到的结果:

{
    "changed": False,
    "secrets": [
        {
            "sid": "https: //my-vault.vault.azure.net/secrets/ssh-user-username",
            "version": "",
            "tags": {},
            "attributes": {
                "enabled": True,
                "not_before": None,
                "expires": None,
                "created": "2021-09-05T14:32:10+00:00",
                "updated": "2021-09-05T14:32:10+00:00",
                "recovery_level": "Recoverable+Purgeable"
            }
        }
    ],
    "failed": False
}

如果我尝试使用 name 选项获取这个确切的秘密,我会得到一个空的结果集。

我的保管库包含这个秘密,它有一个值,服务主体可以通过 IAM 使用角色 Key Vault ReaderKey Vault Secrets User.

访问我的密钥保管库

我在我的环境中对其进行了测试,我的服务主体拥有 Key vault reader 并且 Key vault 使用以下 yml 代码对用户进行保密。

---
- hosts: localhost
  connection: local
  collections:
    - azure.azcollection

  vars:
    vault_name: Testansumankeyvault01
    secret_name: adminPassword

  tasks:

  - name: Get Key Vault by name
    azure_rm_keyvault_info:
      resource_group: test-rg
      name: "{{ vault_name }}"
    register: keyvault

  - name: Set key vault URI fact
    set_fact: keyvaulturi="{{ keyvault['keyvaults'][0]['vault_uri'] }}"

  - name: Get secret value
    azure_rm_keyvaultsecret_info:
      vault_uri: "{{ keyvaulturi }}"
      name: "{{ secret_name }}"
    register: kvSecret

  - name: set secret fact
    set_fact: secretValue="{{ kvSecret['secrets'][0]['secret'] }}"

  - name: Output key vault secret
    debug: 
      msg="{{ secretValue }}"

参考:

Azure built-in roles - Azure RBAC | Microsoft Docs

Use Azure Key Vault to store VM secrets with Ansible | Microsoft Docs

原来这是身份验证的问题。 Ansible 正在通过 ssh 连接到我的远程机器,因此我需要为 azure 设置身份验证。我在我的 ansible 剧本中使用环境变量来执行此操作,但事实证明当剧本运行它的任务时它们没有设置。将它们显式传递给命令就可以了。