Ansible

mv 命令沒有重命名,而是從 ansible 移到現有目錄

  • May 25, 2021

我正在執行 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

這樣,您將避免意外移動到預先存在的文件夾中。

引用自:https://serverfault.com/questions/1064669