호스트간에 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 키를 동적으로 생성
  • 그런 다음 delegate_to 를 사용 하여 슬레이브 에서 페치 모듈 을 실행 하고 ssh pubkey를 ansible을 실행하는 호스트로 페치 하고이 작업의 결과를 변수에 저장하여 가져온 파일의 실제 목록에 액세스 할 수 있습니다
  • 그 후 우리는 일반적으로 fetched ssh pubkeys (제공된 추가 pubkeys)를 authorized_keys 모듈을 사용 하여 마스터 노드에 푸시합니다 (위의 작업에서 변수에서 파일 경로를 파기 위해 두 개의 jinja2 필터를 사용합니다)
  • 마지막으로 ansible을 실행하는 호스트에 로컬로 캐시 된 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.