如何在远程系统上使用Ansible模块移动/重命名文件/目录?我不想使用命令/shell任务,也不想将文件从本地系统复制到远程系统。


当前回答

这是我让它为我工作的方式:

  Tasks:
  - name: checking if the file 1 exists
     stat:      
      path: /path/to/foo abc.xts
     register: stat_result

  - name: moving file 1
    command: mv /path/to/foo abc.xts /tmp
    when: stat_result.stat.exists == True

上面的剧本,会检查是否文件abc。在将文件移动到TMP文件夹之前,XTS已经存在。

其他回答

Bruce并没有试图统计目的地以检查是否移动已经在那里的文件;在尝试mv之前,他正在确保要移动的文件实际存在。

如果你像汤姆一样,只在文件不存在的情况下才移动,我认为我们仍然应该将布鲁斯的支票整合到混合中:

- name: stat foo
  stat: path=/path/to/foo
  register: foo_stat

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar
  when: foo_stat.stat.exists

文件模块不复制远程系统上的文件。src参数仅供文件模块在创建到文件的符号链接时使用。

如果你想完全在远程系统上移动/重命名一个文件,那么最好的方法是使用命令模块调用适当的命令:

- name: Move foo to bar
  command: mv /path/to/foo /path/to/bar

如果你想更花哨一点,你可以先使用stat模块来检查foo是否存在:

- name: stat foo
  stat: path=/path/to/foo
  register: foo_stat

- name: Move foo to bar
  command: mv /path/to/foo /path/to/bar
  when: foo_stat.stat.exists

在Windows上: —name:将旧文件夹移至备份目录 win_command: "cmd.exe /c move /Y {{sourcePath}}{{目的地文件夹路径}}"

要重命名,请使用rename或ren命令

另一个对我来说很有效的选项是使用同步模块。然后使用file模块删除原始目录。

下面是文档中的一个例子:

- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
    archive: yes
  delegate_to: "{{ inventory_hostname }}"

你可以通过

使用Ad Hoc命令

ansible all -m command -a" mv /path/to/foo /path/to/bar"

或者你,如果你想用剧本的话

- name: Move File foo to destination bar
  command: mv /path/to/foo /path/to/bar