由ansible创build的文件似乎具有损坏的权限

问题与Ansible创build的文件

我正在使用在新的ISP上设置一些新的服务器,我一直在做一些基本的testing步骤。 我是新的,但已经在另一个ISP的差异服务器上做了一些testing,似乎没有问题(我创build的文件没有问题)。 两者都是Unbuntu 12,但原来的testing已经在一个服务器上,它的内核已经更新到3.8.0-44-通用和其他maint补充。 这个新的服务器也是Ubuntu 12,但是来自ISP模板,并且使用Kernel 3.5(Ubuntu 12.04.2 LTS(GNU / Linux 3.5.0-23-generic x86_64))

我的第一个testing是创build新用户并上传他们已经存在的SSH密钥以供将来login。 用户创build没有问题,文件创build在创build过程中没有提供任何错误的迹象,但是当我尝试使用它们时。 我尝试login(新用户)_使用密钥,但系统的行为就好像SSH密钥文件不存在。 因为这是我第一个以root身份login的新用户,并以root身份进行了第一次查看和创build

作为根一切看起来不错。 .ssh目录中的文件“authorized_keys”存在并且似乎具有正确的权限,并且具有正确的内容。 但是试图通过SSHlogin就好像它不在那里一样。 我从rootlogin并以新用户身份重新login(使用密码,因为密钥未被识别)。 我做了一个“ls -al”,并且看到.ssh目录,但是通过“ls -al .ssh”查看目录中的“authorized_keys”文件给了我一个非常奇怪的结果。 'ls'为目录中的每个项目输出“Permission denied”错误消息,然后显示应该是命令结果的内容,但是文件名是可见的,其他所有内容(权限,文件大小,用户/组,date)是取而代之的是问号。

首先作为用户 – 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)

完全版本是1.7.1

我正在从我的OSX(10.9.4)Python Python 2.7.5笔记本电脑上运行一个完整的会话

下面是我跑这样做的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 

=====刚刚升级到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你有权限但没有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返回文件types信息作为奖励,所以你可以得到它没有stat

…我有点匆匆过问你的问题的后半部分,因为我从来没有见过这样的东西,但这看起来像罪魁祸首

 file: dest="/home/{{userid}}/.ssh" mode=0644 

我希望一个.ssh目录通常是0700 。 里面的文件是0600 。 这是一个你真的不希望其他用户漫游的地方。不pipe怎样, ls -l至less需要0500才能正常运行。