Share via


Konfigurera utvecklingsmiljön för distributionsskript i ARM-mallar

Lär dig hur du skapar en utvecklingsmiljö för att utveckla och testa distributionsskript för ARM-mallar med en distributionsskriptbild. Du kan antingen skapa en Azure-containerinstans eller använda Docker. Båda alternativen beskrivs i den här artikeln.

Förutsättningar

Azure PowerShell-container

Om du inte har något Azure PowerShell-distributionsskript kan du skapa en hello.ps1-fil med hjälp av följande innehåll:

param([string] $name)
$output = 'Hello {0}' -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output

Azure CLI-container

För en Azure CLI-containeravbildning kan du skapa en hello.sh fil med hjälp av följande innehåll:

FIRSTNAME=$1
LASTNAME=$2
OUTPUT="{\"name\":{\"displayName\":\"$FIRSTNAME $LASTNAME\",\"firstName\":\"$FIRSTNAME\",\"lastName\":\"$LASTNAME\"}}"
echo -n "Hello "
echo $OUTPUT | jq -r '.name.displayName'

Kommentar

När du kör ett Azure CLI-distributionsskript lagrar en miljövariabel med namnet AZ_SCRIPTS_OUTPUT_PATH platsen för skriptets utdatafil. Miljövariabeln är inte tillgänglig i containern för utvecklingsmiljön. Mer information om hur du arbetar med Azure CLI-utdata finns i Arbeta med utdata från CLI-skript.

Använda Azure PowerShell-containerinstans

Om du vill skapa skripten på datorn måste du skapa ett lagringskonto och montera lagringskontot på containerinstansen. Så att du kan ladda upp skriptet till lagringskontot och köra skriptet på containerinstansen.

Kommentar

Lagringskontot som du skapar för att testa skriptet är inte samma lagringskonto som distributionsskripttjänsten använder för att köra skriptet. Distributionsskripttjänsten skapar ett unikt namn som en filresurs vid varje körning.

Skapa en Azure PowerShell-containerinstans

Följande Azure Resource Manager-mall (ARM-mall) skapar en containerinstans och en filresurs och monterar sedan filresursen till containeravbildningen.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specify a project name that is used for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the resource location."
      }
    },
    "containerImage": {
      "type": "string",
      "defaultValue": "mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7",
      "metadata": {
        "description": "Specify the container image."
      }
    },
    "mountPath": {
      "type": "string",
      "defaultValue": "/mnt/azscripts/azscriptinput",
      "metadata": {
        "description": "Specify the mount path."
      }
    }
  },
  "variables": {
    "storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
    "fileShareName": "[format('{0}share', parameters('projectName'))]",
    "containerGroupName": "[format('{0}cg', parameters('projectName'))]",
    "containerName": "[format('{0}container', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2023-01-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2023-05-01",
      "name": "[variables('containerGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "containers": [
          {
            "name": "[variables('containerName')]",
            "properties": {
              "image": "[parameters('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGB": "[json('1.5')]"
                }
              },
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "[parameters('mountPath')]"
                }
              ],
              "command": [
                "/bin/sh",
                "-c",
                "pwsh -c 'Start-Sleep -Seconds 1800'"
              ]
            }
          }
        ],
        "osType": "Linux",
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
              "readOnly": false,
              "shareName": "[variables('fileShareName')]",
              "storageAccountName": "[variables('storageAccountName')]",
              "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').keys[0].value]"
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    }
  ]
}

Standardvärdet för monteringssökvägen är /mnt/azscripts/azscriptinput. Det här är sökvägen i containerinstansen där den monteras på filresursen.

Standardcontaineravbildningen som anges i mallen är mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Se en lista över alla Azure PowerShell-versioner som stöds.

Mallen pausar containerinstansen efter 1 800 sekunder. Du har 30 minuter på dig innan containerinstansen hamnar i ett avslutat tillstånd och sessionen avslutas.

Så här distribuerar du mallen:

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName

Ladda upp distributionsskriptet

Ladda upp distributionsskriptet till lagringskontot. Här är ett exempel på ett PowerShell-skript:

$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"

$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"

$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force

Du kan också ladda upp filen med hjälp av Azure-portalen eller Azure CLI.

Testa distributionsskriptet

  1. I Azure-portalen öppnar du resursgruppen där du distribuerade containerinstansen och lagringskontot.

  2. Öppna containergruppen. Standardnamnet för containergruppen är projektnamnet som läggs till med cg. Containerinstansen är i tillståndet Körs .

  3. I resursmenyn väljer du Containrar. Namnet på containerinstansen är projektnamnet som läggs till med containern.

    Skärmbild av alternativet anslut containerinstans för distributionsskript i Azure-portalen.

  4. Välj Anslut och välj sedan Anslut. Om du inte kan ansluta till containerinstansen startar du om containergruppen och försöker igen.

  5. Kör följande kommandon i konsolfönstret:

    cd /mnt/azscripts/azscriptinput
    ls
    pwsh ./hello.ps1 "John Dole"
    

    Utdata är Hello John Dole.

    Skärmbild av distributionsskriptet ansluter containerinstanstestutdata som visas i konsolen.

Använda en Azure CLI-containerinstans

Skapa ett lagringskonto och montera lagringskontot till containerinstansen om du vill skapa skripten på datorn. Sedan kan du ladda upp skriptet till lagringskontot och köra skriptet på containerinstansen.

Kommentar

