我正在尝试编写一个Ansible角色,用于移动远程系统上的许多文件。我找到了Stack Overflow post关于如何做到这一点,基本上说“只需使用带有'mv'的命令模块”。我有一个使用with_items
语句定义的单个任务,其中dirs
中的每个项目都是包含src
和dest
个键的字典:
- 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
命令联系起来?如果它是一个目录,这将很容易。循环是使这个棘手的原因。有没有办法在不将每个目录的循环展开到两个任务的情况下执行此操作?
答案 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