Как указать значение списка как переменную в файле инвентаризации ansible?

Мне нужно что-то вроде (ansible inventory file):

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL"

однако ansible не распознает "локали" как список.

5 ответов


вы можете передать список или объект следующим образом:

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'

со сложными переменными лучше определить их в файле host_vars, а не в файле инвентаризации, поскольку файлы host_vars поддерживают синтаксис YAML.

попробуйте создать host_vars/127.0.0.1 файл со следующим содержимым:

timezone: Europe/Amsterdam
locales:
    - en_US
    - nl_NL

вы можете попробовать split

#inventory file
[example]
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL"

#role file
---
- debug: msg="{{ item }}"
  with_items: locales.split(',')

ответ Райлера хорош в этом конкретном случае, но я столкнулся с проблемами, используя другие варианты с модулем шаблона.

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'

является его оригинальным примером и отлично работает.

следующие варианты работают с шаблоном. В основном, если это строка, вы должны помнить об использовании внутренних двойных кавычек или вся структура анализируется как одна строка. Если это только числа или " True "или" False "(не" yes"), тогда вы в порядке. В этой вариации я не смог этого сделать. работайте с шаблоном, если у него есть внешние кавычки.

Я не сделал исчерпывающую проверку того, какие внутренние случаи использования они делают и не нарушают, кроме модуля шаблона.

Я использую Ansible 2.2.1.

[example:vars]
# these work
myvar1=["foo", "bar"]
myvar2=[1,2]
myvar3=[True,False]

# These fail, they get interpreted as a single string.
myvar4=[yes, no]
myvar5=[foo,bar]
myvar6='["foo", "bar"]'

вы можете настроить фильтр, чтобы разделить строку на список

GitHub ansible example показано, как создать пользовательский фильтр.