分享方式:


為 Bicep 檔案中的部署指令碼設定開發環境

了解如何使用部署指令碼映像,來建立可用來開發和測試部署指令碼的開發環境。 您可以建立 Azure 容器執行個體,或使用 Docker (英文)。 此文章將涵蓋這兩個選項。

必要條件

Azure PowerShell 容器

如果您沒有 Azure PowerShell 部署指令碼,您可以使用下列內容來建立 hello.ps1 檔案:

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

Connect-AzAccount -UseDeviceAuthentication
Set-AzContext -subscription $subscription

$kv = Get-AzKeyVault
#Write-Output $kv

$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['greeting'] = $output
$DeploymentScriptOutputs['kv'] = $kv.resourceId
Write-Output $DeploymentScriptOutputs

在 Azure PowerShell 部署指令碼中,$DeploymentScriptOutputs 變數會用來儲存輸出值。 如需使用 Azure PowerShell 輸出的詳細資訊,請參閱使用輸出

Azure CLI 容器

針對 Azure CLI 容器映像,您可以使用下列內容來建立 hello.sh 檔案:

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

在 Azure CLI 部署指令碼中,名為 AZ_SCRIPTS_OUTPUT_PATH 的環境變數會儲存指令碼輸出檔案的位置。 此環境變數無法在開發環境容器中使用。 如需使用 Azure CLI 輸出的詳細資訊,請參閱使用 CLI 指令碼的輸出

使用 Azure PowerShell 容器執行個體

若要在電腦上撰寫 Azure PowerShell 指令碼,您必須建立儲存體帳戶,並將儲存體帳戶掛接到容器執行個體。 如此一來,您就可以將指令碼上傳至儲存體帳戶,並在容器執行個體上執行指令碼。 您建立來測試指令碼的儲存體帳戶,與部署指令碼服務用來執行指令碼的儲存體帳戶不同。 部署指令碼服務會在每次執行時,建立唯一的名稱來作為檔案共用。

建立 Azure PowerShell 容器執行個體

下列 Bicep 檔案會建立容器執行個體和檔案共用,然後將檔案共用掛接到容器映像。

@description('Specify a project name that is used for generating resource names.')
param projectName string

@description('Specify the resource location.')
param location string = resourceGroup().location

@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7'

@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'

var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource fileShare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01' = {
  name: '${storageAccountName}/default/${fileShareName}'
  dependsOn: [
    storageAccount
  ]
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
  name: containerGroupName
  location: location
  properties: {
    containers: [
      {
        name: containerName
        properties: {
          image: containerImage
          resources: {
            requests: {
              cpu: 1
              memoryInGB: json('1.5')
            }
          }
          ports: [
            {
              protocol: 'TCP'
              port: 80
            }
          ]
          volumeMounts: [
            {
              name: 'filesharevolume'
              mountPath: mountPath
            }
          ]
          command: [
            '/bin/sh'
            '-c'
            'pwsh -c \'Start-Sleep -Seconds 1800\''
          ]
        }
      }
    ]
    osType: 'Linux'
    volumes: [
      {
        name: 'filesharevolume'
        azureFile: {
          readOnly: false
          shareName: fileShareName
          storageAccountName: storageAccountName
          storageAccountKey: storageAccount.listKeys().keys[0].value
        }
      }
    ]
  }
}

掛接路徑的預設值為 /mnt/azscripts/azscriptinput。 這是容器執行個體中掛接到檔案共用的路徑。

Bicep 檔案中指定的預設容器映像是 mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7。 請參閱所有支援的 Azure PowerShell 版本清單。

Bicep 檔案會在 1,800 秒之後暫止容器執行個體。 在容器執行個體進入終止狀態且工作階段結束之前,您有 30 分鐘的時間。

使用下列指令碼來部署 Bicep 檔案:

$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 Bicep file path and file name"
$resourceGroupName = "${projectName}rg"

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

上傳部署指令碼

將部署指令碼上傳至儲存體帳戶。 以下是 PowerShell 指令碼範例:

$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

您也可以使用 Azure 入口網站或 Azure CLI 來上傳檔案。

測試部署指令碼

  1. 在 Azure 入口網站中,開啟您部署容器執行個體和儲存體帳戶所在的資源群組。

  2. 開啟容器群組。 預設容器群組名稱是附加 cg 的專案名稱。 此容器執行個體處於執行中狀態。

  3. 在資源功能表中,選取 [容器]。 容器執行個體名稱是附加 container 的專案名稱。

    Azure 入口網站中的部署指令碼連線容器執行個體選項的螢幕擷取畫面。

  4. 選取 [連線],然後選取 [連線]。 如果您無法連線到容器執行個體,請將容器群組重新啟動,然後再試一次。

  5. 在主控台窗格中,執行下列命令:

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

    輸出為 Hello John Dole

    主控台中顯示的部署指令碼連線容器執行個體測試輸出的螢幕擷取畫面。

使用 Azure CLI 容器執行個體

若要在電腦上撰寫 Azure CLI 指令碼,請建立儲存體帳戶,並將儲存體帳戶掛接到容器執行個體。 接著,您可以將指令碼上傳至儲存體帳戶,並在容器執行個體上執行指令碼。 您建立來測試指令碼的儲存體帳戶,與部署指令碼服務用來執行指令碼的儲存體帳戶不同。 部署指令碼服務會在每次執行時,建立唯一的名稱來作為檔案共用。

建立 Azure CLI 容器執行個體

下列 Bicep 檔案會建立容器執行個體和檔案共用,然後將檔案共用掛接到容器映像:

@description('Specify a project name that is used for generating resource names.')
param projectName string

@description('Specify the resource location.')
param location string = resourceGroup().location

@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azure-cli:2.9.1'

@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'

var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource fileshare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
  name: '${storageAccountName}/default/${fileShareName}'
  dependsOn: [
    storageAccount
  ]
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
  name: containerGroupName
  location: location
  properties: {
    containers: [
      {
        name: containerName
        properties: {
          image: containerImage
          resources: {
            requests: {
              cpu: 1
              memoryInGB: json('1.5')
            }
          }
          ports: [
            {
              protocol: 'TCP'
              port: 80
            }
          ]
          volumeMounts: [
            {
              name: 'filesharevolume'
              mountPath: mountPath
            }
          ]
          command: [
            '/bin/bash'
            '-c'
            'echo hello; sleep 1800'
          ]
        }
      }
    ]
    osType: 'Linux'
    volumes: [
      {
        name: 'filesharevolume'
        azureFile: {
          readOnly: false
          shareName: fileShareName
          storageAccountName: storageAccountName
          storageAccountKey: storageAccount.listKeys().keys[0].value
        }
      }
    ]
  }
}

掛接路徑的預設值為 /mnt/azscripts/azscriptinput。 這是容器執行個體中掛接到檔案共用的路徑。

Bicep 檔案中指定的預設容器映像是 mcr.microsoft.com/azure-cli:2.9.1。 請參閱支援的 Azure CLI 版本清單。 部署指令碼會使用 Microsoft Container Registry (MCR) 中的可用 CLI 映像。 對 CLI 映像進行部署指令碼的認證大約需要一個月的時間。 請勿使用在 30 天內發行的 CLI 版本。 若要尋找映像的發行日期,請參閱 Azure CLI 版本資訊。 如果您使用不支援的版本,錯誤訊息就會列出支援的版本。

Bicep 檔案會在 1,800 秒之後暫止容器執行個體。 在容器執行個體進入終端狀態且工作階段結束之前,您有 30 分鐘的時間。

若要部署 Bicep 檔案:

$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 Bicep file path and file name"
$resourceGroupName = "${projectName}rg"

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

上傳部署指令碼

將部署指令碼上傳至儲存體帳戶。 下列指令碼是 PowerShell 範例:

$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

您也可以使用 Azure 入口網站或 Azure CLI 來上傳檔案。

測試部署指令碼

  1. 在 Azure 入口網站中,開啟您部署容器執行個體和儲存體帳戶所在的資源群組。

  2. 開啟容器群組。 預設容器群組名稱是附加 cg 的專案名稱。 此容器執行個體顯示執行中狀態。

  3. 在資源功能表中,選取 [容器]。 容器執行個體名稱是附加 container 的專案名稱。

    Azure 入口網站中的部署指令碼連線容器執行個體選項的螢幕擷取畫面。

  4. 選取 [連線],然後選取 [連線]。 如果您無法連線到容器執行個體,請將容器群組重新啟動,然後再試一次。

  5. 在主控台窗格中,執行下列命令:

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

    輸出為 Hello John Dole

    主控台中顯示的部署指令碼容器執行個體測試輸出的螢幕擷取畫面。

使用 Docker

您可以使用預先設定的 Docker 容器映像作為部署指令碼開發環境。 若要安裝 Docker,請參閱取得 docker (英文)。 您也需要設定檔案共用,將包含部署指令碼的目錄掛接到 Docker 容器。

  1. 將部署指令碼容器映像提取到本機電腦:

    docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az10.0
    

    此範例使用 PowerShell 4.3.0 版。

    從 MCR 提取 CLI 映像:

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

    此範例使用 CLI 2.52.0 版。 部署指令碼會使用預設的 CLI 容器映像。

  2. 在本機執行 Docker 映像。

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

    以共用磁碟機上的現有資料夾取代 <主機磁碟機代號><主機目錄名稱>。 其會將資料夾對應至容器中的 /data 資料夾。 例如,若要對應 D:\docker

    docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az10.0
    

    -it 表示讓容器映像保持運作。

    CLI 範例:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.52.0
    
  3. 下列螢幕擷取畫面顯示當您在共用磁碟機中有 helloworld.ps1 檔案時,如何執行 PowerShell 指令碼。

    使用 Docker 命令的 Resource Manager 範本部署指令碼的螢幕擷取畫面。

成功測試指令碼之後,您可以使用其做為 Bicep 檔案中的部署指令碼。

下一步

在本文中,您已了解如何建立指令碼開發環境。 若要深入了解: