问题描述
想要使用Ansible的authorized_key模块,将ServerA(不是控制机器)授权访问ServerB。具体需求是,需要一个在Ansible控制器上执行的playbook,将远程ssh ServerA的特定用户的id_rsa.pub追加到ServerB上。在用户的情况下,ServerA的数量为20,而ServerB的数量为200。用户已经尝试了一些方法,但没有成功。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
以下是一种解决方案,可以从ServerA获取公钥,并在ServerB上配置authorized_keys。
1. 从ServerA获取公钥
- hosts: ServerA
vars:
public_keys_dir: <PUB_KEYS_DIR>
specific_user:
- user1
- user2
- userN
tasks:
- name: Fetch pub keys
fetch:
src: "/home/{{ item }}/.ssh/id_rsa.pub"
dest: "{{ public_keys_dir }}/{{ item }}-ServerA.id_rsa.pub"
flat: yes
loop: "{{ specific_user }}"
在上面的示例中,我们使用fetch
模块从ServerA获取特定用户的id_rsa.pub,并将其保存到指定的目录中。
2. 在ServerB上配置authorized_keys
- hosts: ServerB
vars:
public_keys_dir: <PUB_KEYS_DIR>
my_remote_user: admin
tasks:
- name: Set up authorized_keys
authorized_key:
user: "{{ my_remote_user }}"
key: "{{ lookup('file', '{{ item }}')}}"
with_fileglob:
- "{{ public_keys_dir }}/*-ServerA.id_rsa.pub"
在上面的示例中,我们使用authorized_key
模块将从ServerA获取的公钥配置到ServerB的authorized_keys文件中。
请注意,这只是一个示例,可能需要根据实际情况进行调整和修改。
方案2
以下是另一种解决方案,可以从edgenode获取公钥,并将其追加到datanode的authorized_keys文件中。
- name: Play to setup Passowrdless
remote_user: "{{ ssh_user }}"
vars_prompt:
- name: "ssh_user"
prompt: "Please specify ssh user name"
private: no
hosts: all
tasks:
- name: Get pub key value from edgenode
command:
cat $HOME/.ssh/id_rsa.pub
register: pubkey
changed_when: false
when: "'group_edgenode' in group_names"
- name: Append pub key value to datanodes
lineinfile:
path: $HOME/.ssh/authorized_keys
line: "{{ hostvars[item]['pubkey']['stdout'] }}"
state: present
owner: "{{ ssh_user }}"
mode: 0600
backup: yes
insertafter: EOF
with_items: "{{ groups['group_edgenode'] }}"
when: "'group_datanode' in group_names"
在这个解决方案中,我们首先使用command
模块从edgenode获取公钥,并将其保存到pubkey
变量中。然后,我们使用lineinfile
模块将公钥追加到datanode的authorized_keys文件中。
请注意,这只是一个示例,可能需要根据实际情况进行调整和修改。