استخدام العناصر كمعلمات في نسخة من تكرار حلقي في قالب Azure Resource Manager

عند استخدام الكائنات كمعلمات في قوالب Azure Resource Manager (قوالب ARM)، يمكنك تضمينها في حلقة نسخ. هذه التقنية مفيدة جدا عندما يتم دمجها مع حلقة نسخ تسلسلي، خاصة لنشر الموارد التابعة.

لتوضيح هذا النهج، دعونا ننظر إلى قالب ينشر مجموعة أمان شبكة (NSG) مع قاعدتي أمان.

أولا، دعونا ننظر إلى معلماتنا. عندما ننظر إلى القالب، نرى أننا حددنا معلمة واحدة تسمى networkSecurityGroupsSettings تتضمن صفيفا يسمى securityRules. يحتوي هذا الصفيف على كائنين JSON، يحدد كل منهما الإعدادات التي تحدد قاعدة أمان.

{
    "$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"
                    }
                ]
            }
        }
    }
}

الآن، دعونا ننظر إلى القالب الخاص بنا. لدينا مورد يسمى NSG1 الذي ينشر NSG. كما يستخدم ميزة تكرار الخاصية المضمنة في ARM. بإضافة حلقة نسخ إلى قسم خصائص مورد في القالب الخاص بك، يمكنك بشكل حيوي تعيين عدد العناصر الخاصة بخاصية أثناء النشر. يمكنك أيضاً تجنب الحاجة إلى تكرار بناء جملة القالب.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "VNetSettings": {
            "type": "object"
        },
        "networkSecurityGroupsSettings": {
            "type": "object"
        }
    },
    "resources": [
        {
            "apiVersion": "2020-05-01",
            "type": "Microsoft.Network/virtualNetworks",
            "name": "[parameters('VNetSettings').name]",
            "location": "[resourceGroup().location]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[parameters('VNetSettings').addressPrefixes[0].addressPrefix]"
                    ]
                },
                "subnets": [
                    {
                        "name": "[parameters('VNetSettings').subnets[0].name]",
                        "properties": {
                            "addressPrefix": "[parameters('VNetSettings').subnets[0].addressPrefix]"
                        }
                    },
                    {
                        "name": "[parameters('VNetSettings').subnets[1].name]",
                        "properties": {
                            "addressPrefix": "[parameters('VNetSettings').subnets[1].addressPrefix]"
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "2020-05-01",
            "type": "Microsoft.Network/networkSecurityGroups",
            "name": "NSG1",
            "location": "[resourceGroup().location]",
            "properties": {
                "copy": [
                    {
                        "name": "securityRules",
                        "count": "[length(parameters('networkSecurityGroupsSettings').securityRules)]",
                        "input": {
                            "name": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].name]",
                            "properties": {

                                "description": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].description]",
                                "priority": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].priority]",
                                "protocol": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].protocol]",
                                "sourcePortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].sourcePortRange]",
                                "destinationPortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].destinationPortRange]",
                                "sourceAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].sourceAddressPrefix]",
                                "destinationAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].destinationAddressPrefix]",
                                "access": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].access]",
                                "direction": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].direction]"
                            }
                        }
                    }
                ]
            }
        }
    ]
}

لنلقِ نظرة فاحصة على كيفية تحديد قيم الخصائص الخاصة بنا في securityRules مورد تابع. تتم الإشارة إلى جميع خصائصنا باستخدام الدالة parameters() . ثم نستخدم عامل تشغيل النقطة للإشارة إلى صفيفنا securityRules ، وفهرسته بالقيمة الحالية للتكرار. أخيرًا، نستخدم عامل تشغيل آخر للإشارة إلى اسم العنصر.

تجربة القالب

يوج مثال قالب متاح على GitHub. لتوزيع القالب، قم باستنساخ المستودع وتشغيل أوامر Azure CLI التالية:

git clone https://github.com/mspnp/template-examples.git
cd template-examples/example3-object-param
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/example3-object-param/deploy.json \
    --parameters deploy.parameters.json

الخطوات التالية