मेजबानों के बीच ssh सार्वजनिक कुंजी वितरित करें


11

मैं 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

{% %}केवल टेम्प्लेट फ़ाइलों में लूप काम करता है और सीधे प्लेबुक में नहीं। मेरी प्लेबुक में ऐसा करने का कोई तरीका?

जवाबों:


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- कीज़ बनाना जो अभी भी उनके पास नहीं हैं
  • फिर हम गुलामों पर लाने के लिए प्रतिनिधि मॉड्यूल का उपयोग कर रहे हैं और अपने ssh pubkeys को मेजबान को चलाने के लिए ansible चला रहे हैं, इस ऑपरेशन के परिणाम को एक चर में सहेज रहे हैं ताकि हम प्राप्त फ़ाइलों की वास्तविक सूची तक पहुंच सकें
  • उसके बाद हम सामान्य रूप से अधिकृत एसआईके मॉड्यूल के साथ मास्टर नोड में भ्रूण 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.