【问题标题】:Ansible authorized key module unable to read public keyAnsible 授权密钥模块无法读取公钥
【发布时间】:2017-07-02 22:05:49
【问题描述】:

我正在尝试使用 ansible(版本 2.1.2.0)在我们的服务器网络中创建命名 ssh 访问。从跳转框运行 ansible 我正在创建一组用户并使用用户模块创建一个私钥/公钥对

  - user:
      name: "{{ item }}"
      shell: /bin/bash
      group: usergroup
      generate_ssh_key: yes
      ssh_key_comment: "ansible-generated for {{ item }}"
    with_items: "{{ list_of_usernames }}"

我想从那里将​​公钥复制到每个远程服务器上的 authorized_users 文件。我正在使用authorized_key_module 获取并复制用户生成的公钥作为远程服务器上的授权密钥:

  - authorized_key:
      user: "{{ item }}"
      state: present
      key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}"
    with_items:
      - "{{ list_of_usernames }}"

我发现查找将失败,因为它无法访问用户的 .ssh 文件夹中的 pub 文件。但是,如果我以 root 用户身份运行 ansible(这对我来说不是我愿意采用的选项),它将运行愉快。

fatal: [<ipAddress>]: FAILED! => {"failed": true, "msg": "{{ lookup('file', '/home/testuser/.ssh/id_rsa.pub') }}: the file_name '/home/testuser/.ssh/id_rsa.pub' does not exist, or is not readable"}

除了以 root 身份运行 ansible 之外,还有更好的方法吗?

编辑:对不起,我忘了提到我正在运行成为:是的

编辑#2:下面是我尝试运行的精简剧本,当然在这种情况下,它会将authorized_key 添加到本地主机,但会显示我面临的错误:

---
- hosts: all
  become: yes
  vars:
    active_users: ['user1','user2']
  tasks:

  - group:
      name: "users"

  - user:
      name: "{{ item }}"
      shell: /bin/bash
      group: users
      generate_ssh_key: yes
    with_items: "{{ active_users }}"

  - authorized_key:
      user: "{{ item }}"
      state: present
      key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}"
    become: yes
    become_user: "{{ item }}"
    with_items:
      - "{{ active_users }}"

【问题讨论】:

  • 但是如何创建没有 root 权限的新用户?
  • 对不起,我在写问题的时候就想写这个,我确实在使用 become: yes
  • 为什么你不能只为下一个任务做become: yes
  • 因为这给出了相同的结果,目前正在尝试成为 SztupY 建议的用户

标签: ansible


【解决方案1】:

好的,问题出在查找插件上。
它在具有运行ansible-playbookbecome: yes 的用户权限的ansible 控制主机上执行,不会提升插件的权限。

要克服这个问题,请捕获user 任务的结果并将其输出用于进一步的任务:

- user:
    name: "{{ item }}"
    shell: /bin/bash
    group: docker
    generate_ssh_key: yes
    ssh_key_comment: "ansible-generated for {{ item }}"
  with_items:
    - ansible5
    - ansible6
  register: new_users
  become: yes

- debug: msg="user {{ item.item }} pubkey {{ item.ssh_public_key }}"
  with_items: "{{ new_users.results }}"

虽然您需要委派其中一些任务,但想法是一样的。

【讨论】:

  • 谢谢,我感觉这与查找权限有关,但对 ansible 来说相当新,所以无法想出这样的东西。非常感谢
【解决方案2】:

在大多数 linux/unix 机器上,只有两个帐户可以访问 /home/testuser/.ssh/id_rsa.pubroottestuser,因此如果您想修改这些文件,您需要使用 roottestuser

您可以使用privilige escalationbecome。您说您不想以 root 身份运行 ansible,这很好。您没有提到与您一起运行 ansible 的用户是否具有 sudo 访问权限。如果是这样,并且使用 sudo 对你来说很好,那么你可以简单地这样做:

  - authorized_key:
      user: "{{ item }}"
      state: present
      key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}"
    with_items:
      - "{{ list_of_usernames }}"
    become: yes

默认情况下,这将使用 sudo 以 root 身份运行这些命令,同时保留由非 root 用户运行的其余任务。这也是使用 ansible 进行运行的首选方式。

如果您不希望这样,并且希望您的用户尽可能无根,那么您需要以testuser(以及您要修改的任何其他用户)的身份运行该命令。这意味着您仍然需要修补 sudoers 文件以允许您的 ansible 用户转换为这些用户中的任何一个(这也可能会引发一些安全问题 - 尽管不如能够以 root 身份运行任何东西) ,之后你可以这样做:

  - authorized_key:
      user: "{{ item }}"
      state: present
      key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}"
    with_items:
      - "{{ list_of_usernames }}"
    become: yes
    become_user: "{{ item }}"

使用这种方法有一些注意事项,因此在尝试此方法之前,您可能需要阅读 ansible 文档中的完整 Privilege Escalation 页面,尤其是 Unpriviliged Users 部分。

【讨论】:

  • 感谢您的详细回复,我将再次查看权限文档几次以确保我已经掌握了它。以 root 身份运行对我来说似乎有点奇怪,尤其是在尝试设置命名访问以防止人们需要以 root 身份登录时。
  • 花了 4 个小时试图找出为什么 II 出现不允许操作错误...即使我以特权用户的身份发布剧本,我没有声明成为用户...谢谢这么多!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多