探索模板组件
Azure 资源管理器模板以 JSON 编写,可以以文本形式表示存储为对象(例如虚拟机)的数据。
JSON 文档实质上是键值对的集合。 每个键都是一个字符串,其值可以是如下形式:
- 一个字符串。
- 数词。
- 一个布尔表达式。
- 值列表。
- 对象(即其他键值对的集合)。
资源管理器模板可以包含使用 JSON 表示法表示但与 JSON 语言本身无关的部分:
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "",
"parameters": { },
"variables": { },
"functions": [ ],
"resources": [ ],
"outputs": { }
}
让我们更加详细地回顾以下各部分。
参数
通过本部分,可以在模板运行时指定哪些值可配置。
例如,可以允许模板用户设置用户名、密码或域名。
下面示例演示了两个参数:一个用于虚拟机 (VM) 的用户名,另一个用于它的密码:
"parameters": {
"adminUsername": {
"type": "string",
"metadata": {
"description": "Username for the Virtual Machine."
}
},
"adminPassword": {
"type": "securestring",
"metadata": {
"description": "Password for the Virtual Machine."
}
}
}
变量
通过本部分,可以定义整个模板中使用的值。
变量可以简化模板的维护。
例如,一次可将一个存储帐户名称定义为变量,并在整个模板中使用该变量。
如果存储帐户名称发生更改,仅需更新变量一次。
以下示例演示描述 VM 的网络功能的若干变量:
"variables": {
"nicName": "myVMNic",
"addressPrefix": "10.0.0.0/16",
"subnetName": "Subnet",
"subnetPrefix": "10.0.0.0/24",
"publicIPAddressName": "myPublicIP",
"virtualNetworkName": "MyVNET"
}
函数
通过本部分,可以定义整个模板中不想重复的过程。
与变量一样,函数也可简化模板的维护。
下面的示例创建了一个函数,以创建可在创建具有全局唯一命名要求的资源时使用的唯一名称:
"functions": [
{
"namespace": "contoso",
"members": {
"uniqueName": {
"parameters": [
{
"name": "namePrefix",
"type": "string"
}
],
"output": {
"type": "string",
"value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
}
}
}
}
],
资源
通过本部分,可以定义组成部署的 Azure 资源。
下面的示例将创建一个公共 IP 地址资源:
{
"type": "Microsoft.Network/publicIPAddresses",
"name": "[variables('publicIPAddressName')]",
"location": "[parameters('location')]",
"apiVersion": "2018-08-01",
"properties": {
"publicIPAllocationMethod": "Dynamic",
"dnsSettings": {
"domainNameLabel": "[parameters('dnsLabelPrefix')]"
}
}
}
此处的资源类型为 Microsoft.Network/publicIPAddresses
。
通过变量部分读取名称,通过参数部分读取位置或 Azure 区域。
由于资源类型可能会随着时间推移而发生变化,因此 apiVersion
指的是要使用的资源类型的版本。
随着资源类型发展,你可以修改模板,以便使用最新功能。
输出
通过本部分,可以定义模板运行时想要收到的信息。
例如,你可能想要收到 VM 的 IP 地址或完全限定的域名 (FQDN),即部署运行前不知道的信息。
下面的示例演示了名为“主机名”的输出。
从 VM 的公共 IP 地址设置中读取 FQDN 值:
"outputs": {
"hostname": {
"type": "string",
"value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
}
}