Ansible授权密钥模块无法读取公钥

时间:2017-02-14 14:49:58

标签: ansible

我正在尝试使用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:

  - 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添加到localhost但显示我面临的错误:

---
- 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 }}"

2 个答案:

答案 0 :(得分:3)

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

要解决此问题,请捕获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 }}"

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

答案 1 :(得分:2)

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

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

become

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

如果您不想这样做,并且希望尽可能保持用户无root,那么您需要以 - authorized_key: user: "{{ item }}" state: present key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_rsa.pub') }}" with_items: - "{{ list_of_usernames }}" become: yes (以及您要修改的任何其他用户)运行该命令。这意味着您仍然需要修补testuser文件以允许您的ansible用户转换为这些用户中的任何一个(这也可以打开一些安全问题 - 尽管不能像运行任何东西那样多root),之后你可以这样做:

sudoers

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