Dağıtım betikleri nedir?

Tamamlandı

Bu ünitede kaynağın deploymentScripts Azure Resource Manager (ARM) şablonlarını nasıl genişletebileceğini öğreneceksiniz.

ARM şablonları harika şeylerdir. Bunları kullanarak bulut altyapınızın istenen durumunu bildirebilir ve API'lerin ve hizmetlerin sizi oraya nasıl ulaşacaklarını öğrenmesini sağlayabilirsiniz. Ancak, bazen Azure Resource Manager'ın sağladığının dışında eylemler gerçekleştirmeniz gerekir.

Dağıtım betikleri nedir?

deploymentScripts kaynaklar, şablon dağıtımınızın bir parçası olarak Docker kapsayıcısında çalışan PowerShell veya Bash betikleridir. Varsayılan kapsayıcı görüntüleri Azure CLI veya Azure PowerShell'e sahiptir. Bu betikler ARM şablonu işleme sırasında çalıştırıldığından dağıtım işlemine özel davranış ekleyebilirsiniz.

Dağıtım betikleri, Azure'da kimlik doğrulaması yapmak için yönetilen kimlik kullanır. Yönetilen kimlik, kimlik bilgileri ve yaşam döngüsü Azure platformu tarafından yönetilen bir hizmet sorumlusudur. Bu kimlik, Azure PowerShell veya Azure CLI komutlarının ortamda işlem yapmak için kullanacağı kimliktir. Kimliği atadığınızdan, kaynağın deploymentScripts neleri etkileyebileceğinin kapsamını denetleyebilirsiniz.

Kaynak, deploymentScripts dağıtımdaki diğer kaynakların kullanabileceği bir çıktı oluşturur. Daha sonra dış sistemden bilgi arayabilir veya dağıtımın geri kalanını etkilemek için ortamınızın geçerli durumuna göre veri sağlayabilirsiniz.

Dağıtım betikleri nasıl çalışır?

Kaynak deploymentScripts , kullanıcı tarafından sağlanan bir betik (şablondan veya URI ile) ve büyük olasılıkla bazı destekleyici betikleri alır ve bunları bir Azure kapsayıcı örneğinde çalıştırır. Bu kapsayıcı örneğine, sağladığınız yönetilen kimlik atanır. Betikler ve çıktıları bir Azure depolama hesabı için dosya paylaşımında depolanır.

Şablon dağıtımı çalıştırıldığında, hedeflenen kaynak grubunda mevcut deploymentScripts bir kaynak olup olmadığını denetler. Öyleyse, özellikleri karşılaştırır. Her şey eşleşirse, yeni bir şey olmaz. Kaynak yoksa veya değiştirilmişse, Azure Resource Manager yeni bir kapsayıcı örneği oluşturur ve dağıtım betiklerini bu kapsayıcı örneğinde çalıştırır. Tanımlanan tüm çıkışlar, dağıtımda daha sonra kullanılmak üzere Azure Resource Manager'a geri geçirilir.

Dağıtım betiği yapısı

ARM şablonuna özel bir davranış eklemek için kaynakla deploymentScripts başlarsınız. En azından aşağıdakiler gibi yaygın ayrıntıları sağlamanız gerekir:

  • Kaynak için A namedeploymentScripts .
  • type ve apiVersion değerleri.
  • Destekleyici kaynakların oluşturulacağı konum (location değer).
  • Boş properties bir nesne. Kısa bir süre sonra buna ulaşacaksın.

İki deploymentScriptsözel değer gereklidir:

  • kind: Çalıştırılacak betiğin türü ( AzurePowerShell veya AzureCLI).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      }
    }
    
    resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: 'myFirstDeploymentScript'
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
        }
      }
    }
    
  • identity: Kapsayıcı örneğinin kullanacağı yönetilen kimlik. Yönetilen kimliği önceden oluşturup aşağıdaki örnekte olduğu gibi belirtebilir veya şablonda oluşturup orada başvurabilirsiniz (sonraki alıştırmada bunu yapacaksınız).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      }
    }
    
    resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: 'myFirstDeploymentScript'
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
        }
      }
    }
    

Bu öğeleri ayarladıktan sonra kaynağın properties bölümüne deploymentScripts geçebilirsiniz. Bunun ana bölümü, yürütülecek gerçek betiği belirten bölümüdür scriptContent:

