แจกจ่ายคีย์สาธารณะ 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

การวนซ้ำกับการ{% %}ทำงานเฉพาะในไฟล์เทมเพลตและไม่อยู่ใน playbooks โดยตรง มีวิธีใดบ้างที่จะทำสิ่งนี้ใน playbook ของฉัน?

คำตอบ:


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

PlayBook ทั้งสามารถพบได้บน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-keys แบบไดนามิกบนทาสเหล่านั้นที่ยังไม่มีอยู่
  • จากนั้นเรากำลังใช้delegate_toเพื่อเรียกใช้โมดูลfetchบนทาสและดึง ssh pubkeys ของพวกเขาไปยังโฮสต์ที่ใช้งานได้และบันทึกผลลัพธ์ของการดำเนินการนี้ในตัวแปรเพื่อให้เราสามารถเข้าถึงรายการไฟล์ที่ดึงมาจริง
  • หลังจากนั้นเราจะดำเนินการผลักดัน ssh pubkeys (รวมถึง pubkeys พิเศษใด ๆ ที่จัดให้) ตามปกติไปยังโหนดหลักที่มีโมดูลauthorized_keys (เราใช้ตัวกรอง jinja2 สองตัวเพื่อขุด filepaths จากตัวแปรในงานด้านบน)
  • ในที่สุดเราก็ลบไฟล์ pubkey ที่แคชในเครื่องที่โฮสต์ที่ใช้งานได้

ข้อ จำกัด ของการมีผู้ใช้เดียวกันในโฮสต์ทั้งหมดอาจจะสามารถแก้ไขได้ แต่จากสิ่งที่ฉันได้รับจากคำถามของคุณนั่นอาจไม่ใช่ปัญหาสำหรับคุณ (มันเกี่ยวข้องกับสถานการณ์การสำรองข้อมูลของฉันเล็กน้อย) แน่นอนคุณสามารถกำหนดประเภทคีย์ (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']}}"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.