Acredito que a solução a seguir deve funcionar no seu caso. Eu tenho usado para um cenário semelhante com um servidor de backup central e vários clientes de backup.
Eu tenho um papel (digamos " 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
Em seguida, criamos as tarefas reais na função 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
Então estamos basicamente:
- criando dinamicamente chaves ssh nos escravos que ainda não os têm
- então estamos usando delegate_to para executar o módulo fetch nos slaves e buscar suas chaves pub ssh para o host que está sendo executado, também salvando o resultado dessa operação em uma variável para que possamos acessar a lista real de arquivos buscados
- depois disso, vamos normalmente empurrar os pubs ssh buscados (mais quaisquer pubkeys adicionais fornecidos) para o nó mestre com o módulo authorized_keys (usamos alguns filtros jinja2 para cavar os caminhos de arquivos de a variável na tarefa acima)
- finalmente, removemos os arquivos pubkey localmente armazenados em cache no host que está sendo executado
A limitação de ter o mesmo usuário em todos os hosts provavelmente pode ser contornada, mas pelo que recebi da sua pergunta, isso provavelmente não é um problema para você (é um pouco mais relevante para meu cenário de backup). Você poderia também fazer o tipo de chave (rsa, dsa, ecdsa, etc) configurável.
Atualização : oops, eu escrevi originalmente usando terminologia específica para o meu problema, não o seu! Deve fazer mais sentido agora.