在主机之间分配ssh公钥


11

我正在使用Ansible设置一些计算机,并且需要启用它们之间的无密码连接。我有一个数据库主服务器和几个从属服务器。对于初始复制,从属服务器需要ssh进入主服务器并获取数据库的副本。我不确定将所有从属公共密钥动态添加到masters authorized_keys文件的最佳方法是什么。

我已经考虑过将奴隶的公共密钥作为变量提供,然后通过authorized_key模块添加它们。但是,我必须维护密钥列表。我正在寻找一种方法,我只需在slaves组中添加另一台主机,其余主机将自动工作。

有任何想法吗?

更新:

到目前为止,我得到了以下伪代码:

# collect public keys from slave machines
- name: collect slave keys
  {% for host in groups['databases_slave'] %}
     shell: /bin/cat /var/lib/postgresql/.ssh/id_rsa.pub
     register: slave_keys #how to add to an array here?
  {% endfor %}

# Tasks for PostgreSQL master
- name: add slave public key
  sudo: yes
  authorized_key: user=postgres state=present key={{ item }}
  with_items: slave_keys

{% %}唯一的循环适用于模板文件,而不直接适用于剧本。有什么办法可以在我的剧本中做到这一点?

Answers:


5

我想出了一个对我有用的解决方案。我确实在运行Ansible的机器上创建了公用/专用密钥,在第一个连接上,我将密钥放置到位。

然后,使用以下命令将所有从属服务器的密钥添加到主服务器:

# Tasks for PostgreSQL master
- name: add slave public key
  sudo: yes
  authorized_key: user=postgres state=present key="{{ lookup('file', '../../../keys/' + item + '/id_rsa.pub') }}"
  with_items: groups.databases_slave

整个剧本可以在github.com/soupdiver/ansible-cluster找到


5

我相信以下解决方案应适合您的情况。我在具有中央备份服务器和多个备份客户端的类似情况下一直使用它。

我有一个角色(让我们说“ db_replication_master ”)与接收连接的服务器相关联:

    - role: db_replication_master
      db_slaves: ['someserver', 'someotherserver']
      db_slave_user: 'someuser' # in case you have different users
      db_master_user: 'someotheruser'
      extra_pubkeys: ['files/id_rsa.pub'] # other keys that need access to master

然后,我们在db_replication_master角色中创建实际任务:

    - name: create remote accounts ssh keys
      user:
        name: "{{ db_slave_user }}"
        generate_ssh_key: yes
      delegate_to: "{{ item }}"
      with_items: db_slaves

    - name: fetch pubkeys from remote users
      fetch:
        dest: "tmp/db_replication_role/{{ item }}.pub"
        src: "~{{db_slave_user}}/.ssh/id_rsa.pub"
        flat: yes
      delegate_to: "{{ item }}"
      with_items: db_slaves
      register: remote_pubkeys
      changed_when: false # we remove them in "remove temp local pubkey copies" below

    - name: add pubkeys to master server
      authorized_key:
        user: "{{ db_master_user }}"
        key: "{{ lookup('file', item) }}"
      with_flattened:
        - extra_pubkeys
        - "{{ remote_pubkeys.results | default({}) | map(attribute='dest') | list }}"

    - name: remove temp local pubkey copies
      local_action: file dest="tmp/db_replication_role" state=absent
      changed_when: false

所以我们基本上是:

  • 在仍然没有它们的奴隶上动态创建ssh-key
  • 然后我们使用委托 _在从属服务器上运行fetch模块,并将其ssh pubkey提取到运行ansible的主机,还将此操作的结果保存在变量中,以便我们可以访问提取文件的实际列表
  • 之后,我们通常使用authorized_keys模块将获取的ssh pubkey(以及提供的任何其他附加的pubkey)正常推送到主节点(我们使用几个jinja2过滤器从上述任务中的变量中找出文件路径)
  • 最后,我们删除在运行ansible的主机上本地缓存的pubkey文件

在所有主机上拥有相同用户的限制可能可以解决,但是从您的问题中得到的信息来看,这可能对您来说不是问题(这与我的备份方案更为相关)。您当然也可以使密钥类型(rsa,dsa,ecdsa等)可配置。

更新:糟糕,我最初使用的是针对我的问题的术语,而不是您的问题!现在应该更有意义。


0

我遇到了同样的问题,并以此方式解决了这个问题:

---
# Gather the SSH of all hosts and add them to every host in the inventory
# to allow passwordless SSH between them
- hosts: all
  tasks:
  - name: Generate SSH keys
    shell: ssh-keygen -q -t rsa -f /root/.ssh/id_rsa -N ''
    args:
      creates: /root/.ssh/id_rsa

  - name: Allow passwordless SSH between all hosts
    shell: /bin/cat /root/.ssh/id_rsa.pub
    register: ssh_keys

  - name: Allow passwordless SSH between all hosts
    lineinfile:
      dest: /root/.ssh/authorized_keys
      state: present
      line:  " {{ hostvars[item]['ssh_keys']['stdout'] }}"
    with_items: "{{ groups['all']}}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.