2016-06-19 111 views
0

我有一个能够将DNS条目中的更改应用到多个名称服务器的操作手册。ansible playbook通过字典迭代

有关域的信息存储在像这样的词典列表:

domains: [ 
    { 
    domain: "domain.me", 
    location: "default", 
    ip: "XX.XX.XX.XX", 
    <..> 
    }, 

我设法建立成功地生成区域文件的任务。但我还需要清理已删除域的旧文件。虽然我不确定在任务中如何迭代这样的列表。我设法建立这样的事情:

- name: Check for available configuration 
    shell: ls -1 /etc/bind/zones/{{ location }}/ 
    register: contents 

- name: Cleanup old files 
    file: path=/etc/bind/zones/{{ location }}/{{ item }} state=absent 
    with_items: "{{ contents.stdout_lines }}" 
    when: item not in domains 

虽然显然它只是删除所有文件,并从头开始生成它。 有没有办法迭代通过词典列表莫名其妙地没有建立一个单独的列表与重复信息在变量?

回答

0

this对你有帮助吗? 它基本上消除不在列表的一部分(你可以从你的配置产生)

# tidy_expected: [‘conf1.cfg’, conf2.cfg’] 
- find: paths={{tidy_path}} #/etc/myapp 
    register: existing 

- file: path={{item.path}} state=absent 
    when: item.path|basename not in tidy_expected 
    with_items: “{{existing.files|default([ ])}}” 
    register: removed 

- mail: body=“{{removed}}” 
+0

好吧,谢谢你的回答,尽管它几乎与我在问题中发布的代码完全相同。问题是我在字典中有一个列表。这是我堆叠的东西。我无法理解我如何迭代字典中的特定字段.. – rush

0

可以使用map过滤器,以减少你的字典的名单到字符串列表中的所有文件,根据在字典的单个属性上,在这种情况下为domain

when: item not in domains|map(attribute='domain')|list