【问题标题】:Using Ansible in Azure to assign user assigned managed identities (UAMI) to VMs在 Azure 中使用 Ansible 将用户分配的托管标识 (UAMI) 分配给 VM
【发布时间】:2020-07-24 05:51:35
【问题描述】:

我在 Azure 环境中有一个用户分配的托管标识 (UAMI),我可以使用以下 azure-cli 命令以编程方式将其分配给我选择的任何 VM:

az vm identity assign --ids [Resource ID of VM] --identities [Resource ID of UAMI]

我现在的问题是有没有办法在 Ansible 中做到这一点?当我查看“azure_rm_virtualmachine”模块文档时,似乎没有办法在创建 VM 时分配 UAMI;即使有启用系统管理身份的功能。

我一直在查看“azure_rm_roleassignment”文档,但尽管我尝试通过各种方式为我的 VM 和 UAMI 插入 ID,Ansible 每次都会返回某种错误。例如,使用以下内容:

  - name: Create a role assignment
    azure_rm_roleassignment:
      scope: "/subscriptions/{{ subscriptionID }}/"
      assignee_object_id: "{{ VMresourceID }}"
      role_definition_id:
        "{{ UAMIresourceID }}"

错误消息是:“创建角色分配时出错:Azure 错误:InvalidPrincipalId\n消息:主体 ID 'XXX' 无效。主体 ID 必须是 GUID。”

有什么想法吗?提前致谢!

【问题讨论】:

  • 请用非敏感的错误信息更新 OP?
  • @error404 完成! :-D
  • 还有问题吗?它能解决你的问题吗?
  • @CharlesXu 见下面的 cmets

标签: azure ansible azure-managed-identity


【解决方案1】:

正如我所见,您使用 VM 资源 ID 设置了 assignee_object_id,我认为这是问题所在。无论您选择系统分配或用户分配的托管标识,assignee_object_id 都应该是它的对象 Id,而不是资源 Id。您可以通过 CLI 命令获取对象 ID:

az vm identity show -g group_name -n vm_name --query principalId -o tsv

查看有关assignee_object_id的更多详细信息。

【讨论】:

  • 当我运行 'az vm identity show -g [RG] -n [ServerName]' 时,它没有输出。但经过进一步挖掘,我认为这个 ansible 模块不是我正在寻找的。我尝试设置assignee_object_id = vmID(来自'vm show --ids [ResourceID] --query vmId')和role_definition_id = /subscriptions/{{ subID }}/providers/Microsoft.Authorization/roleDefinitions/{{ objIDofUAMI }},但随后我收到错误“ID X 的指定角色定义不存在
  • 此模块似乎只是用于将角色(即 Azure 中的一组权限)分配给身份(无论是系统管理的还是 UAMI)。不是简单地将身份分配给虚拟机之类的东西。似乎也没有任何其他可将 UAMI 分配给 VM 的 ansible 模块,所以我想我必须找到另一种方法
  • @sirjames2004 ansible模块与CLI命令az vm identity assign有关。 assignee_object_id 需要 VM 标识对象 Id,而不是 VM 资源 Id。而如果要使用虚拟机身份,则需要先启用虚拟机身份。如果没有,命令az vm identity show 给出空输出。
  • 除非启用该 VM 的 SYSTEM-managed 身份,否则不会设置 VM 的 principalId(即 VM 身份对象 Id),这是我一直试图避免做的事情跨度>
  • @sirjames2004 即使您使用用户分配的托管标识,也需要主体 ID。
【解决方案2】:

ansible 目前似乎不支持将 UAMI 分配给 VM 的方法;与 CLI 中的 az vm identity assign --ids [Resource ID of VM] --identities [Resource ID of UAMI] 一样。因此,作为权宜之计,我们暂时选择使用系统管理的身份。我在 ansible 中的 VM 创建中添加了以下内容:

azure_rm_virtualmachine:
  vm_identity: SystemAssigned
register: my_server_reg

那么下面给我的角色分配:

azure_rm_roleassignment:
  scope: "/subscriptions/{{ subscription_id }}/"
  assignee_object_id: "{{ my_server_reg.ansible_facts.azure_vm.identity.principalId }}"
  role_definition_id:
        "/subscriptions/{{ subscription_id }}/providers/Microsoft.Authorization/roleDefinitions/{{ blob_reader_roledef_id }}"

管理起来会更麻烦,但我目前没有看到任何其他替代方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-19
    • 2021-10-17
    • 2022-01-12
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多