Lagringskontot som du skapar för att testa skriptet är inte samma lagringskonto som distributionsskripttjänsten använder för att köra skriptet. Distributionsskripttjänsten skapar ett unikt namn som en filresurs vid varje körning.

Skapa en Azure CLI-containerinstans

Följande ARM-mall skapar en containerinstans och en filresurs och monterar sedan filresursen till containeravbildningen:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specify a project name that is used for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the resource location."
      }
    },
    "containerImage": {
      "type": "string",
      "defaultValue": "mcr.microsoft.com/azure-cli:2.9.1",
      "metadata": {
        "description": "Specify the container image."
      }
    },
    "mountPath": {
      "type": "string",
      "defaultValue": "/mnt/azscripts/azscriptinput",
      "metadata": {
        "description": "Specify the mount path."
      }
    }
  },
  "variables": {
    "storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
    "fileShareName": "[format('{0}share', parameters('projectName'))]",
    "containerGroupName": "[format('{0}cg', parameters('projectName'))]",
    "containerName": "[format('{0}container', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2023-05-01",
      "name": "[variables('containerGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "containers": [
          {
            "name": "[variables('containerName')]",
            "properties": {
              "image": "[parameters('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGB": "[json('1.5')]"
                }
              },
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "[parameters('mountPath')]"
                }
              ],
              "command": [
                "/bin/bash",
                "-c",
                "echo hello; sleep 1800"
              ]
            }
          }
        ],
        "osType": "Linux",
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
              "readOnly": false,
              "shareName": "[variables('fileShareName')]",
              "storageAccountName": "[variables('storageAccountName')]",
              "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').keys[0].value]"
            }
          }
        ]
      },
      "dependsOn": [
        "storageAccount"
      ]
    }
  ]
}

Standardvärdet för monteringssökvägen är /mnt/azscripts/azscriptinput. Det här är sökvägen i containerinstansen där den monteras på filresursen.

Standardcontaineravbildningen som anges i mallen är mcr.microsoft.com/azure-cli:2.9.1. Se en lista över Azure CLI-versioner som stöds.

Viktigt!

Distributionsskriptet använder tillgängliga CLI-avbildningar från Microsoft Container Registry (MCR). Det tar ungefär en månad att certifiera en CLI-avbildning för ett distributionsskript. Använd inte DE CLI-versioner som släpptes inom 30 dagar. Information om hur du hittar versionsdatum för avbildningarna finns i Viktig information om Azure CLI. Om du använder en version som inte stöds visas de versioner som stöds i felmeddelandet.

Mallen pausar containerinstansen efter 1 800 sekunder. Du har 30 minuter på dig innan containerinstansen hamnar i ett terminaltillstånd och sessionen avslutas.

Så här distribuerar du mallen:

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName

Ladda upp distributionsskriptet

Ladda upp distributionsskriptet till lagringskontot. Följande är ett PowerShell-exempel:

$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"

$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"

$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force

Du kan också ladda upp filen med hjälp av Azure-portalen eller Azure CLI.

Testa distributionsskriptet

  1. I Azure-portalen öppnar du resursgruppen där du distribuerade containerinstansen och lagringskontot.

  2. Öppna containergruppen. Standardnamnet för containergruppen är projektnamnet som läggs till med cg. Containerinstansen visas i tillståndet Körs .

  3. I resursmenyn väljer du Containrar. Namnet på containerinstansen är projektnamnet som läggs till med containern.

    Skärmbild av alternativet anslut containerinstans för distributionsskript i Azure-portalen.

  4. Välj Anslut och välj sedan Anslut. Om du inte kan ansluta till containerinstansen startar du om containergruppen och försöker igen.

  5. Kör följande kommandon i konsolfönstret:

    cd /mnt/azscripts/azscriptinput
    ls
    ./hello.sh John Dole
    

    Utdata är Hello John Dole.

    Skärmbild av utdata från containerinstanstestet för distributionsskriptet som visas i konsolen.

Använda Docker

Du kan använda en förkonfigurerad Docker-containeravbildning som utvecklingsmiljö för distributionsskript. Information om hur du installerar Docker finns i Hämta Docker. Du måste också konfigurera fildelning för att montera katalogen, som innehåller distributionsskripten i Docker-containern.

  1. Hämta containeravbildningen för distributionsskriptet till den lokala datorn:

    docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    I exemplet används version PowerShell 4.3.0.

    Så här hämtar du en CLI-avbildning från en MCR:

    docker pull mcr.microsoft.com/azure-cli:2.0.80
    

    I det här exemplet används version CLI 2.0.80. Distributionsskriptet använder standardbilderna för CLI-containrar som finns här.

  2. Kör Docker-avbildningen lokalt.

    docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    Ersätt värddrivrutinsbeteckningen> och< värdkatalognamnet> med en befintlig mapp på den delade enheten.< Mappen mappas till mappen /data i containern. Om du till exempel vill mappa D:\docker:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    -det innebär att behålla containeravbildningen vid liv.

    Ett CLI-exempel:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
    
  3. Följande skärmbild visar hur du kör ett PowerShell-skript, med tanke på att du har en helloworld.ps1-fil på den delade enheten.

    Skärmbild av distributionsskriptet för Resource Manager-mallen med hjälp av Docker-kommandot.

När skriptet har testats kan du använda det som ett distributionsskript i dina mallar.

Nästa steg

I den här artikeln har du lärt dig hur du använder distributionsskript. Så här går du igenom en självstudie om distributionsskript: