Сбой развертывания Jenkins Ansible Tower при передаче нескольких настраиваемых аргументов в параметре «extraVars»

У меня есть ситуация, когда мне нужно передать имя ветки и имя хоста (соответствует экземпляру со свойствами соединения) в шаблон Ansible, который запускается как часть этапа развертывания кода. Однако я получаю следующее, если пытаюсь указать несколько аргументов в extraVars:

ERROR: Unable to request job template invocation Extra vars are bad: ["Cannot parse as JSON (error: Expecting value: line 1 column 1 (char 0)) or YAML (error: while parsing a block mapping\n in \"<unicode string>\", line 2, column 23:\n
  BRANCH_NAME: 'A-BranchName',\n               ^\nexpected <block end>, but found ','\n in \"<unicode string>\", line 2, column 56: \n      .... RANCH_NAME: 'A-Branch',\n              ^)."]

Я использую этот плагин для вызова Jenkins Ansible Tower Plugin API

Вот соответствующий вызов башни

    stage("Ansible Deployment"){
  steps{
      script{
      ansibleTower(
        towerServer: 'Prod Tower',
        towerCredentialsId: '',
        templateType: 'job',
        jobTemplate: 'Simple Test',
        towerLogLevel: 'full',
        inventory: 'Demo Inventory',
        removeColor: false,
        verbose: true,
        extraVars: """---
              BRANCH_NAME: '${env.GIT_BRANCH}',
              targeted_hosts: '${env.targeted_hosts}',
                  """
    )
  }
 }
}

Я много искал решение в Интернете (включая, помимо прочего, здесь: Как передать дополнительные переменные в Ansible playbook, но почти каждый пример, который я видел (на SO и в других местах), имеет дело только с одним параметром (и мне нужно экранировать значения, поскольку они устанавливаются на основе самой ветки). Я пробовал следующее (на основе формата JSON, используемого здесь 16.13. Дополнительные переменные):

extraVars: {
              BRANCH_NAME:'${env.GIT_BRANCH}',
              targeted_hosts:'${env.targeted_hosts}',
           }
    )

Тогда Дженкинс выдаст ошибку компилятора groovy из-за запятой. Последующее удаление запятой приведет к ошибке компилятора groovy из-за двоеточия. Дальнейшее удаление этого и добавление его как части строки имени аргумента вызывает исключение ClassCastException. То же самое происходит, когда не используется формат JSON.

Если я укажу только один аргумент, он сработает в этот момент (в формате, отличном от JSON, как показано в моем исходном вызове). Что еще мне здесь не хватает?


1
53
2

Ответы:

Решено

Попробуйте либо действительный JSON

  extraVars: '''
{
  "BRANCH_NAME": "${env.GIT_BRANCH}",
  "targeted_hosts": "${env.targeted_hosts}"
}'''

или действительный YAML

  extraVars: '''---
BRANCH_NAME: ${env.GIT_BRANCH}
targeted_hosts: ${env.targeted_hosts}'''

Проверьте содержимое в тройных кавычках.


Хотя плагин Ansible Playbook принимает входные данные типа Map (что было бы предпочтительнее), этот плагин Ansible Tower требует строк в формате YAML или JSON. Ваша конкретная проблема заключается в том, что форматирование YAML для строки недопустимо. Таким образом, самым простым путем вперед будет использование метода шага writeYamlиз плагина Pipeline Utility Steps для преобразования карты в строку в формате YAML, как и ожидалось:

extraVars: writeYaml(returnText: true, data: [
  'BRANCH_NAME': env.GIT_BRANCH,
  'targeted_hosts': env.targeted_hosts
]