私はAnsibleでいくつかのマシンをセットアップしていて、それらの間のパスワードレス接続を有効にする必要があります。データベースマスターといくつかのスレーブがあります。最初のレプリケーションでは、スレーブはマスターにSSHで接続し、データベースのコピーを取得する必要があります。すべてのスレーブ公開鍵をマスターauthorized_keys
ファイルに動的に追加する最善の方法は何なのかわかりません。
スレーブの公開鍵を変数として提供し、authorized_key
モジュールを介してそれらを追加することはすでに考えました。しかし、私はキーのリストを維持する必要があります。スレーブグループをもう1つホストに追加するだけで、残りは自動的に機能するアプローチを探しています。
何か案は?
これまでのところ、私は次の擬似コードを取得しました:
# 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
{% %}
を使用したループは、テンプレートファイルでのみ機能し、プレイブックでは直接機能しません。プレイブックでこれを行う方法はありますか?
私に役立つ解決策を思いついた。私は、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 にあります。
私は次の解決策があなたのケースでうまくいくと信じています。中央のバックアップサーバーと複数のバックアップクライアントを使用する同様のシナリオで使用しています。
接続を受信するサーバーに関連付けられたロール(「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
つまり、基本的には:
すべてのホストで同じユーザーを使用するという制限はおそらく回避できますが、あなたの質問から私が得たものから、それはおそらくあなたにとって問題ではありません(それは私のバックアップシナリオに少し関連しています)。もちろん、鍵のタイプ(rsa、dsa、ecdsaなど)を構成可能にすることもできます。
更新:おっと、私はもともとmy問題に固有の用語を使用して作成しましたが、あなたの問題ではありません!今はもっと理にかなっているはずです。
私は同じ問題を得て、私はそれをこのように解決しました:
---
# 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']}}"