仅当目标不存在时,使用Ansible在远程系统上移动文件

时间:2015-02-12 16:45:17

标签: ansible

我正在尝试编写一个Ansible角色,用于移动远程系统上的许多文件。我找到了Stack Overflow post关于如何做到这一点,基本上说“只需使用带有'mv'的命令模块”。我有一个使用with_items语句定义的单个任务,其中dirs中的每个项目都是包含srcdest个键的字典:

- name: Move directories
  command: mv {{ item.src }} {{ item.dest }}
  with_items: dirs

这很好并且有效,但如果目标目录已经存在,我会遇到问题。我不想覆盖它,所以我想先尝试统计每个dest目录。我想用stat信息更新dirs变量,但据我所知,一旦定义了变量,就没有好的方法来设置或更新变量。因此,我使用stat获取每个目录的信息,然后使用register保存数据:

- name: Check if directories already exist
  stat: path={{ item.dest }}
  with_items: dirs
  register: dirs_stat

有没有办法将注册的统计信息与mv命令联系起来?如果它是一个目录,这将很容易。循环是使这个棘手的原因。有没有办法在不将每个目录的循环展开到两个任务的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

这不是最简单的解决方案,但是如果你想使用Ansible而不是"展开":

---
- hosts: all
  vars:
    dirs:
      - src: /home/ubuntu/src/test/src1
        dest: /home/ubuntu/src/test/dest1
      - src: /home/ubuntu/src/test/src2
        dest: /home/ubuntu/src/test/dest2
  tasks:
    - stat:
        path: "{{item.dest}}"
      with_items: dirs
      register: dirs_stat
    - debug:
        msg: "should not copy {{ item.0.src }}"
      with_together:
        - dirs
        - dirs_stat.results
      when: item.1.stat.exists

只需调整调试任务即可改为运行相应的command任务,when:改为when: not ...

答案 1 :(得分:0)

您可以在剧本中使用 stat 关键字来检查它是否存在,如果不存在则不移动。

---
- name: Demo Playbook
  hosts: all
  become: yes
  tasks:
  - name: check destination
    stat:
     path: /path/to/dest
    register: p
  - name:  copy file if not exists
    command: mv /path/to/src /path/to/src
    when: p.stat.exists == False