Передача словаря в шаблонах конвейера Azure DevOps

В шаблоне конвейера Azure DevOps мне нужно передать переменные в качестве словаря в другой шаблон, который будет использовать задачу ansible для обработки всех ключей в словаре.

type: object кажется уместным, но я ищу работающий пример.

основной-template.yml

trigger:
- main

stages:
- stage: Deploy
  jobs:
  - job: DeployJob
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - template: ansible-template.yml
      parameters:
        ansibleVars:
          var1: value1
          var2: value2

ansible-template.yml

parameters:
- name: ansibleVars
  type: object
  default: {}

jobs:
- job: AnsibleJob
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.x'
      addToPath: true

  - script: |
      python -m pip install ansible-core
    displayName: 'Install Ansible'

  - script: |
      echo "${{ parameters.ansibleVars  }}" > vars.yml
    displayName: 'Create vars file'

  - task: Ansible@0
    displayName: 'Run playbook'
    inputs:
      ansibleInterface: 'agentMachine'
      playbookPathOnAgentMachine: './ansible/playbook.yml'
      inventoriesAgentMachine: 'file'
      inventoryFileOnAgentMachine: './ansible/inventory/hosts'
      args: -vv -e @vars.yaml
    failOnStdErr: false

Можете ли вы показать нам код, чтобы лучше проиллюстрировать проблему? Например, как вы делаете вид, что используете задачу Ansible?

Rui Jarimba 13.06.2024 13:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
82
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Согласно документации, вы можете использовать переменные из файла JSON или YAML:

ansible-playbook release.yml --extra-vars "@some_file.json"
ansible-playbook release.yml --extra-vars "@some_file.yaml"

В своем конвейере вы можете использовать ConvertToJson, чтобы преобразовать параметр в строку JSON, а затем сгенерировать файл JSON и использовать его в своей задаче Ansible@0.

Пример

parameters:
  - name: ansibleVars
    type: object
    default:
      version: 1.0.0
      other_varialbe: foo
  - name: varsFile
    type: string
    default: $(Agent.TempDirectory)/ansible-vars.json

trigger: none

pool:
  vmImage: 'ubuntu-latest'

steps:
  - script: |
      echo ${ANSIBLE_VARS} > ${ANSIBLE_VARS_FILE}
      cat ${ANSIBLE_VARS_FILE}
    displayName: Create json variables file
    env:
      ANSIBLE_VARS_FILE: ${{ parameters.varsFile }}
      ANSIBLE_VARS: ${{ convertToJson(parameters.ansibleVars) }}
  
  - task: Ansible@0
    displayName: 'Run playbook'
    inputs:
      ansibleInterface: 'agentMachine'
      playbookPathOnAgentMachine: './ansible/playbook.yml'
      inventoriesAgentMachine: 'file'
      inventoryFileOnAgentMachine: './ansible/inventory/hosts'
      args: -vv -e @${{ parameters.varsFile }}  # <-------------- use generated json file
    failOnStdErr: false

Обратите внимание, что я присваиваю строку json переменной среды задачи вместо того, чтобы использовать ее непосредственно в теле сценария — таким образом мне не нужно экранировать кавычки и другие специальные символы:

  - script: |
      # ...
    env:
      ANSIBLE_VARS: ${{ convertToJson(parameters.ansibleVars) }}

Вы можете воспользоваться примером ниже, чтобы передать словарь в шаблон YAML:

  1. Шаблон YAML
# templates/steps.yml

parameters:
- name: vars
  type: object
  default: []

steps:
- powershell: |
    Write-Host "var1 = $env:var1"
    Write-Host "var2 = $env:var2"
    Write-Host "var3 = $env:var3"
  displayName: 'Show all vars'
  env:
    ${{ parameters.vars }}

- ${{ each var in parameters.vars }}:
  - powershell: |
      Write-Host "Key = ${{ var.Key }}"
      Write-Host "Value = ${{ var.Value }}"
    displayName: 'Show var - ${{ var.Key }}'
  1. Основной YAML.
# azure-pipelines.yml

steps:
- template: templates/steps.yml
  parameters:
    vars:
      var1: valu1
      var2: valu2
      var3: valu3


Если вы хотите передать все пары ключ-значение в поле args задачи Ansible@0, вы можете установить шаблон, как показано ниже.

# templates/steps.yml

parameters:
- name: vars
  type: object
  default: []

steps:
- powershell: Write-Host "##vso[task.setvariable variable=argVar;]empty"
  displayName: 'Set argVar'

- ${{ each var in parameters.vars }}:
  - powershell: |
      Write-Host "Key = ${{ var.Key }}"
      Write-Host "Value = ${{ var.Value }}"
      if ("$(argVar)" -ne "empty" ) {
        Write-Host "##vso[task.setvariable variable=argVar;]$(argVar) ${{ var.Key }}=${{ var.Value }}"
      }
      else {
        Write-Host "##vso[task.setvariable variable=argVar;]${{ var.Key }}=${{ var.Value }}"
      }
    displayName: 'Show var - ${{ var.Key }}'

- powershell: Write-Host "$(argVar)"
  displayName: 'Show var argVar'

- task: Ansible@0
  displayName: 'Run playbook'
  inputs:
    playbookPathOnAgentMachine: path/to/playbook.yml
    inventoriesAgentMachine: file
    inventoryFileOnAgentMachine: path/to/hosts
    args: '$(argVar)'


Другие вопросы по теме