6

我正在编写一个 powershell 脚本来使用 New-AzureRmResourceGroupDeployment cmdlet 创建 VM,如下所示。

New-AzureRmResourceGroupDeployment -Name VmDeployment  `
  -TemplateFile C:\template\template.json `
  -TemplateParameterFile C:\template\parameters.json

这用于创建虚拟机。在parameters.json中,有一些参数,如等virtualMachineNamenetworkInterfaceName它们是硬编码的。
现在我正在尝试使这些脚本自动化,即当满足某些条件时,它们可以通过工具自行运行。

我的要求是,每当这个脚本运行时,它必须增加 VMName 中的数字。假设 VM Name 是 now VMName1,它必须是VMName2脚本下次运行的时候。下次VMName3运行脚本时也是如此。由于virtualMachineName参数是硬编码的,因此现在不会发生这种情况。无论如何我可以virtualMachineName在脚本本身中作为参数传递,而不是从 json 文件中获取它。

非常感谢任何指导。谢谢!

4

1 回答 1

11

你绝对可以做到这一点,幸运的是也有一些方法。

  1. 传递内联参数。它在Azure PowerShell docs for Templates中说,您可以将内联参数与本地参数文件一起使用,并且内联参数优先。相关段落:

您可以在同一部署操作中使用内联参数和本地参数文件。例如,您可以在本地参数文件中指定一些值,并在部署期间内联添加其他值。如果在本地参数文件和内联中都为参数提供值,则内联值优先。

这很有价值,因为它为您提供了对 VM Name 参数的显式控制,但由调用者(在本例中为您)来传递内联参数。请注意,这只适用于本地参数文件,不适用于远程文件(即-TemplateParameterFile和 not -TemplateParameterUri)。生成的命令如下所示:

    New-AzureRmResourceGroupDeployment -Name VmDeployment `
      -TemplateFile C:\template\template.json `
      -TemplateParameterFile C:\template\parameters.json `
      -virtualMachineName VMName42
  1. 修改原来的parameters.json。您可以编写一些 PowerShell/Python/Favorite-scripting-language 来解析paramters.json,找到 VM Name 参数,找到整数后缀,将其递增,然后用新版本覆盖文件。这样做的好处是不必记住传递内联参数,并且您不必在任何地方跟踪版本号,因为它已经存储在parameters.json中。这有一个主要缺点:它修改了可能很危险的原始 JSON。

  2. 复制parameters.json并修改临时副本。您可以编写脚本将parameters.json复制到另一个临时 JSON 文件,然后在复制期间增加 VM Name 参数,就像在选项 2 中一样。将此临时文件传递给New-AzureRmResourceGroupDeployment. 这样做的好处是不修改原始parameters.json文件,但需要您在某处跟踪版本号(例如,另一个本地文件、命令行参数、环境变量等)。

为简单起见,我推荐选项 1。它已经开箱即用,不需要任何外部脚本。

于 2018-08-28T17:17:28.173 回答