Я настраиваю некоторые машины с помощью Ansible, и мне нужно включить парольные соединения между ними. У меня есть мастер базы данных и несколько подчиненных. Для начальной репликации ведомые устройства должны подключиться к ведущему по ssh и получить копию базы данных. Я не уверен, как лучше всего динамически добавить все открытые ключи ведомых устройств к мастерам. authorized_keys
файл.
Я уже думал о том, чтобы предоставить открытые ключи ведомых устройств в качестве переменных, а затем добавить их через authorized_key
модуль. Но тогда я должен вести список ключей. Я ищу подход, в котором я просто добавляю еще один хост в группу подчиненных, а все остальное будет работать автоматически.
Любые идеи?
Пока что у меня получился следующий псевдокод:
# 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
Петля с {% %}
работает только в файлах шаблонов, а не в плейбуках напрямую. Любой способ сделать это в моем сборнике пьес?
Я считаю, что в вашем случае должно работать следующее решение. Я использовал его для аналогичного сценария с центральным сервером резервного копирования и несколькими клиентами резервного копирования.
У меня есть роль (скажем "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 и т. Д.).
Обновить: ой, изначально я использовал терминологию, специфичную для мой проблема, не твоя! Теперь должно быть больше смысла.
Я нашел решение, которое мне подходит. Я создаю общедоступные / закрытые ключи на своей машине, на которой запускается 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.
У меня такая же проблема, и я решил ее так:
---
# 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']}}"