Partager via

使用 Ansible 大规模将计算机连接到 Azure Arc

本文介绍如何使用 azure.azcollection 中包含的 Azure Arc Ansible 角色大规模将 Linux 和 Windows 计算机连接到 Azure Arc。 Azure Arc Ansible 角色可自动安装 Azure Connected Machine 代理,并将每个目标计算机注册到 Azure Arc。这样就可以跨大型环境实现一致的可重复载入,而无需交互式登录或手动安装步骤。

Azure Arc Ansible 角色可与 Ansible Core 或 Ansible 自动化平台(AAP)配合使用。 本文介绍这两个选项,并介绍如何使用每个选项将计算机大规模载入 Azure Arc。

概述

azure_arc角色安装 Azure Connected Machine 代理,并在指定的资源组和订阅中向 Azure Arc 注册每个主机。 注册后,计算机将作为已启用 Arc 的服务器显示在 Azure 中,可以使用 Azure Policy、更新管理器和监视器等 Azure 服务进行管理。 Azure Arc Ansible 角色用于将计算机载入 Azure Arc。它不会在载入后自动发现计算机或替换基于 Azure Policy 的管理。

先决条件

在使用 Azure Arc Ansible 角色之前,请确保满足以下要求:

Azure权限

Ansible(Azure CLI 用户、服务主体或托管标识)使用的标识必须在订阅或资源组范围内分配 Azure Connected Machine Onboarding 角色

此外,订阅必须 注册以下资源提供程序

  • Microsoft.HybridCompute
  • Microsoft.GuestConfiguration

Ansible 先决条件

在运行 Azure Arc Ansible 角色之前,请确保:

  • 为将计算机启用 Arc,需与指定的 Azure Arc URL 建立网络连接。 查看并解决适用的 网络要求。 若要将网络或防火墙中必须列入允许列表的 Azure Arc URL 的数量从约 20 个减少到 7 个。
  • Ansible 用于连接到目标计算机的帐户必须具有管理员权限才能安装软件和管理系统服务(例如 Linux 上的根或 sudo 访问权限)。

角色变量

Azure Arc 角色支持以下变量:

