【问题标题】:Trying to make if/else powershell for ARM template尝试为 ARM 模板制作 if/else powershell
【发布时间】:2018-01-01 14:27:39
【问题描述】:

我有一个用于 ARM 模板的 PowerShell 脚本,用于将一些资源部署到 Azure,更具体地说是 ASE v2。

我的 ARM 模板中有一个条件说明:

"sv-ase-version": "v2",

    "sv-asp-template-filenameHash": {
      "v1": "[concat(variables('sv-baseURI'),concat('/azuredeploy-asp.v1.json',parameters('_artifactsLocationSasToken')))]",
      "v2": "[concat(variables('sv-baseURI'),concat('/azuredeploy-asp.json',parameters('_artifactsLocationSasToken')))]"
    },

我现在在 PowerShell 中拥有的东西:

Param(

    [string] $TemplateFile = 'azuredeploy-dev.json',
    [string] $TemplateParametersFile = 'azuredeploy-dev.parameters.json',

)

$TemplateFile = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, $TemplateFile))
$TemplateParametersFile = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, $TemplateParametersFile))

我想在 PowerShell 中添加的是:

Param(

    [string] $TemplateFile = 'azuredeploy-dev.json',
    [string] $TemplateParametersFile = 'azuredeploy-dev.parameters.json',
    [string] $TemplateFilev2 = 'azuredeploy.json',
    [string] $TemplateParametersFilev2 = 'azuredeploy.parameters.json',

)

#Checking if this is the correct way to do it

if ("sv-ase-version" -eq "v1") {

    $TemplateFile = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, $TemplateFile))
    $TemplateParametersFile = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, $TemplateParametersFile))

}
else {

    $TemplateFilev2 = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, $TemplateFilev2))
    $TemplateParametersFilev2 = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, $TemplateParametersFilev2))

}

我的意图:在 JSON 文件中进行切换,而不需要在 PowerShell 中进行更改。

这行得通吗?您将如何以不同的方式处理这个问题?

谢谢。

【问题讨论】:

  • if ("sv-ase-version" -eq "v1") 这没有意义。这总是错误的。你想达到什么目标?
  • 如果 sv-ase-version 的值为 v1,则试图告诉 powershell 使用 2 个变量。如果是 v2,则需要使用其他 2 个变量。
  • 价值从何而来?现在它的硬编码
  • 该值被硬编码到名为 azuredeploy.json 的 JSON 中,该 JSON 将 ARM 模板部署到 azure 中。请参阅我发布的代码的第一部分。
  • 这没有意义。您希望 powershell 根据模板中的内容决定部署什么?

标签: json powershell azure arm-template ase


【解决方案1】:

最简单的方法是在模板中使用参数,将其命名为deploymentPrefix

"deploymentPrefix": {
    "type": "string",
    "defaultValue": "dev",
    "allowedValues": [
        "dev",
        "prod"
    ],
    "metadata": {
        "description": "Resources created will be prefixed with this."
    }
},

并根据该参数的值决定在模板中部署什么:

"variables": {
    "template-dev": "someurl",
    "template-prod": "someotherurl",
    "template-url": "[concat('template-', parameters('deploymentPrefix))]"
    ...
}

在您的 powershell 中,您只需使用 New-AzureRmResourceGroupDeployment 并将其(dev 或 prod)传递给参数,模板就会找出用于 template-url 变量的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2014-10-04
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多