Поширюйте відкриті ключі ssh серед хостів


11

Я налаштовую деякі машини з Ansible і мені потрібно включити без паролів з'єднання між ними. У мене є майстер бази даних та кілька рабів. Для первинної реплікації раби повинні запустити в головний дім і отримати копію бази даних. Я не впевнений, який найкращий спосіб динамічно додати всі раби відкриті ключі до головного 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

Цикл, який {% %}працює лише в файлах шаблонів, а не в ігрових книгах безпосередньо. Будь-який спосіб це зробити в моїй ігровій книзі?

Відповіді:


5

Я придумав рішення, яке працює для мене. Я створюю публічні / приватні ключі на своїй машині, звідки працює 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 .


5

Я вважаю, що наступне рішення повинно працювати у вашому випадку. Я використовував його для аналогічного сценарію з центральним сервером резервного копіювання та кількома клієнтами резервного копіювання.

У мене є роль (скажімо, " 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 тощо) налаштованим.

Оновлення : ой, я спочатку писав, використовуючи термінологію, специфічну для моєї проблеми, а не вашу! Слід мати більше сенсу зараз.


0

У мене виникло те саме питання, і я вирішив це таким чином:

---
# 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']}}"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.