Uma função ansible-sensu-plugin-install foi criada para instalar sensu-plugins usando este código :
- 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 }}"
Existem duas outras funções que requerem plugins sensu. A primeira função requer o plug-in mailer :
sensu_plugin_install:
- name: mailer
version: 1.0.0
e o segundo requer vários plugins :
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
As funções um e dois foram incluídas em um manual.
resultado atual
O mailer
definido na função um ou os plug-ins definidos na função dois serão instalados. Comentar uma das sensu_plugin_install
declarações instalará plug-ins relacionados à função um ou dois, por exemplo, apenas o plug-in do mailer será instalado:
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,
se o sensu_plugin_install
da segunda função foi comentado.
Resultado esperado
O resultado esperado é que todos os plugins sejam instalados, ou seja, seis neste caso ao invés de um, mailer
ou seja, cinco.
Discussão
Parece que as matrizes não serão mescladas, pois um ou cinco plug-ins serão instalados em vez de seis e um dos dois precisa ser comentado para forçar a instalação de um plug-in.
Uma opção para resolver esse problema é mesclar esses arrays, ou seja, sensu_plugin_install + sensu_plugin_install
. Por exemplo, no Puppet é possível mesclar arrays usando hiera_array
. Como isso poderia ser feito no Ansible?
Usar duas variáveis diferentes para resolver o problema não é uma opção, pois a funcionalidade de uma função é usada e não é preferível adicionar outra variável a essa função se outra função desejar instalar plug-ins sensu.
Em primeiro lugar, tive que definir duas variáveis diferentes em vez de usar a mesma, por exemplo
sensu_plugin_install
. Depois de dar ao segundo dict um nome diferente comosensu_plugin_install_other
, os dois arrays puderam se fundir:Experimente esta função da galáxia ansible https://galaxy.ansible.com/eugene0707/merge_custom_vars/
Eu fiz isso há algum tempo pelo mesmo motivo. Ele pode mesclar dicionários de vários arquivos vars e definir precedência personalizada de mesclagem.
Esta função pode funcionar no Ansible 2.0+