У меня есть ситуация, когда мне нужно передать имя ветки и имя хоста (соответствует экземпляру со свойствами соединения) в шаблон 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, как показано в моем исходном вызове). Что еще мне здесь не хватает?
Попробуйте либо действительный JSON
extraVars: '''
{
"BRANCH_NAME": "${env.GIT_BRANCH}",
"targeted_hosts": "${env.targeted_hosts}"
}'''
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
]