Ansible 複製模組失敗:“您可能已經能夠進行身份驗證並且沒有目標目錄的權限……”
對我的 Ubuntu 18.04 VM 使用這個 Ansible 任務,任務失敗並顯示如下消息
“身份驗證或權限失敗。在某些情況下,您可能已經能夠進行身份驗證並且沒有目標目錄的權限。請考慮將 ansible.cfg 中的遠端 tmp 路徑更改為以 "/tmp" 為根的路徑。失敗命令是:
( umask 77 && mkdir -p \"
echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529057459.23-56386111798122\" &&
$$ … $$
為什麼?
對於 Debian 9 VM,相同的任務可以成功執行。過去,我成功地使用 Ansible 控制了一個 Ubuntu 16.04 VM。
**編輯:**如果我以三倍詳細度(選項)執行 Ansible
-vvv
,則會有更多輸出,並且我可以找到更具體的錯誤消息:mkdir:無法創建目錄 \xe2\x80\x98/home/alan-sysop/.ansible\xe2\x80\x99:權限被拒絕。
Ansible 命令和輸出(
-v
用於詳細級別 1)$ ansible-playbook -b -K -v playbooks/all-bootstrap.yml -l ubuntu1804-vm -t copy-test Using /home/alan-sysop/ansible/ansible.cfg as config file SUDO password: PLAY [all] ********************************************************************* TASK [ansible-target : Basic test of copy module] ****************************** fatal: [ubuntu1804-vm]: UNREACHABLE! => {"changed": false, "msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\". Failed command was: ( umask 77 && mkdir -p \"` echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529057459.23-56386111798122 `\" && echo ansible-tmp-1529057459.23-56386111798122=\"` echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529057459.23-56386111798122 `\" ), exited with result 1", "unreachable": true} PLAY RECAP ********************************************************************* ubuntu1804-vm : ok=0 changed=0 unreachable=1 failed=0
Ansible 命令和輸出(
-vvv
用於詳細級別 3)$ ansible-playbook -b -K -vvv playbooks/all-bootstrap.yml -l ubuntu1804-vm -t copy-test ansible-playbook 2.5.2 config file = /home/alan-sysop/ansible/ansible.cfg configured module search path = [u'/home/alan-sysop/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible-playbook python version = 2.7.15 (default, May 16 2018, 17:50:09) [GCC 8.1.1 20180502 (Red Hat 8.1.1-1)] Using /home/alan-sysop/ansible/ansible.cfg as config file SUDO password: Parsed /home/alan-sysop/ansible/inventory inventory source with ini plugin statically imported: /home/alan-sysop/ansible/roles/ansible-target/tasks/main-tasks.yml statically imported: /home/alan-sysop/ansible/roles/ansible-target/tasks/raw.yml statically imported: /home/alan-sysop/ansible/roles/ansible-target/tasks/nonraw.yml PLAYBOOK: all-bootstrap.yml ************************************************************************************************************************** 1 plays in playbooks/all-bootstrap.yml PLAY [all] ******************************************************************************************************************************************* META: ran handlers TASK [ansible-target : Basic test of copy module] **************************************************************************************************** task path: /home/alan-sysop/ansible/roles/ansible-target/tasks/nonraw.yml:78 <ubuntu1804-vm.local> ESTABLISH SSH CONNECTION FOR USER: None <ubuntu1804-vm.local> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/home/alan-sysop/.ansible/cp/2b9a0eeef8 ubuntu1804-vm.local '/bin/sh -c '"'"'echo ~ && sleep 0'"'"'' <ubuntu1804-vm.local> (0, '/home/alan-sysop\n', '') <ubuntu1804-vm.local> ESTABLISH SSH CONNECTION FOR USER: None <ubuntu1804-vm.local> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/home/alan-sysop/.ansible/cp/2b9a0eeef8 ubuntu1804-vm.local '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529058132.74-222830721646724 `" && echo ansible-tmp-1529058132.74-222830721646724="` echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529058132.74-222830721646724 `" ) && sleep 0'"'"'' <ubuntu1804-vm.local> (1, '', 'mkdir: cannot create directory \xe2\x80\x98/home/alan-sysop/.ansible\xe2\x80\x99: Permission denied\n') fatal: [ubuntu1804-vm]: UNREACHABLE! => { "changed": false, "msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\". Failed command was: ( umask 77 && mkdir -p \"` echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529058132.74-222830721646724 `\" && echo ansible-tmp-1529058132.74-222830721646724=\"` echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529058132.74-222830721646724 `\" ), exited with result 1", "unreachable": true } PLAY RECAP ******************************************************************************************************************************************* ubuntu1804-vm : ok=0 changed=0 unreachable=1 failed=0
作為比較,Debian 9 VM 的任務成功
$ ansible-playbook -b -K -v playbooks/all-bootstrap.yml -l debian9-vm -t copy-test Using /home/alan-sysop/ansible/ansible.cfg as config file SUDO password: PLAY [all] ********************************************************************* TASK [ansible-target : Basic test of copy module] ****************************** changed: [debian9-vm] => {"changed": true, "checksum": "27b41e0724c1aa99931b9e753b639563e3996257", "dest": "/ansible-managed/ansible-target/test-file.txt", "gid": 0, "group": "root", "md5sum": "145fab51c12c1f30714dd15c536f0a7a", "mode": "0644", "owner": "root", "size": 56, "src": "/home/alan-sysop/.ansible/tmp/ansible-tmp-1529057600.23-245931452134186/source", "state": "file", "uid": 0} PLAY RECAP ********************************************************************* debian9-vm : ok=1 changed=1 unreachable=0 failed=0
(並且該任務如預期的那樣是冪等的。如果我再次執行它,它表示系統已經處於所需的狀態;無需進行任何更改。)
$ ansible-playbook -b -K -v playbooks/all-bootstrap.yml -l debian9-vm -t copy-test Using /home/alan-sysop/ansible/ansible.cfg as config file SUDO password: PLAY [all] ********************************************************************* TASK [ansible-target : Basic test of copy module] ****************************** ok: [debian9-vm] => {"changed": false, "checksum": "27b41e0724c1aa99931b9e753b639563e3996257", "dest": "/ansible-managed/ansible-target/test-file.txt", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "path": "/ansible-managed/ansible-target/test-file.txt", "size": 56, "state": "file", "uid": 0} PLAY RECAP ********************************************************************* debian9-vm : ok=1 changed=0 unreachable=0 failed=0
Ansible 任務
劇本文件
all-bootstrap.yml
如下所示:- name: Basic test of copy module copy: src: test-file.txt dest: /ansible-managed/ansible-target/ tags: "copy-test"
test-file.txt
包含一行:This file is used as a test of the Ansible copy module.
Ansible 版本
$ ansible-playbook --version ansible-playbook 2.5.2 config file = /home/alan-sysop/ansible/ansible.cfg configured module search path = [u'/home/alan-sysop/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible-playbook python version = 2.7.15 (default, May 16 2018, 17:50:09) [GCC 8.1.1 20180502 (Red Hat 8.1.1-1)]
從 Fedora Workstation 28 的 repos 安裝。
它說’mkdir:無法創建目錄\xe2\x80\x98/home/alan-sysop/.ansible\xe2\x80\x99:權限被拒絕’。
失敗的命令似乎發生在 Ansible 使用之前
sudo
。$$ 1 $$
/home/alan-sysop/.ansible
Ansible由於權限原因 無法寫入:alan-sysop@ubuntu1804-vm:~$ ls -ld /home/alan-sysop/.ansible drwx------ 3 root root 4096 Jun 14 20:33 /home/alan-sysop/.ansible
據我所知,當我在 VM 上本地執行 Ansible 命令時導致了錯誤的權限:
sudo ansible-playbook -c local --limit ubuntu1804-vm ...
. 如果我改用這些權限,我可以避免設置這些錯誤的權限ansible-playbook -b -K -c local --limit ubuntu1804-vm ...
。證據
$$ 1 $$Ansible 詳細級別 3 輸出顯示了它如何執行失敗的命令。看起來它沒有
sudo
在任何地方使用。
<ubuntu1804-vm.local> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/home/alan-sysop/.ansible/cp/2b9a0eeef8; '/bin/sh -c '"'"'( umask 77 && mkdir -p "
echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529058132.74-222830721646724" && echo ansible-tmp-1529058132.74-222830721646724="
echo /home/alan-sysop/.ansible/tmp/ansible-tmp-1529058132.74-222830721646724`" ) && sleep 0’"’"’’``
<ubuntu1804-vm.local> (1, '', 'mkdir: cannot create directory \xe2\x80\x98/home/alan-sysop/.ansible\xe2\x80\x99: Permission denied\n')