当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何在 Azure ARM 模板中应用 Azure DSC 配置

作者:精品下载站 日期:2024-12-14 13:00:25 浏览:13 分类:玩电脑

如何在 Azure ARM 模板中应用 Azure DSC 配置


如果您要通过 ARM 模板部署 Azure Windows 虚拟机 (VM) 并且需要配置 Windows,那么本文适合您。在本教程中,你将了解如何使用 ARM 模板的所需状态配置 (DSC) 扩展,通过单个模板无缝部署和配置 Azure VM 规模集。

在 Azure 中部署 VM(或 VM 规模集)时,您只是不部署 VM。总是有许多其他任务需要执行,例如配置磁盘、网络等。但工程师通常还需要执行操作系统级别的配置,例如安装软件、Windows 功能等。操作系统级别是 PowerShell 和所需状态配置 (DSC) 脚本派上用场的地方。

大多数人认为 ARM 模板适合部署 Azure 基础设施。 ARM 模板非常适合部署 VM、网络和其他 Azure 资源,但它也可以调用将在 VM 上自动运行的脚本来配置 VM。

ARM 模板具有可选的扩展处理程序,允许您扩展 ARM 模板的功能。我们在本文中感兴趣的扩展配置文件是 Azure DSC 扩展处理程序。

Azure DSC 扩展是一个 ARM 模板扩展,可在刚刚部署在 ARM 模板中的 VM 上下载并运行 DSC 脚本。该扩展是打包使用 ARM 模板部署 VM 时所需的所有配置后任务的好方法。

在本教程中,你将了解如何通过模板执行 ARM 部署,通过 Azure DSC 扩展调用 DSC 脚本。您将使用 PowerShell 来调用模板,但此处解释的许多概念也适用于通过其他方式调用 ARM 模板部署。

在你开始之前

本文是一个教程,将引导您逐步完成一组任务。如果您打算继续,请确保您满足以下先决条件。

  • 一个 Azure 资源组,用于保存您将创建的所有资源。本教程将使用AzureDSCDemo
  • Azure 存储帐户 - 本教程将使用 azuredscdemostorage
  • Azure Key Vault - 您将使用它来提取敏感信息,例如 ARM 部署中 VM 规模集的管理员用户名和密码。本教程将使用名为 AzureDSCDemoKv 的密钥保管库。请务必在密钥保管库中的访问策略下选中模板部署的 Azure 资源管理器,以授予 ARM 部署访问权限。
  • Azure PowerShell 模块并经过身份验证 - 本教程使用 v3.4
  • 在 Windows 10 上 - 创建 DSC zip 文件无法在 MacOS 或 Linux 上运行。

您可以在此处找到本教程使用的所有文件。

创建 DSC Zip 文件

在应用 DSC 配置之前,您必须先有一个要应用的 DSC 脚本。在本教程中,您将使用一个超级简单的 DSC 脚本来安装单个 Windows 功能。

您可以在下面看到,此 DSC 脚本确保在运行它的计算机上安装 Web-Server Windows 功能。本地计算机将是稍后部署的 Azure VM 规模集。继续并将其保存为 iis_setup.ps1。在此示例中,它将保存在我的 demo 文件夹中。

Configuration iis_setup {

    Param ()

    Import-DscResource -ModuleName PSDesiredStateConfiguration

    Node 'localhost'
    {
        WindowsFeature WebServerRole
        {
            Name = "Web-Server"
            Ensure = "Present"
        }
    }
}

创建 DSC 脚本后,下一步是将其压缩。 Azure DSC 需要此 ZIP 文件,因为在创建更高级的 DSC 脚本时,它允许你使用它打包依赖资源。

创建所需 DSC zip 文件的最简单方法是使用 Publish-AzVmDscConfiguration PowerShell cmdlet。您可以在下面看到如何打包 DSC 脚本,创建一个名为 iis_setup.zip 的文件。

Publish-AzVMDscConfiguration .\iis_setup.ps1 -OutputArchivePath '.\iis_setup.zip'

Publish-AzVmDscConfiguration cmdlet 不仅会压缩 DSC 脚本,还会在存档中创建一个名为 dscmetadata.json 的文件。在此示例中,它将仅包含一个 Modules 节点。如果 DSC 脚本包含任何依赖模块,它会从本地计算机复制这些模块,将它们包含在 ZIP 文件中,并将它们添加到 Modules JSON 节点。

{"Modules":[""]}

您可能想手动压缩 DSC 脚本或使用 Compress-Archive cmdlet。这不行!根据我的经验,Publish-AzVmDscConfiguration 会压缩文件并创建所需的 dscmetada.json 文件。

将 DSC Zip 文件获取到 Azure

现在您已经创建了 DSC zip 文件,现在需要将其放到 ARM 模板最终可以下载的位置。 ARM 部署并不关心 DSC 包所在的位置。只要能访问就OK了。但在本教程中,您将把它上传到 Azure 存储容器。

假设您已经创建了一个存储帐户,请运行以下 PowerShell 代码来创建一个名为 envsetupscripts 的存储容器,并将 iis_setup.zip 文件上传到存储帐户。

$storageAccountName = 'azuredscdemostorage'
$resourceGroupName = 'AzureDSCDemo'
$dscZipFilePath = '.\iis_setup.zip'
$storageContainerName = 'envsetupscripts'

$StorageAccount = Get-AzStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName

# Create, and store, new container
$StorageAccount | New-AzStorageContainer -Name $storageContainerName
$Container = $StorageAccount | Get-AzStorageContainer

# Upload single file
$Container | Set-AzStorageBlobContent -File $dscZipFilePath

如果 DSC 配置可以公开访问,则存储该文件的另一个好位置是与 GitHub 存储库中此类项目的其他文件一起存储。

创建存储帐户 SAS 令牌

由于 DSC 存档存储在私有存储帐户上,因此您需要为管道提供下载它的方法。一种方法是创建临时 SAS 令牌。

$context = (Get-AzStorageAccount -ResourceGroupName '*AzureDSCDemo*' -AccountName '*azuredscdemostorage*').context
$sasToken = New-AzStorageAccountSASToken -Context $context -Service Blob -ResourceType Service,Container,Object -Permission r

有关创建 SAS 令牌的更多信息,请务必查看如何生成 Azure SAS 令牌以访问存储帐户一文。

添加密钥保管库机密

由于部署 VM 规模集的 ARM 模板需要定义 VM 的管理员用户名和密码,因此不要将这些内容以纯文本形式保留在模板本身或参数文件中,这一点很重要。相反,你应该将它们存储在安全位置,例如 Azure Key Vault。

在本教程中,添加三个密钥 - DefaultAdminUsernameDefaultAdminPassword(针对虚拟机)以及刚刚创建的 SAS 令牌,另存为 SASToken

$kvName = '*AzureDSCDemoKv*'
$vmAdminUserNameSec = ConvertTo-SecureString -String 'adam' -AsPlainText -Force
$vmAdminPasswordSec = ConvertTo-SecureString -String 'I like azure.' -AsPlainText -Force
$encSasToken = ConvertTo-SecureString -String 'I like azure.' -AsPlainText -Force
Set-AzKeyVaultSecret -VaultName $kvName -Name DefaultAdminUsername -SecretValue $vmAdminUserNameSec
Set-AzKeyVaultSecret -VaultName $kvName -Name DefaultAdminPassword -SecretValue $vmAdminPasswordSec
Set-AzKeyVaultSecret -VaultName $kvName -Name SASToken -SecretValue $encSasToken

创建 ARM 模板参数文件

ARM 模板参数文件没什么特别的。本教程只是使用它向模板传递所需的参数。如果您想了解有关参数文件的更多信息,请查看创建参数文件 Microsoft 文档。

该参数文件中有一些需要注意的事项。

  • storageAccountSasToken - 这是运行 ARM 部署时将以交互方式填充的参数。这里没有特意提供任何价值。
  • adminUsernameadminPassword - 这两个参数由部署读取之前在 Azure Key Vault 中创建的两个机密来填充。

