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 身份进行了第一次查找和创建
作为 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:~$
现在以 root 身份
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
答案1
您引用的第一个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
。
...我略过了你问题的后半部分,因为我以前从未见过这些东西,但这看起来像是罪魁祸首
file: dest="/home/{{userid}}/.ssh"
mode=0644
我希望.ssh
目录是0700
正常的。并且里面的文件是0600
。这是一个你真的不希望其他用户进入的区域。无论如何,它至少需要是,0500
以便ls -l
所有者正常运行。