Megosztás a következőn keresztül:


Oktatóanyag: Csatolt sablon üzembe helyezése

Az előző oktatóanyagokban megtanulta, hogyan helyezhet üzembe egy sablont, amely a helyi számítógépen van tárolva. Összetett megoldások üzembe helyezéséhez egy sablont több sablonra bonthat, és ezeket a sablonokat egy fő sablonon keresztül helyezheti üzembe. Ebben az oktatóanyagban megtudhatja, hogyan helyezhet üzembe egy fő sablont, amely egy csatolt sablonra mutató hivatkozást tartalmaz. A fősablon üzembe helyezés után elindítja a csatolt sablon üzembe helyezését. Azt is megtudhatja, hogyan tárolhatja és biztonságossá teheti a sablonokat SAS-jogkivonat használatával. A befejezés körülbelül 12 percet vesz igénybe.

Előfeltételek

Javasoljuk, hogy végezze el az előző oktatóanyagot, de nem szükséges.

Sablon áttekintése

Az előző oktatóanyagokban üzembe helyez egy sablont, amely létrehoz egy tárfiókot, egy App Service-csomagot és egy webalkalmazást. A használt sablon a következő volt:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "minLength": 3,
      "maxLength": 11,
      "metadata": {
        "description": "Specify a project name that is used to generate resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify a location for the resources."
      }
    },
    "storageSKU": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_RAGRS",
        "Standard_ZRS",
        "Premium_LRS",
        "Premium_ZRS",
        "Standard_GZRS",
        "Standard_RAGZRS"
      ],
      "metadata": {
        "description": "Specify the storage account type."
      }
    },
    "linuxFxVersion": {
      "type": "string",
      "defaultValue": "php|7.0",
      "metadata": {
        "description": "Specify the Runtime stack of current web app"
      }
    }
  },
  "variables": {
    "storageAccountName": "[format('{0}{1}', parameters('projectName'), uniqueString(resourceGroup().id))]",
    "webAppName": "[format('{0}WebApp', parameters('projectName'))]",
    "appServicePlanName": "[format('{0}Plan', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageSKU')]"
      },
      "kind": "StorageV2",
      "properties": {
        "supportsHttpsTrafficOnly": true
      }
    },
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2022-09-01",
      "name": "[variables('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "B1",
        "tier": "Basic",
        "size": "B1",
        "family": "B",
        "capacity": 1
      },
      "kind": "linux",
      "properties": {
        "perSiteScaling": false,
        "reserved": true,
        "targetWorkerCount": 0,
        "targetWorkerSizeId": 0
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2022-09-01",
      "name": "[variables('webAppName')]",
      "location": "[parameters('location')]",
      "kind": "app",
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]",
        "siteConfig": {
          "linuxFxVersion": "[parameters('linuxFxVersion')]"
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]"
      ]
    }
  ],
  "outputs": {
    "storageEndpoint": {
      "type": "object",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').primaryEndpoints]"
    }
  }
}

Csatolt sablon létrehozása

A tárfiók erőforrását egy csatolt sablonra bonthatja:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string",
      "metadata": {
        "description": "Specify the storage account name."
      }
    },
    "location": {
      "type": "string",
      "metadata": {
        "description": "Specify a location for the resources."
      }
    },
    "storageSKU": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_RAGRS",
        "Standard_ZRS",
        "Premium_LRS",
        "Premium_ZRS",
        "Standard_GZRS",
        "Standard_RAGZRS"
      ],
      "metadata": {
        "description": "Specify the storage account type."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageSKU')]"
      },
      "kind": "StorageV2",
      "properties": {
        "supportsHttpsTrafficOnly": true
      }
    }
  ],
  "outputs": {
    "storageEndpoint": {
      "type": "object",
      "value": "[reference(parameters('storageAccountName')).primaryEndpoints]"
    }
  }
}

A következő sablon a fő sablon. A kiemelt Microsoft.Resources/deployments objektum bemutatja, hogyan hívhat meg csatolt sablont. A csatolt sablon nem tárolható helyi fájlként vagy csak a helyi hálózaton elérhető fájlként. Megadhatja a csatolt sablon URI-értékét, amely HTTP-t vagy HTTPS-t is tartalmaz, vagy a relativePath tulajdonság használatával távoli csatolt sablont helyezhet üzembe a szülősablonhoz képest egy helyen. Az egyik lehetőség, hogy a fő sablont és a csatolt sablont is egy tárfiókba helyezi.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "minLength": 3,
      "maxLength": 11,
      "metadata": {
        "description": "Specify a project name that is used to generate resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify a location for the resources."
      }
    },
    "linuxFxVersion": {
      "type": "string",
      "defaultValue": "php|7.0",
      "metadata": {
        "description": "The Runtime stack of current web app"
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat(parameters('projectName'), uniqueString(resourceGroup().id))]",
    "webAppName": "[concat(parameters('projectName'), 'WebApp')]",
    "appServicePlanName": "[concat(parameters('projectName'), 'Plan')]"
  },
  "resources": [
    {
      "name": "linkedTemplate",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "relativePath": "linkedStorageAccount.json"
        },
        "parameters": {
          "storageAccountName": {
            "value": "[variables('storageAccountName')]"
          },
          "location": {
            "value": "[parameters('location')]"
          }
        }
      }
    },
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2022-09-01",
      "name": "[variables('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "B1",
        "tier": "Basic",
        "size": "B1",
        "family": "B",
        "capacity": 1
      },
      "kind": "linux",
      "properties": {
        "perSiteScaling": false,
        "reserved": true,
        "targetWorkerCount": 0,
        "targetWorkerSizeId": 0
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2022-09-01",
      "name": "[variables('webAppName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]"
      ],
      "kind": "app",
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]",
        "siteConfig": {
          "linuxFxVersion": "[parameters('linuxFxVersion')]"
        }
      }
    }
  ],
  "outputs": {
    "storageEndpoint": {
      "type": "object",
      "value": "[reference('linkedTemplate').outputs.storageEndpoint.value]"
    }
  }
}

A csatolt sablon tárolása

A fő sablon és a csatolt sablon is a GitHubon van tárolva:

A következő PowerShell-szkript létrehoz egy tárfiókot, létrehoz egy tárolót, és átmásolja a két sablont egy GitHub-adattárból a tárolóba. Ez a két sablon a következő:

Válassza a Kipróbálás lehetőséget a Cloud Shell megnyitásához, válassza a Másolás lehetőséget a PowerShell-szkript másolásához, majd kattintson a jobb gombbal a rendszerhéj panelre a szkript beillesztéséhez:

Fontos

A tárfiókok nevének egyedinek kell lennie, 3 és 24 karakter közötti hosszúságúnak kell lennie, és csak számokat és kisbetűket kell használnia. A mintasablon változója storageAccountName a projectName paraméter legfeljebb 11 karakterét egyesíti egy 13 karakteres egyediString értékkel.

$projectName = Read-Host -Prompt "Enter a project name:"   # This name is used to generate names for Azure resources, such as storage account name.
$location = Read-Host -Prompt "Enter a location (i.e. centralus)"

$resourceGroupName = $projectName + "rg"
$storageAccountName = $projectName + "store"
$containerName = "templates" # The name of the Blob container to be created.

$mainTemplateURL = "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/get-started-deployment/linked-template/azuredeploy.json"
$linkedTemplateURL = "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/get-started-deployment/linked-template/linkedStorageAccount.json"

$mainFileName = "azuredeploy.json" # A file name used for downloading and uploading the main template.Add-PSSnapin
$linkedFileName = "linkedStorageAccount.json" # A file name used for downloading and uploading the linked template.

# Download the templates
Invoke-WebRequest -Uri $mainTemplateURL -OutFile "$home/$mainFileName"
Invoke-WebRequest -Uri $linkedTemplateURL -OutFile "$home/$linkedFileName"

# Create a resource group
New-AzResourceGroup -Name $resourceGroupName -Location $location

# Create a storage account
$storageAccount = New-AzStorageAccount `
    -ResourceGroupName $resourceGroupName `
    -Name $storageAccountName `
    -Location $location `
    -SkuName "Standard_LRS"

$context = $storageAccount.Context

# Create a container
New-AzStorageContainer -Name $containerName -Context $context -Permission Container

# Upload the templates
Set-AzStorageBlobContent `
    -Container $containerName `
    -File "$home/$mainFileName" `
    -Blob $mainFileName `
    -Context $context

Set-AzStorageBlobContent `
    -Container $containerName `
    -File "$home/$linkedFileName" `
    -Blob $linkedFileName `
    -Context $context

Write-Host "Press [ENTER] to continue ..."

Sablon üzembe helyezése

Ha sablonokat szeretne üzembe helyezni egy tárfiókban, hozzon létre egy SAS-jogkivonatot, és adja meg a -QueryString paraméternek. Állítsa be a lejárati időt, hogy elegendő idő legyen az üzembe helyezés befejezéséhez. A sablonokat tartalmazó blobok csak a fióktulajdonos számára érhetők el. Ha azonban sas-jogkivonatot hoz létre egy blobhoz, a blob bárki számára elérhető, aki rendelkezik ezzel az SAS-jogkivonattal. Ha egy másik felhasználó elfogja az URI-t és az SAS-jogkivonatot, az a felhasználó hozzáférhet a sablonhoz. Az SAS-jogkivonat jó módszer a sablonokhoz való hozzáférés korlátozására, de nem szabad bizalmas adatokat, például jelszavakat közvetlenül a sablonba foglalni.

Ha még nem hozta létre az erőforráscsoportot, olvassa el az Erőforráscsoport létrehozása című témakört.

Feljegyzés

Az alábbi Azure CLI-kódban date a paraméter -d érvénytelen argumentum macOS rendszerben. MacOS-felhasználóknak tehát 2 órát kell hozzáadniuk az aktuális időponthoz a macOS terminálban, amelyet érdemes használni -v+2H.


$projectName = Read-Host -Prompt "Enter the same project name:"   # This name is used to generate names for Azure resources, such as storage account name.

$resourceGroupName="${projectName}rg"
$storageAccountName="${projectName}store"
$containerName = "templates"

$key = (Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName -Name $storageAccountName).Value[0]
$context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $key

$mainTemplateUri = $context.BlobEndPoint + "$containerName/azuredeploy.json"
$sasToken = New-AzStorageContainerSASToken `
    -Context $context `
    -Container $containerName `
    -Permission r `
    -ExpiryTime (Get-Date).AddHours(2.0)
$newSas = $sasToken.substring(1)


New-AzResourceGroupDeployment `
  -Name DeployLinkedTemplate `
  -ResourceGroupName $resourceGroupName `
  -TemplateUri $mainTemplateUri `
  -QueryString $newSas `
  -projectName $projectName `
  -verbose

Write-Host "Press [ENTER] to continue ..."

Az erőforrások eltávolítása

Törölje az üzembe helyezett erőforrásokat az erőforráscsoport törlésével.

  1. Az Azure Portalon válassza az Erőforráscsoport lehetőséget a bal oldali menüben.
  2. A Szűrés név alapján mezőben adja meg az erőforráscsoport nevét.
  3. Válassza ki az erőforráscsoport nevét.
  4. A felső menüben válassza az Erőforráscsoport törlése lehetőséget.

Következő lépések

Megtanulta, hogyan helyezhet üzembe csatolt sablont. A következő oktatóanyagban megtudhatja, hogyan hozhat létre DevOps-folyamatot sablon üzembe helyezéséhez.