如何将额外参数与 New-AzureRmResourceGroupDeployment cmdlet 一起传递

How to pass extra parameters along with New-AzureRmResourceGroupDeployment cmdlet

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

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

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

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

任何指导都非常appreciated.Thanks!

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

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

You can use inline parameters and a local parameter file in the same deployment operation. For example, you can specify some values in the local parameter file and add other values inline during deployment. If you provide values for a parameter in both the local parameter file and inline, the inline value takes precedence.

这很有价值,因为它使您可以显式控制 VM 名称参数,但由调用者(在本例中为您)传递内联参数。请注意,这仅适用于 local 参数文件,不适用于远程文件(即 -TemplateParameterFile 而不是 -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。它开箱即用,不需要任何外部脚本。