Tulajdonságátalakító és -gyűjtő implementálása Azure Resource Manager-sablonban

Az Objektumok használata paraméterként egy Azure-Resource Manager-sablon másolási ciklusában című cikkből megtudhatja, hogyan tárolhat erőforrástulajdonság-értékeket egy objektumban, és hogyan alkalmazhatja őket egy erőforrásra az üzembe helyezés során. Ez egy nagyon hasznos módszer a paraméterek kezelésére, de ehhez az objektum tulajdonságait erőforrás-tulajdonságokra kell leképeznie minden alkalommal, amikor az objektumot használja a sablonban.

Ennek megkerüléséhez implementálhat egy tulajdonságátalakítási és gyűjtősablont, amely iterálja az objektumtömböt, és átalakítja azt az erőforrás JSON-sémájába.

Fontos

Ehhez a megközelítéshez ismernie kell Resource Manager sablonokat és függvényeket.

Tekintsünk meg egy példát, amely egy tulajdonsággyűjtőt és transzformátort implementál egy hálózati biztonsági csoport üzembe helyezéséhez. Az alábbi ábra bemutatja, hogyan kapcsolódnak a sablonjaink a sablonokban található erőforrásokhoz:

tulajdonsággyűjtő és transzformátorarchitektúra

A hívássablon két erőforrást tartalmaz:

  • Egy sablonhivatkozás, amely meghívja a gyűjtősablont
  • Az üzembe helyezendő hálózati biztonsági csoport erőforrása

Gyűjtősablonunk két erőforrást tartalmaz:

  • Horgonyerőforrás
  • Egy sablonhivatkozás, amely egy másolási hurokban hívja meg az átalakító sablont

Az átalakítási sablon egyetlen erőforrást tartalmaz: egy üres sablont egy változóval, amely átalakítja source a JSON-t a fő sablonban található hálózati biztonsági csoport erőforrása által várt JSON-sémává.

Paraméterobjektum

A paraméterobjektumot securityRules az Objektumok használata paraméterként egy Másolási hurokban egy Azure Resource Manager-sablonban című cikkből használjuk. Az átalakítási sablon a securityRules tömb minden objektumát átalakítja a hívósablonban található hálózati biztonsági csoport erőforrása által várt JSON-sémává.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "networkSecurityGroupsSettings": {
            "value": {
                "securityRules": [
                    {
                        "name": "RDPAllow",
                        "description": "allow RDP connections",
                        "direction": "Inbound",
                        "priority": 100,
                        "sourceAddressPrefix": "*",
                        "destinationAddressPrefix": "10.0.0.0/24",
                        "sourcePortRange": "*",
                        "destinationPortRange": "3389",
                        "access": "Allow",
                        "protocol": "Tcp"
                    },
                    {
                        "name": "HTTPAllow",
                        "description": "allow HTTP connections",
                        "direction": "Inbound",
                        "priority": 200,
                        "sourceAddressPrefix": "*",
                        "destinationAddressPrefix": "10.0.1.0/24",
                        "sourcePortRange": "*",
                        "destinationPortRange": "80",
                        "access": "Allow",
                        "protocol": "Tcp"
                    }
                ]
            }
        }
    }
}

Először nézzük meg az átalakító sablont .

Sablon átalakítása

Az átalakítási sablon két paramétert tartalmaz, amelyeket a gyűjtősablontól ad át:

  • source egy olyan objektum, amely a tulajdonságtömb egyik tulajdonságérték-objektumát fogadja. A példánkban a securityRules tömb minden objektumát egyenként továbbítja a rendszer.
  • state egy tömb, amely az összes korábbi átalakítás összefűzött eredményeit fogadja. Ez az átalakított JSON gyűjteménye.

A paraméterek a következőképpen néznek ki:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "source": {
            "type": "object"
        },
        "state": {
            "type": "array",
            "defaultValue": []
        }
    },

A sablon egy nevű instance változót is definiál, amely az objektumot source a szükséges JSON-sémává alakítja:

"variables": {
    "instance": [
        {
            "name": "[parameters('source').name]",
            "properties": {
                "description": "[parameters('source').description]",
                "protocol": "[parameters('source').protocol]",
                "sourcePortRange": "[parameters('source').sourcePortRange]",
                "destinationPortRange": "[parameters('source').destinationPortRange]",
                "sourceAddressPrefix": "[parameters('source').sourceAddressPrefix]",
                "destinationAddressPrefix": "[parameters('source').destinationAddressPrefix]",
                "access": "[parameters('source').access]",
                "priority": "[parameters('source').priority]",
                "direction": "[parameters('source').direction]"
            }
        }
    ]
}

Végül a output sablon összefűzi a paraméter összegyűjtött átalakítóit state a változó által instance végrehajtott aktuális átalakítással:

"resources": [],
"outputs": {
    "collection": {
        "type": "array",
        "value": "[concat(parameters('state'), variables('instance'))]"
    }
}

Ezután vessünk egy pillantást a gyűjtősablonra , és nézzük meg, hogyan adja át a paraméterértékeket.

Gyűjtősablon

Gyűjtősablonunk három paramétert tartalmaz:

  • source A a teljes paraméterobjektum-tömb. Ezt a hívósablon adja át. Ugyanaz a neve, mint az sourceátalakítási sablon paraméterének, de egyetlen fontos különbség van: bár ez a teljes tömb, egyszerre csak egy tömbelemet adunk át az átalakítási sablonnak.
  • transformTemplateUri az átalakítási sablon URI-ja. A sablon újrafelhasználhatóságának paramétereként definiáljuk.
  • state egy kezdetben üres tömb, amelyet átadunk az átalakító sablonnak. A másolási ciklus befejezése után tárolja az átalakított paraméterobjektumok gyűjteményét.