Variable Description
azure_arc_resource_group 将进行注册的设备所在的资源组
azure_arc_subscription_id Azure 订阅 ID
azure_arc_tenant_id Azure 租户 ID
azure_arc_location Arc 资源的 Azure 区域(默认为资源组位置)
azure_arc_cloud 要使用的 Azure 云(默认值:AzureCloud)
azure_arc_tags 应用于 Arc 资源的标记(默认值: { archost: "true" }
proxy 可选代理配置(主机名和端口)。 示例: http://proxy.contoso.com:8080

身份验证选项

Azure Arc 角色支持自动化方案的多种身份验证方法。 本文介绍最常见的选项,包括基于 Azure CLI 的身份验证和托管标识。

Azure CLI 凭据

在 Ansible 控制节点上使用当前已登录的 Azure CLI 标识。 对于交互式使用和开发环境,建议使用此选项。 在您的操作手册中设置以下内容:

auth_source: cli

运行 playbook 之前,请使用此 Azure CLI 命令登录到 Azure(这将打开用于登录的新浏览器窗口):

az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud   //means return to Public Azure.

如果没有用于登录的浏览器,请使用此 Azure CLI 命令通过设备登录到 Azure:

az cloud set -n AzureChinaCloud
az login --use-device-code
# az cloud set -n AzureCloud   //means return to Public Azure.

登录后,可以验证和/或设置订阅:

az account show
az account set --subscription "<subscription-id-or-name>"

托管标识身份验证

如果 Ansible 控制节点在 Azure 虚拟机或已启用 Azure Arc 的服务器上运行,则可以使用系统分配的托管标识进行身份验证。 每个已启用 Azure Arc 的服务器在连接到 Azure Arc 时自动接收其自己的系统分配托管标识。此标识特定于计算机,表示在向 Azure 服务进行身份验证时该服务器。 默认情况下,托管标识没有 Azure RBAC 权限。 在对 Azure Arc Ansible 角色使用托管标识身份验证之前,必须显式授予托管标识加入计算机的权限。 托管标识是生产自动化的推荐身份验证方法,因为它无需存储凭据或机密。

将托管标识分配给入门角色

在运行 playbook 之前,必须在订阅或资源组范围内为 Ansible 控制节点的托管标识分配 Azure Connected Machine Onboarding 角色

选项 1:Azure 门户

使用 Azure 门户将所需的角色分配给 Ansible 控制节点的托管标识。 此选项适用于 Azure VM 托管标识 已启用 Arc 的服务器托管标识。 已启用 Arc 功能的服务器标识支持此流程,因为 Arc 会在针对机器标识的 Microsoft Entra ID 中创建服务主体。

  1. 转到 Azure 门户

  2. 导航到你要将计算机加入到的订阅资源组

  3. 选择 “访问控制”(IAM)。

  4. 选择 “添加” → “添加角色分配”。

  5. 选择角色: Azure Connected Machine Onboarding。

  6. 若要 分配访问权限,请选择 “托管标识”。

  7. 选择 虚拟机 (如果控制节点是 Azure VM)或 已启用 Azure Arc 的服务器。

  8. 选取控制节点资源。

  9. 单击“保存”。

选项 2:Azure CLI

使用 Azure CLI 命令将所需角色分配给 Ansible 控制节点的托管身份。

获取托管标识主体 ID

托管标识主体 ID 是 Ansible 控制节点系统分配的托管标识的 Microsoft Entra 对象 ID(主体 ID)。

如果 Ansible 控制节点是已启用 Arc 的服务器,请使用以下 Azure CLI 命令:

az connectedmachine show \
--name \<arc-server-name\> \
--resource-group \<rg-name\> \
--query identity.principalId \
-o tsv

如果 Ansible 控制节点是 Azure VM,请使用以下 Azure CLI 命令:

az vm show \
--name \<vm-name\> \
--resource-group \<rg-name\> \
--query identity.principalId \
-o tsv

将角色分配给托管标识

基于您的 Arc 入门体验范围,您需要为订阅或资源组分配相应的角色。 您需要上一步中的托管标识主体 ID 作为--assignee的值。 下面是基于所选范围的相应 Azure CLI 命令:

订阅范围:这将在订阅层面设置 Azure 连接机器入门角色:

az role assignment create \
--assignee \<identity-principal-id> \
--role "Azure Connected Machine Onboarding" \
--scope /subscriptions/<subscription-id> 

资源组范围:这将在资源组级别设置 Azure Connected Machine Onboarding 角色:

az role assignment create \
--assignee \<identity-principal-id> \
--role "Azure Connected Machine Onboarding" \
--scope /subscriptions/<subscription-id>/resourceGroups/<rg-name>

将 playbook 设置为使用托管标识

Ansible 控制节点的托管标识具有所需的角色后,可以在 playbook 中将其用作身份验证来源 - 无需交互式登录、密钥或环境变量。 若要在 playbook 中使用托管标识身份验证,请按如下所示设置身份验证源:

auth_source: msi

托管标识身份验证的工作原理

运行 playbook 时,Azure SDK 通过从本地元数据服务请求令牌进行身份验证。 Azure 虚拟机使用 Azure 实例元数据服务。 已启用 Azure Arc 的服务器使用 Azure Arc 混合实例元数据服务。 令牌表示控制节点的托管标识。 然后,Azure 将评估该标识是否有权创建和注册 Azure Arc 资源。

使用 Ansible 大规模部署 Azure Arc

Azure Arc Ansible 角色可与 Ansible Core 或 Ansible 自动化平台一起使用,以在大规模计算机上启用 Arc 功能。 本部分介绍如何在这两种情况下使用 Azure Arc 角色。 Azure Arc 角色是幂等的。 您可以在将新计算机添加到库存后重新运行 Playbook。 已连接到 Azure Arc 的计算机将被跳过。

使用 Ansible Core 大规模部署 Azure Arc

使用 Ansible Core 时,可以通过在清单中定义计算机组并跨这些组运行同一 playbook 来实现大规模载入。 每个主机执行一次 Azure Arc Ansible 角色,且该角色可以安全地在大量机器上运行。

选择身份验证方法

在运行 playbook 之前,请确定控制节点将使用的身份验证方法。 以下步骤中的示例显示了 Azure CLI(建议用于开发)和托管标识(建议用于生产)的选项。

定义清单

按环境或操作系统以逻辑方式对计算机进行分组。 清单文件可以是静态的(INI 或 YAML),也可以使用脚本或清单插件动态生成。 建议将计算机分组以轻松定位它们。 示例清单文件:

[arc_linux] 
linux-01 
linux-02 
linux-03 
[arc_windows] 
win-01 
win-02 

配置角色变量

创建组变量文件以定义计算机将加入的 Azure 环境。 这样可以确保您的 playbook 在不同环境中保持干净且可复用。 示例:group_vars/arc_linux.yml

azure_arc_resource_group: "my-arc-rg" 
azure_arc_subscription_id: "<your-subscription-id\>" 
azure_arc_tenant_id: "<your-tenant-id\>" 
azure_arc_location: "chinaeast2" 
azure_arc_tags: 
environment: "production" 
archost: "true"

编写行动方案

选择与环境匹配的身份验证选项。

在 Ansible 控制节点上使用已登录的 Azure CLI 标识。 运行 playbook 之前,需要登录到 Azure CLI。

示例:arc-onboard.yml

- name: Connect Linux machines to Azure Arc (CLI auth)

  hosts: arc_linux
  gather_facts: true

  vars:
    auth_source: cli

  roles:
    - role: azure.azcollection.azure_arc
      vars:
        azure_arc_resource_group: "{{ azure_arc_resource_group }}"
        azure_arc_subscription_id: "{{ azure_arc_subscription_id }}"
        azure_arc_tenant_id: "{{ azure_arc_tenant_id }}"
        azure_arc_location: "{{ azure_arc_location }}"
        azure_arc_tags: "{{ azure_arc_tags }}"

如果 Ansible 控制节点是已启用 Azure VM 或已启用 Arc 的服务器,且分配有托管标识,则无需执行其他登录步骤。 示例:arc-onboard.yml

- name: Connect Linux machines to Azure Arc (Managed Identity auth)

  hosts: arc_linux
  gather_facts: true

  vars:
    auth_source: msi

  roles:
    - role: azure.azcollection.azure_arc
      vars:
        azure_arc_resource_group: "{{ azure_arc_resource_group }}"
        azure_arc_subscription_id: "{{ azure_arc_subscription_id }}"
        azure_arc_tenant_id: "{{ azure_arc_tenant_id }}"
        azure_arc_location: "{{ azure_arc_location }}"
        azure_arc_tags: "{{ azure_arc_tags }}"

使用 Ansible 自动化平台大规模部署 Azure Arc

使用 Ansible 自动化平台(AAP)时,清单和主机组在平台中集中管理。 使用 AAP 时,无需维护本地清单文件。 建议对大型或动态环境使用 AAP。 AAP 支持自动从外部源(如虚拟化平台、云提供商或 CMDB 系统)发现计算机的清单。

设置您的 AAP 凭据以进行 Azure 身份验证

AAP 集中管理凭据。 使用以下身份验证方法之一在 AAP 中创建 Azure 资源管理器凭据。

身份验证方法 何时使用 备注
托管的标识 生产;AAP 执行环境在已启用 Azure VM 或已启用 Arc 的服务器上运行 推荐用于生产
服务主体 生产用; Azure 外部的通用用途或 AAP 需要客户端 ID 和机密

Azure CLI 凭据在 AAP 中不适用。 使用托管标识或服务主体实现基于 AAP 的自动化。 在 AAP 中创建 Azure 凭据:

  1. AAP Web UI 中,转到 “凭据 ”并选择“ 添加”。
  2. 凭据类型 设置为 Azure 资源管理器
  3. 对于 托管标识:启用 使用环境的托管标识。 对于 服务主体:输入订阅 ID、客户端 ID、客户端密码和租户 ID。
  4. 选择“保存”

配置库存

AAP 清单可以是静态的,也可以是动态的。 对于大型或动态环境,请使用构造的清单根据主机元数据自动对计算机进行分组。

选项 A:包含主机组的静态清单

  1. 在 AAP 中,转到清单> 添加> 清单,然后手动添加主机或从文件导入。
  2. 将 Linux 主机添加到名为arc_linux的组:
linux-server-01 
linux-server-02 
linux-server-03 

使用清单源(例如 VMware vSphere、AWS 或 Azure),并根据主机变量定义构造的组。 例如,自动对所有 Linux 计算机进行分组:

示例:constructed.yml

plugin: constructed 
groups: 
arc_linux: ansible_os_family == "RedHat" or ansible_os_family == "Debian"

与组条件匹配的新添加的计算机会自动包含在后续作业运行中。

创建项目

在 AAP 中,一个项目链接到包含您的剧本和角色需求文件的源代码控制存储库。

  1. 转到项目>添加。
  2. 将 SCM 类型设置为 Git。
  3. 输入存储库 URL。
  4. 选择“保存”。
  5. 确保存储库在根目录中包含requirements.yml文件,以安装 azure.azcollection:

示例:requirements.yml

collections: 
- name: azure.azcollection 
source: https://galaxy.ansible.com

编写 Arc 入职手册

将此操作手册存储在项目代码存储库中。 前面配置的 Azure 凭据在运行时由 AAP 自动注入 , 无需在 playbook 中硬编码机密。

选项 A:托管标识

在下面的示例中,auth_source 设置为托管身份。

- name: Connect machines to Azure Arc (AAP - Managed Identity)

  hosts: arc_linux
  gather_facts: true

  vars:
    auth_source: msi
    azure_arc_resource_group: "my-arc-rg"
    azure_arc_subscription_id: "<your-subscription-id>"
    azure_arc_tenant_id: "<your-tenant-id>"
    azure_arc_location: "chinaeast2"
    azure_arc_tags:
      environment: "production"
      archost: "true"

  roles:
    - role: azure.azcollection.azure_arc

选项 B:服务主体

设置 auth_source: env 后,该角色将使用在 AAP 作业模板中配置的 Azure 凭据。 服务主体值由 AAP 自动注入 - 无需在 playbook 中对其进行硬编码。

- name: Connect machines to Azure Arc (AAP - Service Principal)

  hosts: arc_linux
  gather_facts: true

  vars:
    auth_source: env
    azure_arc_resource_group: "my-arc-rg"
    azure_arc_subscription_id: "<your-subscription-id>"
    azure_arc_tenant_id: "<your-tenant-id>"
    azure_arc_location: "chinaeast2"
    azure_arc_tags:
      environment: "production"
      archost: "true"

  roles:
    - role: azure.azcollection.azure_arc

创建并运行作业模板

  1. 在 AAP 中,转到 “模板 > 添加 > 作业模板”。
  2. 配置作业模板字段,然后保存并启动作业。

AAP 作业模板字段

领域 价值
名称 将计算机连接到 Azure Arc
工作类型 运行
库存 您的资产(例如,arc_linux组)
项目 您的项目(链接到存储库)
剧本 arc-onboard.yml
Credentials Azure 资源管理凭证
Limit arc_linux(或留空以面向所有主机)

连续和大规模载入

由于 AAP 清单是动态维护的:

  • 新发现的计算机会自动包含在后续作业运行中。
  • 已连接到 Azure Arc 的计算机将被跳过(角色是幂等的)。 可以将相同的作业模板计划为定期运行,以便在将新计算机添加到环境中时持续载入新计算机。 计划作业模板定期运行(例如,夜间)以在将新计算机添加到环境时自动载入新计算机。

验证是否与 Azure Arc 连接

安装代理并将其配置为连接到已启用 Azure Arc 的服务器后,请转到 Azure 门户以验证目标主机中的服务器是否已成功连接。 在 Azure 门户中查看您的虚拟机。

后续步骤