ansible 創建的文件似乎具有損壞的權限
Ansible 創建的文件存在問題
我正在考慮使用在新的 ISP 處設置一些新伺服器,並且我一直在做一些基本的步驟來首先進行測試。我是新手,但在另一個 ISP 的差異伺服器上做了一些測試,似乎一切正常(我在那裡創建了文件沒有問題)。兩者都是 Unbuntu 12,但最初的測試是在已經將其核心更新到 3.8.0-44-generic 並添加了其他維護的伺服器上進行的。這個新伺服器也是 Ubuntu 12,但來自 ISP 模板,使用核心 3.5(Ubuntu 12.04.2 LTS (GNU/Linux 3.5.0-23-generic x86_64))
我的第一個測試是創建新使用者並上傳他們已經存在的 SSH 密鑰以供將來登錄。使用者創建時沒有問題,文件創建在創建過程中沒有顯示任何錯誤,但是當我嘗試使用它們時確實如此。我嘗試使用密鑰登錄(新使用者)_,但係統表現得好像 SSH 密鑰文件不存在。由於這是我以 root 身份登錄的第一個新使用者,並以 root 身份進行了第一次查找和創建
作為根,一切看起來都很好。.ssh 目錄中的文件“authorized_keys”存在並且似乎具有正確的權限並且確實具有正確的內容。但是嘗試通過 SSH 登錄就像它不存在一樣。我退出 root 並以新使用者身份重新登錄(使用密碼,因為密鑰未被辨識)。我執行“ls -al”並查看 .ssh 目錄很好,但是執行“ls -al .ssh”以查看目錄中的“authorized_keys”文件給了我一個非常奇怪的結果。’ls’ 為目錄中的每個項目輸出“權限被拒絕”錯誤消息,然後顯示應該是命令結果,但是當文件名可見時,其他所有內容(權限、文件大小、使用者/組、日期)都是被問號代替。
首先作為使用者 - myusername
myusername@my-server:~$ ls -al .ssh ls: cannot access .ssh/authorized_keys: Permission denied ls: cannot access .ssh/..: Permission denied ls: cannot access .ssh/.: Permission denied total 0 d????????? ? ? ? ? ? . d????????? ? ? ? ? ? .. -????????? ? ? ? ? ? authorized_keys myusername@my-server:~$
現在作為根
sudo bash [sudo] password for myusername: root@my-server:~# sudo ls -al .ssh total 12 drw-r--r-- 2 myusername myusername 4096 Sep 17 19:54 . drwxr-xr-x 4 myusername myusername 4096 Sep 17 22:51 .. -rw-r--r-- 1 myusername myusername 406 Sep 17 19:54 authorized_keys root@my-server:~#
就文件而言,我的伺服器滿足最低要求(linux、SSH 和 Python)
規格是 - Ubuntu 12.04.2 LTS (GNU/Linux 3.5.0-23-generic x86_64)
ansible 版本是 1.7.1
我正在從我的 OSX (10.9.4) Python Python 2.7.5 筆記型電腦上執行 ansible 會話
下面是我為此執行的 Ansible Playbook
--- # This playbook create my user {{userid}} and loads the public ssh-key - name: create my user {{userid}} and loads the public ssh-key hosts: myservername-public # gather_facts: no # remote_user: myusername vars: # security_groups: "sudo,adm" security_groups: "" userid: testjunk01 tasks: - name: test connection ping: remote_user: myusername - name: Create user {{userid}} groups={{security_groups}} user: name={{userid}} shell=/bin/bash groups={{security_groups}} append=yes password=$hashed_password_was_here_and_it_worked - name: Verify that needed directories are in place before file copy file: dest="/home/{{userid}}/.ssh" mode=0644 owner={{userid}} group={{userid}} state=directory - name: Copy file into user {{userid}}'s directory copy: src="/Users/osx_user/Documents/Projects/Projects Internal/Security/ssh-key-public/myusername" dest="/home/{{userid}}/.ssh/authorized_keys" mode=0644 owner={{userid}} group={{userid}} backup=yes - name: Reset permissions for file after file copy file: dest="/home/{{userid}}/.ssh/authorized_keys" mode=0644 owner={{userid}} group={{userid}} state=file
===== 剛剛升級到ansible 1.7.2 並再次嘗試。結果相同。下面執行
伺服器名稱和 IP 地址被屏蔽
$ ansible-playbook playbooks/test01/Test02/create-user -i ansible-hosts --ask-pass -vv SSH password: PLAY [create my user testjunk01 and loads the public ssh-key] ***************** GATHERING FACTS *************************************************************** <192..168.1.1> REMOTE_MODULE setup ok: [myserver-public] TASK: [test connection] ******************************************************* <192..168.1.1> REMOTE_MODULE ping ok: [myserver-public] => {"changed": false, "ping": "pong"} TASK: [Create user testjunk01 groups=] **************************************** <192..168.1.1> REMOTE_MODULE user name=testjunk01 shell=/bin/bash groups= append=yes password=VALUE_HIDDEN ok: [myserver-public] => {"append": true, "changed": false, "comment": "", "group": 1003, "groups": "", "home": "/home/testjunk01", "move_home": false, "name": "testjunk01", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "uid": 1003} TASK: [Verify that needed directories are in place before file copy] ********** <192..168.1.1> REMOTE_MODULE file dest="/home/testjunk01/.ssh" mode=0644 owner=testjunk01 group=testjunk01 state=directory changed: [myserver-public] => {"changed": true, "gid": 1003, "group": "testjunk01", "mode": "0644", "owner": "testjunk01", "path": "/home/testjunk01/.ssh", "size": 4096, "state": "directory", "uid": 1003} TASK: [Copy file into user testjunk01's directory] **************************** changed: [myserver-public] => {"changed": true, "dest": "/home/testjunk01/.ssh/authorized_keys", "gid": 1003, "group": "testjunk01", "md5sum": "fd6c6017993e847026a010bf67a96c1a", "mode": "0644", "owner": "testjunk01", "size": 406, "src": "/root/.ansible/tmp/ansible-tmp-1412114658.34-25330110994991/source", "state": "file", "uid": 1003} TASK: [Reset permissions for file after file copy] **************************** <192..168.1.1> REMOTE_MODULE file dest="/home/testjunk01/.ssh/authorized_keys" mode=0644 owner=testjunk01 group=testjunk01 state=file ok: [myserver-public] => {"changed": false, "gid": 1003, "group": "testjunk01", "mode": "0644", "owner": "testjunk01", "path": "/home/testjunk01/.ssh/authorized_keys", "size": 406, "state": "file", "uid": 1003} PLAY RECAP ******************************************************************** myserver-public : ok=6 changed=2 unreachable=0 failed=0
您引用的第一個
ls
是當您嘗試訪問ls -l
您有r
權限但沒有x
權限的目錄時會發生什麼。目錄上的r
位使您能夠呼叫readdir
它,因此您可以獲得其中的文件名,但如果沒有,x
您將無法stat
找到ls -l
通常列印的所有其他資訊。
ls
告訴您無法通過Permission denied
錯誤消息和充滿問號的欄位獲取資訊。第二個
ls
用這條線確認診斷:drw-r--r-- 2 myusername myusername 4096 Sep 17 19:54 .
使用者
myusername
有讀權限,但沒有執行權限。您可能想要u+x
或a+x
該目錄。我從您的文章中學到的一件有趣的事情是
r
-without-x
現在提供的資訊比以前稍微多…您可以在原始列表中看到它authorized_keys
是一個正常文件並且.
是..
目錄(第一列d
與-
.)。在較舊的 Unix/Linux 系統上,第一列也是一個問號!現在readdir
返回文件類型資訊作為獎勵,因此您無需stat
ing 即可獲得它。…我略略略過了你問題的後半部分,因為我以前從未見過那些東西,但這看起來像是罪魁禍首
file: dest="/home/{{userid}}/.ssh" mode=0644
我希望
.ssh
目錄0700
正常。並且裡面的文件是0600
. 這是一個您真的不希望其他使用者徘徊的區域。無論如何,它至少需要0500
為ls -l
所有者正常執行。