我正在使用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
所以我们基本上是:
在所有主机上拥有相同用户的限制可能可以解决,但是从我的问题中得到的结果可能不是您的问题(与我的备份scheme相比,这个问题更为重要)。 你当然也可以configuration密钥types(rsa,dsa,ecdsa等)。
更新 :哎呀,我最初是用专门针对我的问题的术语写的,不是你的! 现在应该更有意义。