(Относится к обратным вызовам или перехватам, а также к серии заданий многократного использования в роли Ansible )
Есть ли лучший способ добавить в список или добавить ключ к словарю в Ansible, чем (ab) с помощью выражения шаблона jina2?
Я знаю, что вы можете сделать что-то вроде:
- name: this is a hack
shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"
но неужели нет мета-задачи или помощника для этого?
Он выглядит хрупким, кажется недокументированным и опирается на множество предположений о том, как переменные работают в Ansible.
Мой вариант использования - это несколько ролей (расширения сервера базы данных), каждая из которых должна предоставить некоторую конфигурацию базовой роли (серверу базы данных). Это не так просто, как добавить строку в файл конфигурации сервера БД; каждое изменение применяется к одной и той же строке , например, к расширениям, bdr
и pg_stat_statements
оба должны появляться в целевой строке:
shared_preload_libaries = 'bdr, pg_stat_statements'
Можно ли сделать это в Ansible, просто обработав файл конфигурации несколько раз (один раз для каждого расширения) с помощью регулярного выражения, которое извлекает текущее значение, анализирует его и затем переписывает? Если так, как вы делаете это идемпотентным через несколько прогонов?
Что, если конфигурация сложнее, чем эта, для анализа, и она не так проста, как добавление другого значения через запятую? Подумайте, файлы конфигурации XML.
Ответы:
Вы можете объединить два списка в переменной с
+
. Скажем, у вас естьgroup_vars
файл с этим содержанием:И это используется в шаблоне,
pgsql.conf.j2
как:Затем вы можете добавить расширения к тестовым серверам баз данных следующим образом:
Когда роль запускается на любом из тестирующих серверов, будут добавлены дополнительные расширения.
Я не уверен, что это работает и для словарей, а также будьте осторожны с пробелами и оставляя в конце строки висячую запятую.
источник
group_vars
, роли не могут позаботиться о деталях настройки расширений сами. Это добавление переменных из ролей, которые я особенно ищу, поэтому одна роль может дополнять переменную, представленную другой ролью.with_items
предложения.Начиная с Ansible v2.x вы можете сделать это:
все вышеперечисленное описано в: http://docs.ansible.com/ansible/playbooks_filters.html
источник
u'(': u\"'\"}"
2.4.x
(ИСПРАВЛЕНО)set_fact: my_dict_var: '{{my_dict_var|default({})|combine({item[0]: item[1]})}}'
. Неопределенная ошибка возникает, когда используется некоторая фильтрация или результаты не зарегистрированы.вам нужно разделить цикл на 2
и addhost.yml
источник
Не уверен, когда они добавили это, но, по крайней мере, для словарей / хэшей (НЕ списки / массивы), вы можете установить переменную hash_behaviour , вот так:
hash_behaviour = merge
в вашемansible.cfg
.Мне понадобилось несколько часов, чтобы случайно наткнуться на эту настройку: S
источник
Почти все ответы здесь требуют изменений в задачах, но мне нужно было динамически объединять словари в определении переменных, а не во время выполнения.
Например, я хочу определить некоторые общие переменные в,
all
group_vars
а затем я хочу расширить их в некоторых другихgroup
илиhost_vars
. Очень полезно при работе на роли.Если вы попытаетесь использовать фильтры
combine
или,union
перезаписывающие исходную переменную в файлах var, вы будете заканчивать бесконечный цикл во время создания шаблонов, поэтому я создал этот обходной путь (это не решение).Вы можете определить несколько переменных на основе некоторого шаблона имени, а затем автоматически загрузить их в роли.
group_vars/all.yml
group_vars/group1.yml
фрагмент кода роли
do_some_stuff.yml
Это всего лишь фрагмент, но вы должны понять, как это работает. примечание: поиск ('varnames', '') доступен начиная с версии 2.8
Я думаю, было бы также возможно объединить все переменные
dictionary_of_bla.*
в один словарь во время выполнения, используя тот же поиск.Преимущество этого подхода состоит в том, что вам не нужно устанавливать точные списки имен переменных, а только шаблон и пользователь могут установить его динамически.
источник
Ansible
это система автоматизации, и, что касается управления файлами конфигурации, она не сильно отличается отapt
. Причина, по которой все больше и больше программного обеспечения предлагает возможность считывать фрагменты конфигурации изconf.d
каталога, заключается в том, что такие системы автоматизации могут иметь различные пакеты / роли для добавления конфигурации в программное обеспечение. Я считаю, что философия заключается не в том,Ansible
чтобы делать то, что вы имеете в виду, а в том, чтобы использоватьconf.d
хитрость. Если конфигурируемое программное обеспечение не предлагает эту функцию, у вас могут быть проблемы.Поскольку вы упоминаете файлы конфигурации XML, я пользуюсь возможностью, чтобы немного поплакать. Есть причина для традиции Unix использовать простые текстовые файлы конфигурации. Двоичные файлы конфигурации плохо подходят для автоматизации системы, поэтому любой вид двоичного формата доставит вам проблемы и, вероятно, потребует от вас создания программы для обработки конфигурации. (Если кто-то думает, что XML - это простой текстовый формат, он должен проверить свои мозги.)
Теперь по вашей конкретной
PostgreSQL
проблеме.PostgreSQL
поддерживаетconf.d
трюк. Сначала я бы проверил,shared_preload_libraries
можно ли указывать несколько раз. Я не нашел в документации ни одного намека на то, что он может, но все равно попробую. Если это не может быть указано несколько раз, я объясню свою проблемуPostgreSQL
парням, если у них есть идеи; этоPostgreSQL
проблема, а неAnsible
проблема. Если решения не существует и я действительно не могу объединить разные роли в одну, я бы внедрил систему для компиляции конфигурации на управляемом хосте. В этом случае я бы, вероятно, создал скрипт,/usr/local/sbin/update_postgresql_config
который компилировался бы/etc/postgresql/postgresql.conf.jinja
в/etc/postgresql/9.x/main/postgresql.conf
. Сценарий будет читать общие библиотеки предварительной загрузки/etc/postgresql/shared_preload_libraries.txt
, по одной библиотеке на строку, и предоставлять их jinja.Это не редкость для систем автоматизации. Примером является
exim4
пакет Debian .источник
conf.d
механизм включения и, к счастью, использует текстовые файлы. Тем не менее, есть некоторые параметры конфигурации, где несколько расширений могут иметь мнения по этому поводу - например, «увеличить max_wal_senders на 10 от того, что было раньше».