Ssh genel anahtarlarını ana bilgisayarlar arasında dağıtma


11

Ansible ile bazı makineler kuruyorum ve aralarında şifre daha az bağlantıyı etkinleştirmem gerekiyor. Bir veritabanı ustası ve birkaç kölem var. İlk çoğaltma için slave'lerin master'a ssh etmesi ve veritabanının bir kopyasını alması gerekir. Ustalar authorized_keysdosyasına dinamik olarak tüm köle ortak anahtarları eklemek için en iyi yolu nedir emin değilim .

Ben zaten kölelere ortak anahtarları değişken olarak sağlamayı ve sonra bunları authorized_keymodül üzerinden eklemeyi düşündüm . Ama sonra anahtar listesini tutmalıyım. Ben sadece köle grubu ve geri kalanı otomatik olarak çalışacaktır başka bir ev sahibi eklemek bir yaklaşım arıyorum.

Herhangi bir fikir?

Güncelleme:

Şimdiye kadar aşağıdaki sahte kodu aldım:

# 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

{% %}Yalnızca olan döngü , şablon dosyalarında çalışır ve doğrudan oyun kitaplarında çalışmaz. Bunu oyun kitabımda yapmanın bir yolu var mı?

Yanıtlar:


5

Benim için çalışan bir çözüm buldum. Ansible'ın çalıştığı makinede genel / özel anahtarları oluşturuyorum ve ilk bağlantıda anahtarları yerine koydum.

Sonra tüm köle anahtarları master ile aşağıdaki ile ekleyin:

# 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

Oyun kitabının tamamı github.com/soupdiver/ansible-cluster adresinde bulunabilir .


5

Aşağıdaki çözümün sizin durumunuzda çalışması gerektiğine inanıyorum. Merkezi bir yedekleme sunucusu ve birden çok yedekleme istemcisi ile benzer bir senaryo için kullanıyorum.

Bağlantıları alan sunucu ile ilişkili bir rol var (diyelim " 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

Sonra asıl görevleri db_replication_master rolünde oluştururuz:

    - 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

Yani temelde:

  • hala sahip olmayan köleler üzerinde dinamik olarak ssh anahtarları oluşturma
  • daha sonra delegate_to komutunu kullanarak, slave'lerde fetch modülünü çalıştırmak ve ssh pubkey'lerini ansible çalıştıran ana bilgisayara getiriyoruz, ayrıca getirilen dosyaların gerçek listesine erişebilmemiz için bu işlemin sonucunu bir değişkene kaydediyoruz
  • Normalde ile ana düğüme getirilen SSH pubkeys (artı sağlanan ilave pubkeys) itmek için devam sonra authorized_keys (yukarıda görevi değişkeninden filepaths kazmak jinja2 filtre bir çift kullanın) modülü
  • nihayet yerel olarak önbelleğe alınan pubkey dosyalarını kaldırılabilir

Tüm kullanıcılarda aynı kullanıcıya sahip olmanın sınırlandırılması büyük olasılıkla çözülebilir, ancak sorunuzdan ne aldığımdan, bu muhtemelen sizin için bir sorun değildir (yedekleme senaryom için çok daha alakalı). Elbette anahtar türünü de (rsa, dsa, ecdsa, vb.) Yapılandırılabilir yapabilirsiniz.

Güncelleme : oops, aslen için terminoloji özgü kullanılarak yazılmıştır ediyorum benim , problem senin değil! Şimdi daha anlamlı olmalı.


0

Aynı sorunu aldım ve şu şekilde çözdüm:

---
# 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']}}"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.