A paraméterek a következőképpen néznek ki:

"parameters": {
    "source": {
        "type": "array"
    },
    "transformTemplateUri": {
        "type": "string"
    },
    "state": {
        "type": "array",
        "defaultValue": []
    }
}

Ezután definiálunk egy nevű countváltozót. Értéke a paraméterobjektum-tömb hossza source :

"variables": {
    "count": "[length(parameters('source'))]"
}

A másolási hurok iterációinak számához használjuk.

Most vessünk egy pillantást az erőforrásainkra. Két erőforrást határozunk meg:

  • loop-0 A a másolási hurok nulla alapú erőforrása.
  • loop- A a függvény eredményével copyIndex(1) összefűzve egyedi iteráció-alapú nevet hoz létre az erőforráshoz, kezdve a következővel 1: .

Az erőforrásaink a következőképpen néznek ki:

"resources": [
    {
        "type": "Microsoft.Resources/deployments",
        "apiVersion": "2015-01-01",
        "name": "loop-0",
        "properties": {
            "mode": "Incremental",
            "parameters": { },
            "template": {
                "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                "contentVersion": "1.0.0.0",
                "parameters": { },
                "variables": { },
                "resources": [ ],
                "outputs": {
                    "collection": {
                        "type": "array",
                        "value": "[parameters('state')]"
                    }
                }
            }
        }
    },
    {
        "type": "Microsoft.Resources/deployments",
        "apiVersion": "2015-01-01",
        "name": "[concat('loop-', copyindex(1))]",
        "copy": {
            "name": "iterator",
            "count": "[variables('count')]",
            "mode": "serial"
        },
        "dependsOn": [
            "loop-0"
        ],
        "properties": {
            "mode": "Incremental",
            "templateLink": { "uri": "[parameters('transformTemplateUri')]" },
            "parameters": {
                "source": { "value": "[parameters('source')[copyindex()]]" },
                "state": { "value": "[reference(concat('loop-', copyindex())).outputs.collection.value]" }
            }
        }
    }
]

Vizsgáljuk meg közelebbről azokat a paramétereket, amelyeket átadunk az átalakító sablonnak a beágyazott sablonban. A korábbiakból már tudjuk, hogy source a paraméter átadja az aktuális objektumot a source paraméterobjektum-tömbben. A state paraméter az a hely, ahol a gyűjtemény történik, mert a másolási hurok előző iterációjának kimenetét veszi át az aktuális iterációba. Figyelje meg, hogy a függvény paraméter reference()copyIndex() nélküli függvénnyel hivatkozik az name előző csatolt sablonobjektumra.

Végül a output sablon az átalakítóoutput sablon utolsó iterációját adja vissza:

"outputs": {
    "result": {
        "type": "array",
        "value": "[reference(concat('loop-', variables('count'))).outputs.collection.value]"
    }
}

Ellenérdekűnek tűnhet az outputátalakító sablon utolsó iterációjának visszaadása a hívássablonhoz, mert úgy tűnik, hogy a paraméterben source tároltuk. Ez azonban az átalakítósablon utolsó iterációja, amely az átalakított tulajdonságobjektumok teljes tömbjét tartalmazza, és ezt szeretnénk visszaadni.

Végül nézzük meg, hogyan hívhatja meg a gyűjtősablont a hívássablonból.

Hívássablon

A hívássablon egyetlen, nevű networkSecurityGroupsSettingsparamétert határoz meg:

...
"parameters": {
    "networkSecurityGroupsSettings": {
        "type": "object"
    }
}

Ezután a sablon egyetlen nevű változót collectorTemplateUrihatároz meg:

"variables": {
    "collectorTemplateUri": "[uri(deployment().properties.templateLink.uri, 'collector.template.json')]"
}

Ez a csatolt sablonerőforrás által használt gyűjtősablon URI-ja:

{
    "apiVersion": "2020-06-01",
    "name": "collector",
    "type": "Microsoft.Resources/deployments",
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "[variables('collectorTemplateUri')]",
            "contentVersion": "1.0.0.0"
        },
        "parameters": {
            "source": {
                "value": "[parameters('networkSecurityGroupsSettings').securityRules]"
            },
            "transformTemplateUri": {
                "value": "[uri(deployment().properties.templateLink.uri, 'transform.json')]"
            }
        }
    }
}

Két paramétert adunk át a gyűjtősablonnak:

  • source a tulajdonságobjektum-tömb. A példánkban ez a paraméter.networkSecurityGroupsSettings
  • transformTemplateUri az a változó, amelyet az imént definiáltunk a gyűjtősablon URI-jával.

Végül az Microsoft.Network/networkSecurityGroups erőforrás közvetlenül hozzárendeli a output csatolt sablonerőforrást a collector tulajdonságához securityRules :

"resources": [
    {
        "apiVersion": "2020-05-01",
        "type": "Microsoft.Network/networkSecurityGroups",
        "name": "networkSecurityGroup1",
        "location": "[resourceGroup().location]",
        "properties": {
            "securityRules": "[reference('collector').outputs.result.value]"
        }
    }
],
"outputs": {
    "instance": {
        "type": "array",
        "value": "[reference('collector').outputs.result.value]"
    }
}

A sablon kipróbálása

Egy példasablon érhető el a GitHubon. A sablon üzembe helyezéséhez klónozza az adattárat, és futtassa a következő Azure CLI-parancsokat :

git clone https://github.com/mspnp/template-examples.git
cd template-examples/example4-collector
az group create --location <location> --name <resource-group-name>
az deployment group create -g <resource-group-name> \
    --template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example4-collector/deploy.json \
    --parameters deploy.parameters.json

Következő lépések