"properties": {
  "scriptContent": "
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
  ",
}
properties: {
  scriptContent: '''
    $output = 'Hello Learner!'
    Write-Output $output
    $DeploymentScriptOutputs = @{}
    $DeploymentScriptOutputs['text'] = $output
  '''
}

çok satırlı bir dize kullandığına scriptContent dikkat edin. Bicep'te, dizenizden önce ve sonra birlikte üç tırnak işareti (''') kullanarak çok satırlı bir dize belirtebilirsiniz.

Dağıtım betiğinin çıkışları dağıtıma geri geçirmesi yaygın bir durumdır. Örneğin, BIR API'den bazı bilgileri aramak için bir betik kullanıyorsanız, bilgileri dağıtıma çıkış olarak geri geçirebilirsiniz. Daha sonra dağıtımdaki diğer kaynaklar bilgileri kendi tanımlarında kullanabilir.

PowerShell betiği için, karma tablo olması gereken adlı $DeploymentScriptOutputsbir değişken oluşturarak çıkışları geri geçirirsiniz. Örnek betik karma tablosunu başlatır ve ardından değerini yerel değişkenden $output alan adlı textbir çıkış oluşturur:

$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output

Bahşiş

Bash'te dağıtım betikleri de yazabilirsiniz. Bash betiğinden çıkışlar oluşturmak için ortam değişkeni tarafından AZ_SCRIPTS_OUTPUT_PATH belirtilen bir konumda bir JSON dosyası oluşturmanız gerekir.

properties bölümünde, kullanılabilecek çeşitli seçenekleri deploymentScripts de tanımlarsınız. Bu modülde, bunu basit tutacağız ve betiği çalıştırmak için yeterli miktarda ekleyeceğiz. En azından, kullanılacak Azure PowerShell veya Azure CLI sürümünü, çalıştırılacak betiği ve bekletme aralığını sağlamanız gerekir.

Kaynakları tutmak istiyorsanız elde tutma aralığı, sonuçların ne kadar süreyle tutulacağıdır. Varsayılan olarak, betiği çalıştırdıktan sonra sonuçlar kaldırılır.

"properties": {
  "azPowerShellVersion": "3.0",
  "scriptContent": "
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
  ",
  "retentionInterval": "P1D"
}
properties: {
  azPowerShellVersion: '3.0'
  scriptContent: '''
    $output = 'Hello Learner!'
    Write-Output $output
    $DeploymentScriptOutputs = @{}
    $DeploymentScriptOutputs['text'] = $output
  '''
  retentionInterval: 'P1D'
}

Tam şablonumuz şuna benzer olacaktır:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.1",
  "apiProfile": "",
  "parameters": {},
  "variables": {},
  "functions": [],
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      },
      "properties": {
        "azPowerShellVersion": "3.0",
        "scriptContent": "
            $output = 'Hello Learner!'
            Write-Output $output
            $DeploymentScriptOutputs = @{}
            $DeploymentScriptOutputs['text'] = $output
        ",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "scriptResult": {
      "type": "string",
      "value": "[reference('myFirstDeploymentScript').outputs.text]"
    }
  }
}
resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: 'myFirstDeploymentScript'
  location: resourceGroup().location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
    }
  }
  properties: {
    azPowerShellVersion: '3.0'
    scriptContent: '''
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
    '''
    retentionInterval: 'P1D'
  }
}

output scriptResult string = myFirstDeploymentScript.properties.outputs.text

Betik dosyalarını dahil et

Betikleri şablonlara satır içine eklemek hantal, okunup anlaşılması zor ve değiştirilmesi zor olabilir. Bicep, dağıtımınıza dış metin dosyası eklemek için işlevini kullanır loadTextContent() . Bicep, şablonunuzu JSON'a dönüştürdiğinde dış dosyayı yaydığı şablona ekler.

Bicep şablonunuzla aynı klasörde myscript.ps1 adlı bir PowerShell dosyanız olduğunu varsayalım. Bicep'e dosyayı şu şekilde eklemesini söyleyebilirsiniz:

properties: {
  azPowerShellVersion: '3.0'
  scriptContent: loadTextContent('myscript.ps1')
  retentionInterval: 'P1D'
}

Arm şablonu başvuru belgelerinde kaynağın deploymentScriptstüm özelliklerini bulabilirsiniz.