请务必将 [您的订阅 ID] 替换为您的实际 Azure 订阅 ID。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "storageAccountName": {
            "value": "azuredscdemostorage"
        },
        "setupScriptContainerName": {
            "value": "envsetupscripts"
        },
        "storageAccountSasToken": {
            "value": ""
        },
        "vmssInstanceCount": {
            "value": 2
        },
        "vmSize": {
            "value": "Standard_D1"
        },
        "adminUsername": {
            "reference": {
                "keyVault": {
                    "id": "/subscriptions/[your subscription id]/resourceGroups/AzureDSCDemo/providers/Microsoft.KeyVault/vaults/AzureDSCDemoKv"
                },
                "secretName": "DefaultAdminUsername"
            }
        },
        "adminPassword": {
            "reference": {
                "keyVault": {
                    "id": "/subscriptions/[your subscription id]/resourceGroups/AzureDSCDemo/providers/Microsoft.KeyVault/vaults/AzureDSCDemoKv"
                },
                "secretName": "DefaultAdminPassword"
            }
        }
    }
}

创建 ARM 模板

让我们重点关注适用于 DSC 的内容,而不是涵盖提供示例 VM 规模集的整个 ARM 模板。您可以在下面看到如何为 VM 规模集设置 extensionProfile 的工作示例。

应该指出此代码的一些重要功能。

  • forceUpdateTag - 如果您打算更改 DSC 配置文件并进行测试,此属性非常重要。默认情况下,DSC 不会尝试重新应用新配置。该属性的值并不重要,只要它与上一个属性不同即可。完成测试后,您可以将其删除。
  • url - 这是指向 DSC zip 文件的 URL。 DSC 扩展并不关心它在哪里,只要它可以从此 URL 下载即可。在此示例中,DSC 存档位于私有 Azure 存储帐户上,名为 iis_setup.zip,位于名为 envsetupscripts 的存储容器中。

    以下示例使用参数,但主要结构为:https://[storage_account_name].blob.core.windows.net/envsetupscripts/iis_setup.zip

  • script - 这是 DSC 存档中包含的 DSC 脚本的名称。
  • function - 这是 DSC 脚本文件内部配置的名称。
  • configurationUrlSasToken - 这是之前创建的 SAS 令牌。管道将使用它来对存储帐户进行身份验证以下载 DSC 存档。
"extensionProfile": {
    "extensions": [
        {
            "name": "Microsoft.Powershell.DSC",
            "properties": {
                "publisher": "Microsoft.Powershell",
                "type": "DSC",
                "typeHandlerVersion": "2.9",
                "autoUpgradeMinorVersion": true,
                "forceUpdateTag": "3",
                "settings": {
                    "configuration": {
                        "url": "[concat('https://',parameters('storageAccountName'),'.blob.core.windows.net/',parameters('setupScriptContainerName'),'/',variables('iisDSCSetupArchiveFileName'))]",
                        "script": "iis_setup.ps1",
                        "function": "iis_setup"
                    }
                },
                "protectedSettings": {
                    "configurationUrlSasToken": "[parameters('storageAccountSasToken')]"
                }
            }
        }
    ]
}

部署 Azure 资源

创建 DSC 脚本并与创建的 ARM 模板和参数文件一起上传后,您就可以对其进行测试了。

运行 New-AzResourceGroupDeployment 命令,提供模板、模板参数文件、资源组名称和生成的 SAS 令牌,如下所示。此命令将启动部署并配置 ARM 模板中定义的所有资源,包括运行我们在本教程中关注的 DSC 扩展。

New-AzResourceGroupDeployment -TemplateFile ./vmss.json -TemplateParameterFile ./vmss.parameters.json -ResourceGroupName AzureDSCDemo -storageAccountSasToken $sasToken -Verbose

部署完成后,您可以检查规模集中的任何 VM,您会发现Web-Server Windows 功能已安装!

清理

完成本教程后,请记住删除与所有资源一起创建的资源组,这样您就不会被收取费用!

Get-AzResourceGroup -Name AzureDSCDemo | Remove-AzResourceGroup

故障排除

如果您遇到 DSC 扩展的任何问题,位于虚拟机上的 C:\WindowsAzure\Logs\Plugins\Microsoft.Powershell.DSC\2.80.0.0 中的扩展日志可能会提供一些线索这是怎么回事。

资源

  • Azure DSC 扩展设置

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