使用Ansible授权从远程源到远程目标的复制

35次阅读
没有评论

问题描述

想要使用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文件中。
请注意,这只是一个示例,可能需要根据实际情况进行调整和修改。

正文完