Phân phối khóa công khai ssh giữa các máy chủ


11

Tôi đang thiết lập một số máy có Ansible và cần bật mật khẩu ít kết nối giữa chúng. Tôi đã có một chủ cơ sở dữ liệu và một số nô lệ. Để sao chép ban đầu, các nô lệ cần phải ssh vào bản gốc và lấy một bản sao của cơ sở dữ liệu. Tôi không chắc cách tốt nhất để tự động thêm tất cả các khóa công khai nô lệ vào authorized_keystệp chủ .

Tôi đã nghĩ về việc cung cấp các khóa công khai nô lệ dưới dạng các biến và sau đó thêm chúng thông qua authorized_keymô-đun. Nhưng sau đó tôi phải duy trì danh sách các khóa. Tôi đang tìm kiếm một cách tiếp cận trong đó tôi chỉ cần thêm một máy chủ khác vào nhóm nô lệ và phần còn lại sẽ hoạt động tự động.

Có ý kiến ​​gì không?

Cập nhật:

Cho đến nay tôi đã nhận được mã giả sau đây:

# 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

Vòng lặp {% %}chỉ hoạt động trong các tệp mẫu chứ không phải trong playbooks trực tiếp. Bất kỳ cách nào để làm điều này trong playbook của tôi?

Câu trả lời:


5

Tôi đã đưa ra một giải pháp phù hợp với tôi. Tôi tạo các khóa chung / riêng trên máy của mình từ nơi Ansible đang chạy và trên kết nối đầu tiên tôi đặt các khóa vào vị trí.

Sau đó, tôi thêm các khóa từ tất cả các nô lệ vào chủ với những điều sau đây:

# 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

Toàn bộ playbook có thể được tìm thấy trên github.com/soupdiver/ansible-cluster .


5

Tôi tin rằng giải pháp sau đây sẽ làm việc trong trường hợp của bạn. Tôi đã sử dụng nó cho một kịch bản tương tự với một máy chủ sao lưu trung tâm và nhiều máy khách dự phòng.

Tôi có một vai trò (giả sử " db numplication_master ") được liên kết với máy chủ nhận các kết nối:

    - 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

Sau đó, chúng tôi tạo các tác vụ thực tế trong vai trò db numplication_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

Vì vậy, về cơ bản chúng tôi:

  • tự động tạo ssh-key trên những nô lệ vẫn không có chúng
  • sau đó chúng tôi đang sử dụng ủy nhiệm_to để chạy mô-đun tìm nạp trên các nô lệ và tìm các pubkey ssh của họ cho máy chủ đang chạy ansible, đồng thời lưu kết quả của thao tác này vào một biến để chúng tôi có thể truy cập danh sách các tệp được tìm nạp thực tế
  • sau đó, chúng tôi thường tiến hành đẩy các pubkey ssh đã tìm nạp (cộng với bất kỳ pubkey bổ sung nào được cung cấp) đến nút chính với mô-đun ủy quyền (chúng tôi sử dụng một vài bộ lọc jinja2 để khai thác các filepath từ biến trong tác vụ ở trên)
  • cuối cùng chúng tôi loại bỏ các tệp pubkey được lưu trữ cục bộ tại máy chủ đang chạy ansible

Giới hạn của việc có cùng một người dùng trên tất cả các máy chủ có thể được khắc phục, nhưng từ những gì tôi nhận được từ câu hỏi của bạn, đó có lẽ không phải là vấn đề đối với bạn (nó phù hợp hơn với kịch bản sao lưu của tôi). Tất nhiên bạn cũng có thể làm cho loại khóa (rsa, dsa, ecdsa, v.v.) có thể cấu hình được.

Cập nhật : rất tiếc, ban đầu tôi được viết bằng thuật ngữ cụ thể cho vấn đề của tôi , không phải của bạn! Nên có ý nghĩa hơn bây giờ.


0

Tôi đã có cùng một vấn đề, và tôi đã giải quyết nó theo cách này:

---
# 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']}}"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.