如何在Powershell中复制Azure Resource Manager模板uniquestring()函数?

时间:2018-01-10 14:58:29

标签: powershell azure templates

我有一个Azure托管的服务,它使用ARM模板自动部署(在我们的构建过程中),在不同的资源组中有多个服务实例。有些资源需要全局唯一名称,为了支持这一点,我使用uniquestring函数(通常针对资源组ID)生成部分资源名称。名称遵循模板化模式,例如实例名称+组件名称+唯一字符串=“Example.WebAPI.abcd1234efgh5”

稍后在使用Powershell脚本对这些资源执行维护时出现问题 - 我需要资源名称,这意味着使用相同的模板从实例,组件和资源组ID生成名称。但是,Powershell中没有函数返回与同一输入的ARM uniquestring函数相同的值。

据我所知,uniquestring只是生成输入字符串的哈希值并将其作为13个字符的表示形式返回;有没有人知道这个哈希进程的细节,所以它可以在Powershell中重复,或者如果它已经完成了?

我查看了Can I call ARM template functions outside the JSON deployment template?的答案,但这需要在初始ARM模板中使用输出参数,并假设该值立即使用;而在我的用例中,我需要在初始部署后几周或几个月使用资源名称。

2 个答案:

答案 0 :(得分:1)

该功能没有记录在任何地方,但是它的确定性,意味着如果你给出相同的输入,你总是得到相同的输出,所以没什么可担心的。

如果您之后需要识别资源,可以提出一系列解决方法,您可以始终使用Workbook_Open获取部署的输出,或者您可以使用您可以推断的特定内容标记资源动态地或者您可以使用诸如创建时间和其他间接因素之类的东西来过滤资源

答案 1 :(得分:0)

您可以在这里查看:https://docs.microsoft.com/en-us/archive/blogs/389thoughts/get-uniquestring-generate-unique-id-for-azure-deployments

#!/usr/bin/env pwsh

function Get-UniqueString ([string]$id, $length=13)
{
    $hashArray = (new-object System.Security.Cryptography.SHA512Managed).ComputeHash($id.ToCharArray())
        -join ($hashArray[1..$length] | ForEach-Object { [char]($_ % 26 + [byte][char]'a') })
}

Get-UniqueString "foobar"