如何确保手臂模板中的唯一名称?

时间:2019-02-14 15:21:49

标签: c# .net azure-devops azure-logic-apps arm-template

我们如何确保连接资源具有唯一的名称?

我们大约有100个逻辑应用程序,这些应用程序与sftp和blob存储等连接。一个例子是:

"azureblob_1_Connection_Name": {
  "value": "azureblob-1"
},
"azureblob_1_Connection_DisplayName": {
  "value": "my-blob-con"
},
"azureblob_1_accountName": {
  "value": "blobdocumentstor"
}

由于缺乏自动化,另一个逻辑应用程序可能使用相同的连接名称:azureblob-1,但是它可能具有不同的属性,例如accountName可能有所不同:

"azureblob_1_accountName": {
  "value": "differentdocstor"
}

以相同的连接名称部署逻辑应用程序时,它将替换现有的连接!

我们如何确保连接不会被覆盖?

是否可以在手臂模板中强制某个值将是唯一的?

2 个答案:

答案 0 :(得分:2)

您可以使用诸如开始部署时间臂模板之类的方法,并将其传递到模板中,并基于此生成唯一的名称。所有手臂模板功能都是确定性的,因此,如果传递相同的输入,则始终获得相同的输出。日期\时间功能尚未实现(afaik)。在此之前,您需要依靠外部源来生成名称\前缀\一些内容,以供arm模板生成唯一的名称。

但这会导致一个问题,即除非您知道第一次运行时提供的“种子”,否则就无法更新现有的东西。

另一种强制执行方式-为每个部署使用单独的资源组,我知道它不是最佳选择,但可以正常工作(不确定逻辑应用程序连接tbh,它们在全球范围内是唯一的吗?如果它们不起作用)

您可能会创建一个模板,该模板对现有资源进行过滤(某种形式),但不会变得直截了当(它确实很笨拙,更容易在其他地方实现此逻辑)。

答案 1 :(得分:1)

在资源名称中使用一些前缀,并在arm模板中使用class AgeDescriptor: def __init__(self): self._age = 0 def __set__(self, instance, value): print('setter') self._age = value def __get__(self, instance, owner): print('getter') return self._age class Person: age = AgeDescriptor() def __init__(self, name, age): self.name = name self.age = age def get_age(self): return self.age def set_age(self, value): self.age = value if __name__ == "__main__": e1 = Person("ankit", 29) 函数以生成唯一名称。

示例:

uniqueString

将自动生成上述资源的默认值。您还可以编写自定义逻辑以生成唯一的字符串,然后将其从PowerShell / .NET传递到部署模板的任何位置。