我正在尝试使用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 }}"
答案 0 :(得分:3)
好的,问题在于查找插件
它在ansible控制主机上执行,具有运行ansible-playbook
和become: 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.pub
:root
和testuser
,因此如果您想要修改这些文件,则需要{{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部分。