為 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 來上傳檔案。
測試部署指令碼
在 Azure 入口網站中,開啟您部署容器執行個體和儲存體帳戶所在的資源群組。
開啟容器群組。 預設容器群組名稱是附加 cg 的專案名稱。 此容器執行個體處於執行中狀態。
在資源功能表中,選取 [容器]。 容器執行個體名稱是附加 container 的專案名稱。
選取 [連線],然後選取 [連線]。 如果您無法連線到容器執行個體,請將容器群組重新啟動,然後再試一次。
在主控台窗格中,執行下列命令:
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 來上傳檔案。
測試部署指令碼
在 Azure 入口網站中,開啟您部署容器執行個體和儲存體帳戶所在的資源群組。
開啟容器群組。 預設容器群組名稱是附加 cg 的專案名稱。 此容器執行個體顯示執行中狀態。
在資源功能表中,選取 [容器]。 容器執行個體名稱是附加 container 的專案名稱。
選取 [連線],然後選取 [連線]。 如果您無法連線到容器執行個體,請將容器群組重新啟動,然後再試一次。
在主控台窗格中,執行下列命令:
cd /mnt/azscripts/azscriptinput ls ./hello.sh John Dole
輸出為 Hello John Dole。
使用 Docker
您可以使用預先設定的 Docker 容器映像作為部署指令碼開發環境。 若要安裝 Docker,請參閱取得 docker (英文)。 您也需要設定檔案共用,將包含部署指令碼的目錄掛接到 Docker 容器。
將部署指令碼容器映像提取到本機電腦:
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 容器映像。
在本機執行 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
下列螢幕擷取畫面顯示當您在共用磁碟機中有 helloworld.ps1 檔案時,如何執行 PowerShell 指令碼。
成功測試指令碼之後,您可以使用其做為 Bicep 檔案中的部署指令碼。
下一步
在本文中,您已了解如何建立指令碼開發環境。 若要深入了解: