Что такое сценарии развертывания?

Завершено

В этом модуле вы узнаете, как ресурс deploymentScripts позволяет расширять шаблоны Azure Resource Manager (ARM).

Шаблоны ARM предоставляют множество удобных инструментов. Их можно использовать для объявления желаемого состояния облачной инфраструктуры, чтобы интерфейсы API и службы могли понять, как этого добиться. Однако иногда приходится выполнять действия, которые выходят за рамки возможностей Azure Resource Manager.

Что такое сценарии развертывания?

Ресурсы deploymentScripts — это сценарии PowerShell или Bash, которые выполняются в контейнере Docker в рамках развертывания шаблона. Стандартные образы контейнеров предоставляют доступ к Azure CLI или Azure PowerShell. Эти скрипты выполняются во время обработки шаблона ARM, поэтому можно добавить настраиваемое поведение в процесс развертывания.

Для проверки подлинности в Azure сценарии развертывания используют управляемое удостоверение. Управляемое удостоверение — это субъект-служба, учетные данные и жизненный цикл которого управляются платформой Azure. Это удостоверение будет использоваться командами Azure PowerShell или Azure CLI для работы в среде. Поскольку вы назначаете удостоверение, вы управляете областью, на которую может влиять ресурс deploymentScripts.

deploymentScriptsРесурс создает выходные данные, которые могут использоваться другими ресурсами в развертывании. Затем можно выполнить поиск информации из внешней системы или предоставить данные с учетом текущего состояния среды, чтобы повлиять на остальную часть развертывания.

Как работают сценарии развертывания

Ресурс deploymentScripts принимает предоставленный пользователем сценарий (из шаблона или по URI) и, возможно, некоторые дополнительные сценарии и запускает их в экземпляре контейнера Azure. Этому экземпляру контейнера назначается управляемое удостоверение, которое вы предоставляете. Сценарии и их выходные данные хранятся в общей папке для учетной записи службы хранения Azure.

При выполнении развертывания шаблона проверяется наличие существующего ресурса deploymentScripts в целевой группе ресурсов. Если да, то выполняется сравнение свойств. Если все совпадает, ничего нового не происходит. Если ресурс не существует или был изменен, Azure Resource Manager создает новый экземпляр контейнера и выполняет сценарии развертывания в этом экземпляре контейнера. Все определенные выходные данные будут переданы обратно в Azure Resource Manager для дальнейшего использования в развертывании.

Структура сценария развертывания

Чтобы добавить пользовательское поведение в шаблон ARM, начните с ресурса deploymentScripts. Как минимум необходимо предоставить следующие общие сведения:

  • name для ресурса deploymentScripts.
  • Значения type и apiVersion.
  • Расположение (значение location), в котором будут создаваться вспомогательные ресурсы.
  • Пустой объект properties. Вскоре мы до этого дойдем.

Требуются два значения, характерных для deploymentScripts:

  • kind: тип выполняемого сценария (AzurePowerShell или 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: управляемое удостоверение, которое будет использоваться экземпляром контейнера. Вы можете заранее создать управляемое удостоверение и указать его, как показано в следующем примере, или создать его в шаблоне и ссылаться на него (это то, что вы будете делать в следующем упражнении).

    {
      "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': {}
        }
      }
    }
    

После настройки этих элементов можно перейти к разделу properties ресурса deploymentScripts. Основной частью этого является объект 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
  '''
}

Обратите внимание, что scriptContent использует многострочный строковый тип. В Bicep можно указать многострочный строковый тип, используя три кавычки вместе (''') до и после строкового типа.

Обычно сценарий развертывания передает выходные данные в развертывание. Например, если сценарий используется для поиска какой-либо информации из API, вы можете передать информацию в развертывание как выходные данные. Затем другие ресурсы в развертывании могут использовать эти сведения в собственных определениях.

Для сценария PowerShell выходные данные передаются обратно путем создания переменной с именем $DeploymentScriptOutputs, которая должна быть хэш-таблицей. В этом примере сценария инициализируется хэш-таблица, а затем создаются выходные данные с именем text, которые принимает свое значение из локальной переменной $output:

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

Совет

Сценарии развертывания также можно записать в Bash. Чтобы создать выходные данные из сценария Bash, необходимо создать JSON-файл в расположении, заданном переменной среды AZ_SCRIPTS_OUTPUT_PATH.

В разделе properties также определяются различные параметры, которые может принимать deploymentScripts. В этом модуле мы сделаем проще и добавим достаточно параметров, чтобы запустить сценарий. Как минимум, необходимо указать версию Azure PowerShell или Azure CLI для использования, сценарий для выполнения и интервал хранения.

Интервал хранения — это период, в течение которого должны храниться результаты, если требуется сохранить ресурсы. По умолчанию результаты удаляются после выполнения сценария.

"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'
}

Наш полный шаблон будет выглядеть примерно так:

{
  "$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

Включение файлов сценария

Внедрение сценариев, встроенных в шаблоны, может быть сложным, трудным для чтения и понимания и практически не поддерживает изменения. Bicep использует функцию loadTextContent() для внедрения внешнего текстового файла в развертывание. Когда Bicep преобразует шаблон в JSON, он внедряет внешний файл в создаваемый шаблон.

Предположим, у вас есть файл PowerShell с именем myscript.ps1 в той же папке, что и шаблон Bicep. Вы можете дать Bicep команду для внедрения файла:

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

Все свойства ресурса deploymentScripts можно найти в справочной документации по шаблону ARM.