Ansible:如何迭代`stat`提供的字典中的路径?

时间:2015-08-08 08:07:04

标签: python ansible

我正在尝试使用ansible来确定哪些路径存在,然后只执行一个存在的路径(它不仅仅是下面示例中的copy,而且还可以进一步编辑这条线)。 这是我想到的 - 这是第二次迭代,我在第二个任务中使用with_item无法得到任何东西。

- name: disable plasma - identify files to act on
  stat:
    path: "{{ item }}"
  register:
    plasma_conf
  with_items:
    - "/usr/share/autostart/plasma-desktop.desktop"
    - "/usr/share/autostart/plasma-netbook.desktop"
    - "/etc/xdg/autostart/plasmashell.desktop"

- name: disable plasma - copy config locally
  copy:
    src: "{{ item.item }}"
    dest: "/home/{{ main_user }}/.config/autostart/{{ item.item | basename }}"
  with_dict:
    plasma_conf.results
  when:
    item.stat.exists == true

复制任务因fatal: [localhost] => with_dict expects a dict而失败。如何根据dict提供的stat结构进行此工作?

2 个答案:

答案 0 :(得分:1)

感谢所有评论 - debugwith_items之前曾在多次迭代中使用过,但未能产生我想要的输出。我回去了,使用了经过尝试和真实的“废弃一切,从头开始”的方法,使用以下简约,自包含的例子:

 ---
 - hosts: 
    localhost
  tasks:
    - name: 
        create testing infrastructure a)
      file:
        path: "/tmp/{{ item }}"
        state: touch
        mode: 744
      with_items:
        - testFileA
        - testFileB
    - name: 
        create testing infrastructure b)
      file:
        path: "/tmp/testDir"
        state: directory
        mode: 744
    - name:
        identify files to act on
      stat:
        path: "{{ item }}"
      register:
        files2move
      with_items:
        - "/tmp/testFileA"
        - "/tmp/testFileB"
        - "/tmp/testFileC"
    - name:
        copy available files
      copy:
        src: "{{ item.item }}"
        dest: "/tmp/testDir/{{ item.item | basename }}"
        mode: 640
      with_items:
        files2move.results
      when:
        item.stat.exists == true

我现在真的不知道有什么不同,但这很有用 - 无论是在极简主义版本还是移植到我的代码中......

答案 1 :(得分:0)

plasma_conf.results是统计词典列表。使用with_dict替换第二项任务中的with_items。请参阅http://docs.ansible.com/ansible/playbooks_loops.html#using-register-with-a-loop,当然还有udondan建议的调试输出。