Ansible
mv
命令沒有重命名,而是從 ansible 移到現有目錄
我正在執行 ansible 任務(在角色內):
- name: Rename dir become: yes shell: mv /data/files/1.6.5 /data/files/1.7.0
預期的效果是
1.6.5
重命名為1.7.0
現在,在目標主機上,在一個實例中我已經
1.7.0
存在:~$ sudo ls -l /data/files/ total 1312 drwxr-x--- 2 ubuntu admin 643450 May 22 08:45 v1.6.5 drwxr-x--- 2 ubuntu admin 696320 May 25 10:19 v1.7.0
所以執行上面的命令,我得到了將 1.6.5 移動到 1.7.0而不是重命名它的尷尬結果。
這是為什麼?這是不直覺的。
1.6.5
不是空的,也不是1.7.0
。只是確保我沒有遺漏一些明顯的東西。或者這絕對不可能?我是從其他原因得到的嗎?我只是看到了這樣一個事實,即我現在擁有
1.6.5
內部1.7.0
並進行取證以了解為什麼會這樣。
該
mv
命令不會檢查目標文件夾是否存在。如果它不存在,它將重命名源文件夾。否則,它只會假設假裝的結果是將源移動到目的地。從
mv
手冊頁:Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
因此,如果您不希望這種情況發生,您可以在 Ansible playbook 上添加檢查以驗證目標文件夾是否已存在,然後僅在不存在時移動該文件夾:
- name: Check if the folder exists stat: path: /data/files/1.7.0 register: dest_folder become: yes - name: Rename dir become: yes shell: mv /data/files/1.6.5 /data/files/1.7.0 when: not dest_folder.stat.exists
這樣,您將避免意外移動到預先存在的文件夾中。