我需要通过 terraform 将自定义执行脚本安装到 Azure VM。但挑战是我们只能有一个(自定义)扩展。因此,我需要在添加新扩展之前删除所有现有扩展。 要删除扩展程序,我应该知道扩展程序的名称。下面是删除它的代码(如果我知道名称),效果很好。但如果自定义扩展不存在,这种方法就会失败。 问题是,如何查询并查找扩展程序是否存在?一种方法是使用“null_resource”。我想把它作为我最后的选择。想知道是否还有其他方式列出它们,尤其是自定义的?
resource "azapi_resource_action" "delete_vm_custom_extension" {
provider = azapi
for_each = local.vm_extensions
type = Microsoft.Compute/virtualMachines/extensions@2023-03-01
resource_id = "/subscriptions/${data.azurerm_client_config.this.subscription_id}/resourceGroups/${var.data_factory.resource_group_name}/providers/Microsoft.Compute/virtualMachines/${each.value.vm}/extensions/${each.value.custom_extension}"
method = "DELETE"
response_export_values = ["*"]
}
如果我能用azapi方法实现同样的效果那就太好了
我需要通过 terraform 将自定义执行脚本安装到 Azure VM,但挑战是我们只能有一个(自定义)扩展。因此,我需要在添加新扩展之前删除所有现有扩展。删除扩展程序。
由于在
Azure VM
上创建新扩展之前没有直接的方法来检查现有扩展,并且存在诸如想要删除找到的任何扩展并在未找到时安装新扩展之类的条件,因此所有这些条件都无法通过 Terraform
实现不使用空资源。
PowerShell 脚本:
PowerShell
脚本将首先列出所有扩展。如果找到扩展,它将遍历它们,使用 Remove-AzVMExtension
一一删除每个扩展,然后在 Azure VM 上安装新扩展。
脚本.ps1
# Specify VM details
$resourceGroupName = "testvk-rg"
$vmName = "testvmvkserver"
$extenname = "IaaSAntimalware"
# Get the VM
$vm = Get-AzVM -ResourceGroupName $resourceGroupName -Name $vmName
# Delete all extensions
if ($vm.Extensions.Count -gt 0) {
Write-Output "Deleting extensions on VM '$vmName':"
$vm.Extensions | ForEach-Object {
$extensionName = $_.Name
Write-Output "Deleting extension: $extensionName"
Remove-AzVMExtension -ResourceGroupName $resourceGroupName -VMName $vmName -Name $extensionName -Force
}
} else {
Write-Output "No extensions found on VM '$vmName'."
}
Write-Output "Installing a new extension on VM '$vmName':"
$SettingsString = "{ ""AntimalwareEnabled"": true }"
Set-AzVMExtension -ResourceGroupName $resourceGroupName -Location "East US" -VMName $vmName -Name $extenname -Publisher "Microsoft.Azure.Security" -Type "IaaSAntimalware" -TypeHandlerVersion "1.3" -SettingString $SettingsString
Write-Output "Installed extension named: '$extenname' on VM '$vmName'"
Terraform 代码:
注意:确保将
和 Terraform 文件放在 同一目录中。script.ps1
provider "azurerm" {
features {}
}
resource "null_resource" "execute_powershell" {
provisioner "local-exec" {
command = <<-EOT
powershell -ExecutionPolicy Bypass -File ${path.module}/script.ps1
EOT
}
}
地形适用
传送门结果