禁用或删除 VM 和映像中的 Linux 代理

适用于:✔️ Linux VM ✔️ 灵活规模集

在删除 Linux 代理之前,你必须了解在删除 Linux 代理后 VM 将无法执行哪些操作。

Azure 虚拟机 (VM) 扩展是小型应用程序,可在 Azure VM 上提供部署后配置和自动化任务。扩展由 Azure 控制平面安装并管理。 Azure Linux 代理的职责是处理平台扩展命令并确保 VM 中的扩展处于正确状态。

Azure 平台可承载许多扩展,其中包括 VM 配置、监视、安全性和实用工具应用程序。 第一方和第三方扩展都有很大的选择范围,使用扩展的主要方案示例包括:

  • 支持第一方 Azure 服务,例如 Azure 备份、监视、磁盘加密、安全性、站点复制,等等。
  • SSH/密码重置
  • VM 配置 - 运行自定义脚本,安装 Chef、Puppet 代理,等等。
  • 第三方产品,例如 AV 产品、VM 漏洞工具、VM 和应用监视工具。
  • 可以使用新的 VM 部署捆绑扩展。 例如,它们可能属于大型部署中的一部分,在 VM 预配上配置应用程序,或针对任何受支持的扩展操作系统后部署运行。

禁用扩展处理

可以通过多种方式来禁用扩展处理(具体取决于你的需求),但在继续之前,必须删除部署到 VM 的所有扩展,例如,可以使用 Azure CLI 执行列出删除操作:

az vm extension delete -g MyResourceGroup --vm-name MyVm -n extension_name

注意

如果未执行上述操作,则平台会尝试发送扩展配置并在 40 分钟后超时。

在控制平面中禁用

如果你不确定将来是否需要扩展,则可以保留 VM 上安装的 Linux 代理,然后从平台禁用扩展处理功能。 这是 Microsoft.Compute api 版本 2018-06-01 或更高版本中提供的选项,不依赖于所安装的 Linux 代理版本。

az vm update -g <resourceGroup> -n <vmName> --set osProfile.allowExtensionOperations=false

可以通过上述命令轻松地从平台重新启用此扩展处理,但启用时请将其设置为“true”。

从正在运行的 VM 中删除 Linux 代理

请确保先从 VM 中删除所有现有扩展,如上所述。

步骤 1:删除 Azure Linux 代理

如果只是删除 Linux 代理,而不删除关联的配置项目,则可在以后重新安装。 以 root 身份运行以下命令之一,以便删除 Azure Linux 代理:

对于 Ubuntu 18.04+

sudo apt -y remove walinuxagent

对于 CentOS 7.X、8.X 和 9.X

sudo yum -y remove WALinuxAgent

对于 SUSE 12.X、15.X

sudo zypper --non-interactive remove python-azure-agent

步骤 2:(可选)删除 Azure Linux 代理项目

重要

你可以删除 Linux 代理的所有关联项目,但这意味着你以后无法重新安装它。 因此,强烈建议你首先考虑禁用 Linux 代理,只使用以上方法删除 Linux 代理。

如果你知道以后不会再重新安装 Linux 代理,则可以运行以下命令:

对于 Ubuntu 18.04+

sudo pt -y purge walinuxagent
sudo cp -rp /var/lib/waagent /var/lib/waagent.bkp
sudo rm -rf /var/lib/waagent
sudo rm -f /var/log/waagent.log

对于 CentOS 7.X、8.X、9.X

sudo yum -y remove WALinuxAgent
sudo rm -f /etc/waagent.conf.rpmsave
sudo rm -rf /var/lib/waagent
sudo rm -f /var/log/waagent.log

对于 SUSE 12.X、15.X

sudo zypper --non-interactive remove python-azure-agent
sudo rm -f /etc/waagent.conf.rpmsave
sudo rm -rf /var/lib/waagent
sudo rm -f /var/log/waagent.log

准备不含 Linux 代理的映像

如果你有一个已包含 cloud-init 的映像,并且你想要删除 Linux 代理,但仍使用 cloud-init 进行预配,请以 root 身份运行步骤 2 中的步骤(步骤 3 为可选)来删除 Azure Linux 代理,然后通过以下命令删除 cloud-init 配置和缓存的数据,并准备 VM 以创建自定义映像。

sudo cloud-init clean --logs --seed

取消预配并创建映像

Linux 代理能够通过步骤“waagent -deprovision+user”清理一些现有的映像元数据,但在将其删除后,你需要执行如下操作,并删除其中的任何其他敏感数据。

  • 删除所有现有的 ssh 主机密钥

    sudo rm /etc/ssh/ssh_host_*key*
    
  • 删除管理员帐户

    sudo touch /var/run/utmp
    sudo userdel -f -r <admin_user_account>
    
  • 删除 root 密码

    sudo passwd -d root
    

完成上述操作后,可以使用 Azure CLI 创建自定义映像。

创建常规托管映像

az vm deallocate -g <resource_group> -n <vm_name>
az vm generalize -g <resource_group> -n <vm_name>
az image create -g <resource_group> -n <image_name> --source <vm_name>
az sig image-version create \
    -g $sigResourceGroup
    --gallery-name $sigName
    --gallery-image-definition $imageDefName
    --gallery-image-version 1.0.0
    --managed-image /subscriptions/00000000-0000-0000-0000-00000000xxxx/resourceGroups/imageGroups/providers/images/MyManagedImage

从不包含 Linux 代理的映像创建 VM

从不包含 Linux 代理的映像创建 VM 时,需要确保 VM 部署配置指示此 VM 上不支持扩展。

注意

如果未执行上述操作,则平台会尝试发送扩展配置并在 40 分钟后超时。

若要在禁用扩展的情况下部署 VM,你可以将 Azure CLI 与 --enable-agent 结合使用。

az vm create \
    --resource-group $resourceGroup \
    --name $prodVmName \
    --image OpenLogic:CentOS:7.7:latest \
    --admin-username azadmin \
    --ssh-key-value "$sshPubkeyPath" \
    --enable-agent false

另外,可以使用 Azure 资源管理器 (ARM) 模板,通过设置 "provisionVMAgent": false, 来执行此操作。

"osProfile": {
    "computerName": "[parameters('virtualMachineName')]",
    "adminUsername": "[parameters('adminUsername')]",
    "linuxConfiguration": {
        "disablePasswordAuthentication": "true",
        "provisionVMAgent": false,
        "ssh": {
            "publicKeys": [
                {
                    "path": "[concat('/home/', parameters('adminUsername'), '/.ssh/authorized_keys')]",
                    "keyData": "[parameters('adminPublicKey')]"

后续步骤

有关详细信息,请参阅预配 Linux