适用于 Linux 的 VMAccess 扩展
VMAccess 扩展用于对管理用户进行管理、配置 SSH 以及检查或修复 Azure Linux 虚拟机上的磁盘。 该扩展集成了 Azure 资源管理器模板。 还可以使用 Azure CLI、Azure PowerShell、Azure 门户和 Azure 虚拟机 REST API 调用它。
本文介绍如何通过 Azure CLI 和 Azure 资源管理器模板运行 VMAccess 扩展。 本文还提供针对 Linux 系统的疑难解答步骤。
注意
如果你在安装 Microsoft Entra 登录扩展后使用 VMAccess 扩展重置 VM 的密码,请重新运行 Microsoft Entra 登录扩展,为 VM 重新启用 Azure AD 登录。
先决条件
支持的 Linux 分发
Linux 发行版 | x64 | ARM64 |
---|---|---|
Alma Linux | 9.x+ | 9.x+ |
Debian | 10+ | 11.x+ |
Azure Linux | 2.x | 2.x |
OpenSUSE | 12.3+ | 不支持 |
Rocky Linux | 9.x+ | 9.x+ |
SLES | 12.x+、15.x+ | 15.x SP4+ |
Ubuntu | 18.04+、20.04+、22.04+ | 20.04+、22.04+ |
提示
- VMAccess 旨在重新获得对 VM 的访问权限(如果丢失了该权限)。 基于此原则,它会向用户名字段中指定的帐户授予 sudo 权限。 如果不希望用户获得 sudo 权限,请登录到 VM 并使用内置工具(例如 usermod、chage 等)管理非特权用户。
- 只能向一台 VM 应用一个扩展版本。 要运行另一个操作,可使用新配置更新现有扩展。
- 在用户更新期间,VMAccess 会在事先备份
sshd_config
文件后备份该文件。 要还原原始的已备份 SSH 配置,请在将restore_backup_ssh
设置为True
后运行 VMAccess。
扩展架构
VMAccess 扩展配置包括用户名、密码、SSH 密钥等的设置。可将此信息存储在配置文件中、在命令行中指定该信息,或者将其包括在 Azure 资源管理器模板中。 以下 JSON 架构包含可用于公共和受保护设置的所有属性。
{
"type": "Microsoft.Compute/virtualMachines/extensions",
"name": "<name>",
"apiVersion": "2023-09-01",
"location": "<location>",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', <vmName>)]"
],
"properties": {
"publisher": "Microsoft.OSTCExtensions",
"type": "VMAccessForLinux",
"typeHandlerVersion": "1.5",
"autoUpgradeMinorVersion": true,
"settings": {
"check_disk": true,
"repair_disk": false,
"disk_name": "<disk-name>",
},
"protectedSettings": {
"username": "<username>",
"password": "<password>",
"ssh_key": "<ssh-key>",
"reset_ssh": false,
"remove_user": "<username>",
"expiration": "<expiration>",
"remove_prior_keys": false,
"restore_backup_ssh": true
}
}
}
属性值
名称 | 值/示例 | 数据类型 |
---|---|---|
apiVersion | 2023-09-01 | date |
publisher | Microsoft.OSTCExtensions | string |
type | VMAccessForLinux | string |
typeHandlerVersion | 1.5 | int |
设置属性值
名称 | 数据类型 | 描述 |
---|---|---|
check_disk | boolean | 是否检查磁盘(可选)。 只能将介于 check_disk 和 repair_disk 之间的一个设置为 true。 |
repair_disk | boolean | 是否检查磁盘(可选)。 只能将介于 check_disk 和 repair_disk 之间的一个设置为 true。 |
disk_name | string | 要修复的磁盘的名称(当 repair_disk 为 true 时是必需的)。 |
username | string | 要管理的用户的名称(用户帐户上的所有操作都需要)。 |
password | string | 要为用户帐户设置的密码。 |
ssh_key | string | 要为用户帐户添加的 SSH 公钥。 SSH 密钥可以采用 ssh-rsa 、ssh-ed25519 或 .pem 格式。 |
reset_ssh | boolean | 是否重置 SSH。 如果为 true ,它会将 sshd_config 文件替换为与该发行版的默认 SSH 配置对应的内部资源文件。 |
remove_user | string | 要移除的用户的名称。 不能与 reset_ssh 、restore_backup_ssh 和 password 一起使用。 |
expiration | string | 要为帐户设置的过期日期,格式为 yyyy-mm-dd 。 默认值为“从不”。 |
remove_prior_keys | boolean | 添加新密钥时是否移除旧的 SSH 密钥。 必须与 ssh_key 一起使用。 |
restore_backup_ssh | boolean | 是否还原原始备份的 sshd_config。 |
模板部署
可使用 Azure 资源管理器 (ARM) 模板部署 Azure VM 扩展。 上一部分中详细说明的 JSON 架构可用于 ARM 模板,以在模板部署期间运行 VMAccess 扩展。 可在 GitHub 上找到包含 VMAccess 扩展的示例模板。
必须将虚拟机扩展的 JSON 配置嵌套在该模板的虚拟机资源片段中,具体来说是嵌套在虚拟机模板的 "resources": []
对象和 "virtualMachineProfile":"extensionProfile":{"extensions" :[]
对象下的虚拟机规模集。
Azure CLI 部署
使用 Azure CLI VM 用户命令
az vm user 下的以下 CLI 命令使用 VMAccess 扩展。 要使用这些命令,需要安装最新的 Azure CLI,并使用 az login 登录到 Azure 帐户。
更新 SSH 密钥
以下示例更新名为 myVM
的 VM 上用户 azureUser
的 SSH 密钥:
az vm user update \
--resource-group myResourceGroup \
--name myVM \
--username azureUser \
--ssh-key-value ~/.ssh/id_rsa.pub
注意
az vm user update
命令将新公钥文本追加到 VM 上管理员用户的 ~/.ssh/authorized_keys
文件。 此命令不会替换或删除任何现有的 SSH 密钥。 此命令不会使用 VMAccess 扩展移除部署时设置的先前密钥或后续更新。
重置密码
以下示例重置名为 myVM
的 VM 上用户 azureUser
的密码:
az vm user update \
--resource-group myResourceGroup \
--name myVM \
--username azureUser \
--password myNewPassword
重启 SSH
下面的示例将在名为 myVM
的 VM 上重启 SSH 守护程序,并将 SSH 配置重置为默认值:
az vm user reset-ssh \
--resource-group myResourceGroup \
--name myVM
注意
az vm user reset-ssh
命令可将 sshd_config 文件替换为内部资源目录中的默认配置文件。 此命令不会还原在虚拟机上找到的原始 SSH 配置。
创建管理员/sudo 用户
以下示例创建名为 myNewUser
、具有 sudo 权限的用户 。 此帐户使用 SSH 密钥在名为 myVM
的 VM 上进行身份验证。 丢失或忘记当前凭据时,此方法有助于重新获取对 VM 的访问权限。 作为最佳做法,应限制具有 sudo 权限的帐户 。
az vm user update \
--resource-group myResourceGroup \
--name myVM \
--username myNewUser \
--ssh-key-value ~/.ssh/id_rsa.pub
删除用户
以下示例将删除名为 myVM
的 VM 上名为 myNewUser
的用户:
az vm user delete \
--resource-group myResourceGroup \
--name myVM \
--username myNewUser
使用 Azure CLI VM/VMSS 扩展命令
还可以使用 az vm extension set 和 az vmss extension set 命令通过指定配置运行 VMAccess 扩展。
az vm extension set \
--resource-group myResourceGroup \
--vm-name myVM \
--name VMAccessForLinux \
--publisher Microsoft.OSTCExtensions \
--version 1.5 \
--settings '{"check_disk":true}'
--protected-settings '{"username":"user1","password":"userPassword"}'
参数 --settings
和 --protected-settings
也接受 JSON 文件路径。 例如,要更新用户的 SSH 公钥,请创建名为 update_ssh_key.json
的 JSON 文件并按以下格式添加设置。 将文件中的值替换为自己的信息:
{
"username":"azureuser",
"ssh_key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCZ3S7gGp3rcbKmG2Y4vGZFMuMZCwoUzZNGxxxxxx2XV2x9FfAhy8iGD+lF8UdjFX3t5ebMm6BnnMh8fHwkTRdOt3LDQq8o8ElTBrZaKPxZN2thMZnODs5Hlemb2UX0oRIGRcvWqsd4oJmxsXa/Si98Wa6RHWbc9QZhw80KAcOVhmndZAZAGR+Wq6yslNo5TMOr1/ZyQAook5C4FtcSGn3Y+WczaoGWIxG4ZaWk128g79VIeJcIQqOjPodHvQAhll7qDlItVvBfMOben3GyhYTm7k4YwlEdkONm4yV/UIW0la1rmyztSBQIm9sZmSq44XXgjVmDHNF8UfCZ1ToE4r2SdwTmZv00T2i5faeYnHzxiLPA3Enub7xxxxxxwFArnqad7MO1SY1kLemhX9eFjLWN4mJe56Fu4NiWJkR9APSZQrYeKaqru4KUC68QpVasNJHbuxPSf/PcjF3cjO1+X+4x6L1H5HTPuqUkyZGgDO4ynUHbko4dhlanALcriF7tIfQR9i2r2xOyv5gxJEW/zztGqWma/d4rBoPjnf6tO7rLFHXMt/DVTkAfn5wxxtLDwkn5FMyvThRmex3BDf0gujoI1y6cOWLe9Y5geNX0oj+MXg/W0cXAtzSFocstV1PoVqy883hNoeQZ3mIGB3Q0rIUm5d9MA2bMMt31m1g3Sin6EQ== azureuser@myVM"
}
通过以下命令运行 VMAccess 扩展:
az vm extension set \
--resource-group myResourceGroup \
--vm-name myVM \
--name VMAccessForLinux \
--publisher Microsoft.OSTCExtensions \
--version 1.5 \
--protected-settings update_ssh_key.json
Azure PowerShell 部署
可以使用 Azure PowerShell 将 VMAccess 扩展部署到现有虚拟机或虚拟机规模集。 可以通过运行以下项将扩展部署到 VM:
$username = "<username>"
$sshKey = "<cert-contents>"
$settings = @{"check_disk" = $true};
$protectedSettings = @{"username" = $username; "ssh_key" = $sshKey};
Set-AzVMExtension -ResourceGroupName "<resource-group>" `
-VMName "<vm-name>" `
-Location "<location>" `
-Publisher "Microsoft.OSTCExtensions" `
-ExtensionType "VMAccessForLinux" `
-Name "VMAccessForLinux" `
-TypeHandlerVersion "1.5" `
-Settings $settings `
-ProtectedSettings $protectedSettings
还可以使用字符串提供和修改扩展设置:
$username = "<username>"
$sshKey = "<cert-contents>"
$settingsString = '{"check_disk":true}';
$protectedSettingsString = '{"username":"' + $username + '","ssh_key":"' + $sshKey + '"}';
Set-AzVMExtension -ResourceGroupName "<resource-group>" `
-VMName "<vm-name>" `
-Location "<location>" `
-Publisher "Microsoft.OSTCExtensions" `
-ExtensionType "VMAccessForLinux" `
-Name "VMAccessForLinux" `
-TypeHandlerVersion "1.5" `
-SettingString $settingsString `
-ProtectedSettingString $protectedSettingsString
要部署到虚拟机规模集,请运行以下命令:
$resourceGroupName = "<resource-group>"
$vmssName = "<vmss-name>"
$protectedSettings = @{
"username" = "azureUser"
"password" = "userPassword"
}
$publicSettings = @{
"repair_disk" = $true
"disk_name" = "<disk_name>"
}
$vmss = Get-AzVmss `
-ResourceGroupName $resourceGroupName `
-VMScaleSetName $vmssName
Add-AzVmssExtension -VirtualMachineScaleSet $vmss `
-Name "<extension-name>" `
-Publisher "Microsoft.OSTCExtensions" `
-Type "VMAccessForLinux" `
-TypeHandlerVersion "1.5"" `
-AutoUpgradeMinorVersion $true `
-Setting $publicSettings `
-ProtectedSetting $protectedSettings
Update-AzVmss `
-ResourceGroupName $resourceGroupName `
-Name $vmssName `
-VirtualMachineScaleSet $vmss
故障排除和支持
VMAccess 扩展日志存在于 VM 本地,并且在进行故障排除时,能够提供丰富的信息。
位置 | 说明 |
---|---|
/var/log/waagent.log | 包含 Linux 代理中的日志,并显示何时更新扩展。 我们可以检查它以确保扩展运行。 |
/var/log/azure/Microsoft.OSTCExtensions.VMAccessForLinux/* | VMAccess 扩展会生成可在此处找到的日志。 该目录包含 CommandExecution.log ,可在其中找到执行的每个命令及其结果,以及包含每个执行的单个日志的 extension.log 。 |
/var/lib/waagent/Microsoft.OSTCExtensions.VMAccessForLinux-<最新版本>/config/* | VMAccess VM 扩展的配置和二进制文件。 |
还可以运行以下命令来检索 VMAccess 扩展的执行状态以及给定 VM 上的其他扩展:
az vm extension list --resource-group myResourceGroup --vm-name myVM -o table
如果需要更多帮助,可以联系 Azure 社区支持中的 Azure 专家。 或者,你也可以提出 Azure 支持事件。 转到 Azure 门户,然后选择“获取支持”。 有关 Azure 支持的详细信息,请阅读 Azure 支持计划 FAQ。
后续步骤
要查看代码、当前版本和其他文档,请参阅《VMAccess Linux - GitHub》。