如何在远程系统上使用Ansible任务移动/重命名文件

如何在远程系统上使用Ansible任务移动/重命名文件,ansible,Ansible,如何在远程系统上使用Ansible模块移动/重命名文件/目录?我不想使用命令/shell任务,也不想将文件从本地系统复制到远程系统。文件模块不复制远程系统上的文件。src参数仅由文件模块在创建指向文件的符号链接时使用 如果要完全在远程系统上移动/重命名文件,最好使用命令模块调用相应的命令: - name: Move foo to bar command: mv /path/to/foo /path/to/bar 如果您想变得更有趣,那么可以首先使用stat模块检查foo是否确实存在: -

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

文件模块不复制远程系统上的文件。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

我发现命令模块中的creates选项很有用。这个怎么样:

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar

我曾经像Bruce p建议的那样使用stat做两个任务的方法。现在,我将此作为一项任务与creates一起执行。我认为这要清楚得多。

Bruce没有试图统计目的地,以检查是否要移动文件(如果文件已经存在);在尝试mv之前,他确保要移动的文件确实存在

如果您和Tom一样,只想在文件不存在的情况下移动,我认为我们还是应该将Bruce的支票整合到组合中:

- 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

从2.0版开始,在中可以使用
远程\u src
参数

如果
True
它将转到src的远程/目标计算机

- name: Copy files from foo to bar
  copy: remote_src=True src=/path/to/foo dest=/path/to/bar
如果要移动文件,需要使用文件模块删除旧文件

- name: Remove old files foo
  file: path=/path/to/foo state=absent

从2.8版开始
remote\u src
支持递归复制。

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

  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

在将文件移动到tmp文件夹之前,上面的剧本将检查文件abc.xts是否存在。

另一种方法是使用
文件
状态:硬

这是我开始工作的一个例子:

- name: Link source file to another destination
  file:
    src: /path/to/source/file
    path: /target/path/of/file
    state: hard
虽然只在本地主机(OSX)上测试,但也应该在Linux上工作。我看不出有没有窗户

请注意,需要绝对路径。否则它不会让我创建链接。此外,您不能跨文件系统,因此使用任何装载的介质都可能失败

如果随后删除源文件,则硬链接与移动非常相似:

- name: Remove old file
  file:
    path: /path/to/source/file
    state: absent
另一个好处是,当你在戏中时,变化会持续下去。因此,如果有人更改了源文件,任何更改都会反映在目标文件中


您可以通过
ls-l
验证指向文件的链接数。硬链接的数量显示在模式旁边(例如,当一个文件有两个链接时,rwxr-xr-x 2)。

这似乎有些过分,但如果您想避免使用命令模块(我这样做,因为它使用命令不是幂等的),可以使用复制和非归档的组合

  • 使用tar归档您需要的文件。如果你提前考虑,这实际上是有道理的。您可能需要给定目录中的一系列文件。创建包含所有文件的目录,并将它们归档到tar中
  • 使用非归档模块。当您这样做时,连同destination:和remote_src:关键字一起,您可以将所有文件复制到一个临时文件夹中,然后将其解压缩到您想要的位置

  • 另一个对我很有效的选择是使用。然后使用文件模块删除原始目录

    以下是文档中的一个示例:

    - synchronize:
        src: /first/absolute/path
        dest: /second/absolute/path
        archive: yes
      delegate_to: "{{ inventory_hostname }}"
    
    你可以通过--

    使用特别命令

    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
    
    我知道这是一个有多年历史的话题,但我感到沮丧,为自己建立了一个角色,为任意的文件列表做这件事。根据需要扩展:

    main.yml

    - name: created destination directory
      file:
        path: /path/to/directory
        state: directory
        mode: '0750'
    - include_tasks: move.yml
      loop:
        - file1
        - file2
        - file3
    
    move.yml

    - name: stat the file
      stat:
        path: {{ item }}
      register: my_file
    
    - name: hard link the file into directory
      file:
        src: /original/path/to/{{ item }}
        dest: /path/to/directory/{{ item }}
        state: hard
      when: my_file.stat.exists
    
    - name: Delete the original file
      file:
        path: /original/path/to/{{ item }}
        state: absent
      when: my_file.stat.exists
    
    请注意,硬链接比在此处复制更可取,因为它固有地保留所有权和权限(除了不为文件的第二个副本占用更多磁盘空间之外)。

    在Windows上:
    
    -名称:将旧文件夹移动到备份
    win_命令:“cmd.exe/c move/Y{{sourcePath}}{{destinationFolderPath}}”

    要重命名,请改用renameren命令

    - name: Move the src file to dest
      command: mv /path/to/src /path/to/dest
      args:
        removes: /path/to/src
        creates: /path/to/dest
    
    只有当
    /path/to/src
    存在且
    /path/to/dest
    不存在时,才会运行
    mv
    命令,因此它会在每个主机上运行一次,移动文件,然后不再运行


    当我需要在几百台主机上移动一个文件或目录时,我使用这种方法,其中许多主机可能在任何给定时间关闭电源。它是幂等的,可以安全地放在剧本中。

    不使用命令模块,关于您唯一的选择是编写您自己的自定义模块。标记为正确答案,因为这是复制远程文件的当前方式。关于三思而后行:是否有任何理由不使用
    命令
    模块(文档化)的
    删除
    选项?似乎该选项将首先进行Ansible检查。Ansible跟踪更改以通知处理程序,这使得此解决方案不太理想。如果使用
    删除:/path/to/foo
    创建:/path/to/bar
    ,则不必手动检查文件是否存在@Fonant已经在另一个答案中提到了这一点,但由于这是公认的答案,我想再次指出。为什么不想使用command/shell?只是想知道是否有办法不使用所提到的任务。看起来现在没有其他方法了。为什么要专门移动它而不是复制它?这似乎是一次性操作,而不是确保步骤系统类型状态的幂等元。我有一个RPM包中包含的示例配置文件,我想移动此示例配置文件。目前我正在使用符号链接引用该文件。使用get_url对我来说是没有选择的,因为系统无法访问internet。或者更好的是:
    命令:mv/path/to/foo/path/to/bar creates=/path/to/bar removes=/path/to/foo
    Sma