Я вважаю, що наступне рішення повинно працювати у вашому випадку. Я використовував його для аналогічного сценарію з центральним сервером резервного копіювання та кількома клієнтами резервного копіювання.
У мене є роль (скажімо, " 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 pubkeys на хост працюють анзібль, а також збереження результату цієї операції в змінному , щоб ми могли отримати доступ до фактичного списку принесених файлів
- після цього ми переходимо до нормального натискання отриманих ssh pubkeys (плюс будь-які додаткові надані), до головного вузла за допомогою модуля санкціонованих_кейсів (ми використовуємо пару фільтрів jinja2 для викопування файлових маршрутів зі змінної у вищезазначеному завданні)
- нарешті, ми видаляємо файли віні, локально кешовані на хості, який працює ansible
Обмеження наявності одного користувача на всіх хостах, ймовірно, може бути розроблено, але, як я отримав із вашого запитання, це, мабуть, не є проблемою для вас (це трохи більше актуально для мого сценарію резервного копіювання). Звичайно, можна також зробити тип ключа (rsa, dsa, ecdsa тощо) налаштованим.
Оновлення : ой, я спочатку писав, використовуючи термінологію, специфічну для моєї проблеми, а не вашу! Слід мати більше сенсу зараз.