使用 cloud-init 在 Azure 的 Linux VM 中更新和安装包

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指导

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

本文演示如何在 Azure 中使用 cloud-init 在预配时间更新 Linux 虚拟机 (VM) 或虚拟机规模集上的包。 Azure 预配资源后,这些 cloud-init 脚本即会在第一次启动时运行。 有关 cloud-init 如何在 Azure 以及受支持的 Linux 发行版中本机工作的详细信息,请参阅 cloud-init 概述

使用 cloud-init 更新 VM

出于安全目的,你需要配置 VM,以便在首次启动时应用最新的更新。 由于 cloud-init 支持不同的 Linux 发行版,因此无需为包管理器指定 aptzypperyum。 相反,你需要定义 package_upgrade,并让 cloud-init 进程确定正在使用的发行版的适当机制。

就此示例来说,我们将使用 Azure CLI。 若要查看操作中的升级进程,请创建一个名为“cloud_init_upgrade.txt”的文件并粘贴下面的配置。 可使用任何想要使用的编辑器。 请确保已正确复制整个 cloud-init 文件,尤其是第一行。

复制下面的文本并将其粘贴到 cloud_init_upgrade.txt 文件中。 请确保已正确复制整个 cloud-init 文件,尤其是第一行。

#cloud-config
package_upgrade: true
packages:
- httpd

在部署之前,需要使用 az group create 命令创建资源组。 Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 以下示例在“chinaeast” 位置创建名为“myResourceGroup” 的资源组。

az group create --name myResourceGroup --location chinanorth

现在,使用 az vm create 创建 VM,并通过 --custom-data 参数指定 cloud-init 文件,如下所示:

az vm create \
  --resource-group myResourceGroup \
  --name vmName \
  --image imageCIURN \
  --custom-data cloud_init_upgrade.txt \
  --admin-username azureuser \
  --generate-ssh-keys

注意

相应地替换“myResourceGroup”、“vmName”和“imageCIURN”值。 确保选择了包含 Cloud-init 的映像。

通过 SSH 连接到 VM 的公共 IP 地址显示在先前命令的输出中。 按如下所示输入自己的用户publicIpAddress

ssh <user>@<publicIpAddress>

运行包管理工具并检查更新:

  • 执行以下命令以确认没有挂起的更新
sudo yum check-update

由于 cloud-init 在启动时已检查和安装更新,因此,应没有要应用的其他更新。

  • 可以通过运行以下命令并查看输出来查看更新过程、更改的包数量以及 httpd 的安装。
sudo yum history
ID     | Command line                                | Date and time    | Action(s)      | Altered
--------------------------------------------------------------------------------------------------
     3 | -y install httpd                            | 2022-02-18 18:30 | Install        |    7
     2 | -y upgrade                                  | 2022-02-18 18:23 | I, O, U        |  321 EE
     1 |                                             | 2021-02-04 19:20 | Install        |  496 EE

后续步骤

有关配置更改的其他 cloud-init 示例,请参阅以下文章: