Подтвердить что ты не робот

Пропустить массив в --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 не объявляет синтаксическую ошибку в моем вызове. Любая помощь была оценена.

4b9b3361

Ответ 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.

Ответ 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 }}"

Я решил убежать от побега, и это похоже на работу.