已创建 ansible-sensu-plugin-install 角色,以便使用以下代码安装sensu - plugins:
- 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-plugins 的角色。第一个角色需要邮件插件:
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
定义的插件或角色二中定义的插件。注释掉其中一个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 插件,则不建议向该角色添加另一个变量。
首先,我必须定义两个不同的变量,而不是使用同一个变量,例如
sensu_plugin_install
. 在给第二个字典起一个不同的名字后sensu_plugin_install_other
,这两个数组能够合并:从 ansible galaxy 尝试这个角色https://galaxy.ansible.com/eugene0707/merge_custom_vars/
出于同样的原因,我前段时间这样做了。它可以从多个 vars 文件中深度合并字典并设置自定义合并优先级。
这个角色可以在 Ansible 2.0+ 下工作