在主机之间分配ssh公钥

我正在使用Ansible设置一些机器,并且需要在它们之间启用无密码连接。 我有一个数据库主和几个奴隶。 对于初始复制,从站需要ssh进入主站并获得数据库的副本。 我不知道什么是最好的方式dynamic地添加所有的奴隶公钥到主人authorized_keys文件。

我已经想过提供从站公钥作为variables,然后通过authorized_key模块添加它们。 但是,我必须保持键的列表。 我正在寻找一种方法,我只是添加另一个主机的奴隶组,其余的将自动工作。

有任何想法吗?

更新:

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

 # 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 

带有{% %}的循环只能在模板文件中使用,而不能在工作簿中直接使用。 任何方式在我的手册中做到这一点?

我想出了一个适合我的解决scheme。 我在我的机器上创build了公钥/私钥,从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上find 。

我相信下面的解决scheme应该适用于你的情况。 我一直在使用它与中央备份服务器和多个备份客户端类似的情况。

我有一个与接收连接的服务器关联的angular色(比如说“ 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_masterangular色中创build实际的任务:

  - 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 

所以我们基本上是:

  • dynamic创build仍然没有它们的从站上的ssh密钥
  • 那么我们使用delegate_to来运行slave上的fetch模块,并把它们的ssh pubkeys拿到运行正常的主机上,同时把这个操作的结果保存在一个variables中,这样我们就可以访问实际获取的文件列表
  • 之后,我们继续正常地将提取的ssh pubkeys(加上提供的任何额外的pubkey)推送到具有authorized_keys模块的主节点(我们使用几个jinja2filter从上面的任务中的variables中挖掘出文件path)
  • 最后我们删除本地caching在主机上的pubkey文件

在所有主机上拥有相同用户的限制可能可以解决,但是从我的问题中得到的结果可能不是您的问题(与我的备份scheme相比,这个问题更为重要)。 你当然也可以configuration密钥types(rsa,dsa,ecdsa等)。

更新 :哎呀,我最初是用专门针对我的问题的术语写的,不是你的! 现在应该更有意义。