Я считаю, что следующее решение должно работать в вашем случае. Я использовал его для аналогичного сценария с центральным сервером резервного копирования и несколькими клиентами резервного копирования.
У меня есть роль (скажем, « 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, чтобы запустить модуль fetch на ведомых устройствах и извлечь их ssh pubkeys на хост, на котором выполняется ansible, а также сохранить результат этой операции в переменной, чтобы мы могли получить доступ к фактическому списку полученных файлов.
- после этого мы продолжаем нормально отправлять извлеченные ssh-публикации (плюс любые дополнительные предоставляемые публикации) на главный узел с модулем авторизованным ключом (мы используем пару фильтров jinja2, чтобы выкопать пути к файлам из переменной в задаче выше)
- наконец, мы удаляем файлы pubkey, локально кэшированные на хосте, на котором выполняется ansible
Ограничение наличия одного и того же пользователя на всех хостах, вероятно, можно обойти, но из того, что я понял из вашего вопроса, это, вероятно, не проблема для вас (это немного более актуально для моего сценария резервного копирования). Конечно, вы также можете настроить тип ключа (rsa, dsa, ecdsa и т. Д.).
Обновление : ой, я изначально писал с использованием терминологии, специфичной для моей проблемы, а не для вашей Должно быть больше смысла сейчас.