首页 文章

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

提问于
浏览
3

我正在尝试编写一个Ansible角色来移动远程系统上的许多文件 . 我发现Stack Overflow post关于如何做到这一点,基本上是"just use the command module with 'mv'" . 我有一个使用 with_items 语句定义的单个任务,其中 dirs 中的每个项目都是一个包含 srcdest 键的字典:

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

这很好,它可以工作,但如果目标目录已经存在,我会遇到问题 . 我不想覆盖它,所以我想先尝试统计每个 dest 目录 . 我想用stat信息更新 dirs 变量,但据我所知,还没有定义't a good way to set or update variables once they' . 所以我使用 stat 来获取每个目录的信息,然后使用 register 保存数据:

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

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

1 回答

  • 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 ... .

相关问题