私は次の解決策があなたのケースでうまくいくと信じています。中央のバックアップサーバーと複数のバックアップクライアントを使用する同様のシナリオで使用しています。
接続を受信するサーバーに関連付けられたロール(たとえば、「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キーを作成する
- 次に、delegate_toを使用してスレーブでフェッチモジュールを実行し、それらのssh pubkeyをansibleを実行しているホストにフェッチします。また、この操作の結果を変数に保存して、フェッチされたファイルの実際のリストにアクセスできるようにします
- その後、通常はフェッチされたssh pubkeys(および提供された追加のpubkeys)を、authorized_keysモジュールを使用してマスターノードにプッシュします(上記のタスクで変数からファイルパスを掘り出すためにjinja2フィルターをいくつか使用します)。
- 最後に、ansibleを実行しているホストでローカルにキャッシュされたpubkeyファイルを削除します
すべてのホストで同じユーザーを使用するという制限はおそらく回避できますが、あなたの質問から私が得たものから、それはおそらくあなたにとって問題ではありません(それは私のバックアップシナリオに少し関連しています)。もちろん、鍵のタイプ(rsa、dsa、ecdsaなど)を構成可能にすることもできます。
更新:おっと、私はもともと、あなたの問題ではなく、私の問題に固有の用語を使用して作成していました!今はもっと理にかなっているはずです。