ansible扩展var列表而不是覆盖

时间:2016-04-15 08:18:44

标签: ansible jinja2

我有一个角色,用于定义default/main.yml

中的默认属性列表
hdfs_namenode_properties:
  - { name: "dfs.permissions.superusergroup", value: "hadoop" }
  - { name: "dfs.namenode.name.dir", value: "/media/persistent0" }

但是当我在hdfs_namenode_properties中定义自己的site.yml时,默认值会被覆盖。

- name: set up cluster master
  hosts: masters
  vars:
    hdfs_namenode: "True"
    hdfs_namenode_properties:
      - { name: 'dfs.permissions.enabled', value: 'false' }
  roles:
    - azavea.hdfs

迭代属性列表的模板是

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
{% for property in hdfs_namenode_properties -%}
  <property>
    <name>{{ property.name }}</name>
    <value>{{ property.value }}</value>
  </property>
{% endfor -%}
</configuration>

有没有办法合并两个列表?

或者换句话说,我如何访问默认值,以便我可以执行类似

的操作
    hdfs_namenode_properties:
      "{{ <<default_namenode_properties>> 
          + { name: 'dfs.permissions.enabled', value: 'false' } 
      }}"

1 个答案:

答案 0 :(得分:1)

var override是默认的ansible行为。您可以通过更改ansible.cfg文件中的hash_behavior=merge来更改此行为。

来源:Ansible docs

你可以这样做的另一种方法是使用default jinja2过滤器,所以你不会在role/yourrole/defaults中定义默认值,而是通过做类似的事情直接在模板中定义默认值(模板文件只是一个例子) ,我不确定如何构造hdfs namenode conf:

# file: yourrole/templates/template.j2
[hdfs_namenode]
name: {{ hdfs_namenode_properties.name | default("dfs.permissions.superusergroup") }}

这种方式虽然你总是要指定hdfs_namenode_properties,即使是空字典(hdfs_namenode_properties: {}