Azure Devops: Вызов шаблона из встроенного сценария

#azure-devops #azure-powershell #azure-pipelines-yaml #azure-template

Вопрос:

У меня есть Шаблон.yml, имеющий один параметр. Я хотел бы вызвать этот шаблон из встроенного скрипта. Как я могу этого достичь?

Orchastrtor.yml

 parameters:
  AzureSubscription: []

jobs:
- job: update
  condition: succeeded()
  pool: 
      vmImage: "windows-latest"
  steps:
  - task: AzurePowerShell@4
    displayName: Update
    inputs:
        azureSubscription: 'xxx'
        ScriptType: 'InlineScript'
        Inline: |
            Write-Output "subscription is '${{ parameters.AzureSubscription }}' "
            $sub = ${{ parameters.AzureSubscription }}
            foreach($Result in $sub ){
                # Want to call my template from this.
               ../template/yaml -parameter 
            }
        azurePowerShellVersion: 'LatestVersion'
        FailOnStandardError: true
 

Шаблон.Yaml — Имеет один параметр и 2 задачи.

 parameters:
  azureSubscription: ''

steps:

  - task: AzurePowerShell@4
    displayName: Updating ${{ parameters.azureSubscription }}
    inputs:
      azureSubscription: ${{ parameters.azureSubscription }}
      ScriptType: 'FilePath'
      ScriptPath: '$(System.DefaultWorkingDirectory)/Foundation/xx.ps1'
      azurePowerShellVersion: 'LatestVersion'
 

Кто-нибудь может мне помочь, как я могу вызвать шаблон?

Комментарии:

1. Откуда вызывается шаблон? Вы используете VSTS или консоль Powershell?

2. У меня есть один Орхастр. yml, у которого есть одна задача встроенного скрипта. Поэтому внутри скрипта я хочу вызвать шаблон.yml. Я использую powershell

3. Есть ли какое-либо ограничение, что вы не можете добавить более одной задачи в свой Orchastrator.yml ? Если нет, то вы можете добавить задачу конвейера запуска в Orchastrator. yml для запуска конвейера template.yml.

4. На самом деле, есть некоторые ограничения, которых мы хотим достичь, поэтому, если я смогу вызвать шаблон из сценария, наша проблема будет решена. так что ищем решение

5. Можете ли вы показать свой шаблон.yml?

Ответ №1:

Поскольку вы не можете так легко передать подписку azure:

@JoeGaggler эта функция сегодня не поддерживается. Использование конечных точек службы (подписка Azure является единственной в своем роде) в определении выпуска/сборки контролируется некоторыми разрешениями. Во время сохранения служба определения выпуска/сборки проверяет, что автор (тот, кто сохраняет определение) имеет соответствующие разрешения на конечную точку. Если мы поддерживаем замену переменных для ввода конечной точки службы, то служба не сможет проверить, есть ли у автора необходимые разрешения или нет, и это может стать проблемой безопасности.

Здесь вам нужно использовать обходной путь. И под этим я подразумеваю использование чистого кода powershell, включая вход в Azure. Так что, если ваш шаблон будет

 parameters:
- name: 'group'
  type: string
- name: 'scriptPath'
  type: string

jobs:
- job:
  variables:
  - group: ${{ parameters.group }}
  steps:
  - pwsh: |
      $pscredential = New-Object -TypeName System.Management.Automation.PSCredential($(applicationId), $sp.SECRET)
      Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $(tenantId)
      ${{ parameters.scriptPath }}
    env:
      SECRET: secret
    
 

Здесь я предполагаю, что вы создадите одну переменную группу для каждой имеющейся у вас подписки. Каждая группа должна иметь следующие значения:

  • Идентификатор приложения
  • секретно (секрет принципала службы также считается секретным в Azure Devops, и поэтому необходимо сопоставление env)
  • идентификатор арендатора

Тогда вы назовете это так:

 parameters:
  groups: []

jobs:
- ${{ each subscriptionGroup parameters.groups}}:
  - template: ../template.yaml
      parameters:
        group: ${{ subscriptionGroup }}
        scriptPath: '$(System.DefaultWorkingDirectory)/Foundation/xx.ps1'
 

Недостаток:

  • раньше у вас было несколько шагов в одном задании, теперь у вас есть один шаг в нескольких заданиях, поэтому его выполнение может занять немного больше времени

Комментарии:

1. В самом деле! этот способ работает немного дольше, чем ожидалось

Ответ №2:

Это невозможно. Но я думаю, что вы можете достичь тех же результатов, используя выражение с each ключевым словом, которое ведет себя как цикл, описанный в вашем примере использования.

Так что ваш Orchastrtor.yml был бы таким:

 parameters:
  AzureSubscription: []

jobs:
- job: update
  pool: 
      vmImage: "windows-latest"
  steps:
  - ${{ each subscription in parameters.AzureSubscription }}:
    - template: ../template.yaml
      parameters:
        azureSubscription: ${{ subscription }}
 

Комментарии:

1. Пытался это сделать. Но проблема в моем сценарии, у меня нет списка подписчиков заранее. который я извлекаю из задачи и передаю в качестве параметра для вызова этого yaml, и там он терпит неудачу, так как foreach всегда проверяет значение во время компиляции. Поэтому я вызвал из сценария, и это сработало,