ansible 创建的文件似乎权限混乱

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 身份进行了第一次查找和创建

作为 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的目录时会发生什么。目录上的位使您能够调用它,因此您可以获取其中的文件名,但没有它们,您就无法找到通常打印的所有其他信息。rxrreaddirxstatls -l

ls告诉您无法通过其Permission denied错误消息和充满问号的字段获取信息。

第二封电子邮件ls确认了这一诊断:

drw-r--r-- 2 myusername myusername 4096 Sep 17 19:54 .

用户myusername具有读取权限,但没有执行权限。您可能想要u+xa+x该目录。

我从您的帖子中了解到一件有趣的事情,那就是r-without-x现在提供的信息比以前稍微多一点...您可以在原始列表中看到authorized_keys是常规文件,.并且..是目录(第一列d-)。在较旧的 Unix/Linux 系统上,第一列也会是一个问号!如今readdir会返回文件类型信息作为奖励,因此您无需输入即可获得它stat

...我略过了你问题的后半部分,因为我以前从未见过这些东西,但这看起来像是罪魁祸首

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

我希望.ssh目录是0700正常的。并且里面的文件是0600。这是一个你真的不希望其他用户进入的区域。无论如何,它至少需要是,0500以便ls -l所有者正常运行。

相关内容