Пропустить массив в --extra-vars - Ansible
Как передать массив yaml в --extra-vars
в Ansible playbook. Несвязанная документация не объявляет ее синтаксис, и я не могу найти ее на любом интернет-ресурсе.
Я имею в виду, если у меня есть тетрадь:
---
- hosts: {{hostName}}
- remote_user: admin
...
Затем я должен назвать свою игру как
ansible-playbook DeployWar.yml --extra-vars="hostName=tomcat-webApp"
Но я хочу запустить эту книгу на двух серверах, скажем tomcat-webApp
и tomcat-all
, и я хочу управлять ею со стороны, то есть с помощью --extra-vars
. Я попытался сделать это:
ansible-playbook DeployWar.yml --extra-vars="hostName=[tomcat-webApp, tomcat-all]"
ansible-playbook DeployWar.yml --extra-vars="hostName={tomcat-webApp, tomcat-all}"
ansible-playbook DeployWar.yml --extra-vars="[{hostName: tomcat-webApp}, {hostName: tomcat-all}]"
Но во всех случаях playbook не объявляет синтаксическую ошибку в моем вызове.
Любая помощь была оценена.
Ответы
Ответ 1
Чтобы ответить на ваш первый вопрос "Как передать массив yaml в -extra-vars в Ansible playbook".
вы можете передать форматированную строку json для экстра-варов.
Вот пример игры:
- hosts: all
gather_facts: no
tasks:
- debug: var=test_list
И как пройти в test_list к незанятому-playbook:
ansible-playbook -c local -i localhost, test.yml --extra-vars='{"test_list": [1,2,3]}'
Хотя вы можете использовать переменную для хостов, я рекомендую проверить механизм Ansible для управления хостом, который inventory в сочетании с опцией --limit
.
Ответ 2
Начиная с Ansible 1.3, дополнительные переменные могут быть отформатированы как YAML, либо в командной строке, либо в файле. См. Документацию Ansible под названием "Передача переменных в командной строке".
по ссылке: --extra-vars "@some_file.json"
Ответ 3
В дополнение к ответу от jarv, вот моя спасительная записка:
Если кто-то хочет передать массив целых чисел, это работает:
--extra-vars '{"my_params":[40,50,10,20,30]}'
Примечание: между числами в передаваемом вами массиве не должно быть пробела ! Удаление места решило мою проблему!
Ответ 4
Возможно, не пытайтесь передавать сложные типы через командную строку и обрабатывать их создание в playbook из файлов или строк json.
Итак, подход @NelonG работает, но как он будет работать во всех контекстах выполнения? Мои пьесы, как правило, выполняются заданиями Jenkins через ansiblePlaybook и через упаковщик. Выполнение следующих действий во всех этих случаях (даже если командная строка выглядит правильно) не работает и может привести к выходу из кошмара.
ansible -i localhost, all -m debug -a "var=test_list" \
--extra-vars='{"test_list": [1,2,3]}'
Как насчет передачи в виде строки с последующим разделением через set_fact (примечание: это работает, только если у вас есть элементы без проблемных символов. У меня есть URL-адреса, поэтому они достаточно безопасны
ansible .... -e "test_list_csv=1,2,3,http://foo.bar/file.txt"
В пьесе
name: generate list from string
set_fact:
test_list: "{{ test_list_csv.split(',') | list }}"
Я решил убежать от побега, и это похоже на работу.