Назад | Перейти на главную страницу

Как выполнить слияние массива или хэша в Ansible?

An ansible-sensu-plugin-install роль была создана для установки sensu-плагинов с помощью этот код:

- name: be sure sensu-plugins-{{ item.name }} is installed
  command: sensu-install -p {{ item.name }}:{{ item.version }}
  when: "'sensu-plugins-{{ item.name }} ({{ item.version }})' not in installed_plugins.stdout"
  with_items: "{{ sensu_plugin_install }}" 

Есть еще две роли, для которых требуются сенсорные плагины. Первая роль требует плагин почтовой программы:

sensu_plugin_install:
  - name: mailer
    version: 1.0.0

и второй требует несколько плагинов:

sensu_plugin_install:
  - name: cpu-checks
    version: 1.0.0
  - name: disk-checks
    version: 2.0.1
  - name: http
    version: 1.0.0
  - name: memory-checks
    version: 1.0.2
  - name: ntp
    version: 1.0.0

Первая и вторая роли включены в одну книгу.

Текущий результат

Либо mailer определенные в роли 1 или плагины, определенные в роли 2, будут установлены. Комментируя один из sensu_plugin_install объявления будут устанавливать плагины, относящиеся к первой или второй роли, например будет установлен только плагин почтовой программы:

TASK [030.sensu-plugin-install : be sure sensu-plugins-{{ item.name }} is
    installed] ***
    changed: [host.example.com] => (item={u'version': u'1.0.0', u'name':
    u'mailer'}) => {"changed": true, 

если sensu_plugin_install закомментирована вторая роль.

Ожидаемый результат

Ожидаемый результат - будут установлены все плагины, то есть в данном случае шесть вместо одного, т.е. mailer или пять.

Обсуждение

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

Один из вариантов решения этой проблемы - объединить эти массивы, т.е. sensu_plugin_install + sensu_plugin_install. Например, в Puppet можно объединять массивы, используя hiera_array. Как это можно было сделать в Ansible?

С помощью Две разные переменные для решения проблемы не вариант, поскольку используются функции одной роли, и не рекомендуется добавлять другую переменную к этой роли, если другая роль хочет установить плагины sensu.

Попробуйте эту роль из ansible galaxy https://galaxy.ansible.com/eugene0707/merge_custom_vars/

Я сделал это некоторое время назад по той же причине. Он может объединять словари из нескольких файлов vars и устанавливать собственный приоритет слияния.

Эта роль может работать в Ansible 2.0+.