ホスト間でSSH公開鍵を配布する


11

私はAnsibleでいくつかのマシンをセットアップしていて、それらの間のパスワードレス接続を有効にする必要があります。データベースマスターといくつかのスレーブがあります。最初のレプリケーションでは、スレーブはマスターにSSHで接続し、データベースのコピーを取得する必要があります。すべてのスレーブの公開鍵をマスターauthorized_keysファイルに動的に追加するための最良の方法は何ですか。

スレーブの公開鍵を変数として提供し、authorized_keyモジュールを介してそれらを追加することをすでに考えました。しかし、私はキーのリストを維持する必要があります。スレーブグループをもう1つホストに追加するだけで、残りのホストが自動的に機能するアプローチを探しています。

何か案は?

更新:

これまでのところ、私は次の擬似コードを取得しました:

# 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を実行しているホストにフェッチします。また、この操作の結果を変数に保存して、フェッチされたファイルの実際のリストにアクセスできるようにします
  • その後、通常はフェッチされた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.