web-dev-qa-db-ja.com

複数のキーで排他的にAnsibleauthorized_keyを使用することは可能ですか?

私はAnsibleの使用にかなり慣れておらず、 here とgoogleを読んでいますが、まだ答えが見つかりません。

私のシナリオでは、サーバー上に1人のユーザーがいますが、authorized_keysファイルに入れる必要のある2〜3個の異なるpubキーがあります。

このスクリプトを使用して、すべてのキーを正常に削除するか、すべてのキーを追加できます。

---
  - hosts: all

 tasks:
  - name: update SSH keys
    authorized_key:
     user: <user>
     key: "{{ lookup('file', item) }}"
     state: present
     #exclusive: yes
    with_fileglob:
      - ../files/pub_keys/*.pub

presentフラグを使用して、すべてのキーを読み取り、追加します。 absentフラグを使用すると、リストされているすべてのキーが削除されます。

問題は、サーバー上にのみ存在する古いキーがあり、それを削除/上書きしたいのですが、将来の展開のために、サーバー上にあり、プレイブックにはない可能性のある無許可のキーを上書きすることです。

exclusiveフラグを使用すると、最後のキーのみを取得して追加します。これは、ループしてすべてのキーを再帰的に追加する場合に最適です。 Ansibleでこれを行う方法がある場合、私はそれを見つけていません。

Pubファイルをループしてexclusiveオプションを同時に使用する方法はありますか?

13
Valien

pubファイルをループし、同時に排他的オプションを使用する方法はありますか?

いいえ。ループと排他についての注意が docs にあります:

exclusive:authorized_keysファイルから他のすべての指定されていないキーを削除するかどうか。複数のキーは、改行で区切ることにより、単一のキー文字列値で指定できます。このオプションはループを認識しないため、with_を使用すると、ループの反復ごとに排他的になります。ファイルに複数のキーが必要な場合は、上記のようにすべてを1つのバッチでキーに渡す必要があります。

したがって、すべてのキーを結合して、一度にすべてを送信する必要があります。
このようなもの:

- name: update SSH keys
  authorized_key:
    user: <user>
    key: "{{ lookup('pipe','cat ../files/pub_keys/*.pub') }}"
    state: present
    exclusive: yes

本番環境で実行する前にこのコードを確認してください!

14

pipeルックアップを回避したい場合(たとえば、パスがロールに相対的でないため)、fileルックアップとfileglobルックアップを組み合わせて使用​​することもできます。

- name: update SSH keys
  authorized_key:
    user: <user>
    key:  "{% for key in lookup('fileglob', 'pub_keys/*.pub').split(',') %}{{ lookup('file', key) ~ '\n'}}{% endfor %}"
    state: present
    exclusive: yes
4
morxa

ユーザーを変数内に保持する場合は、次のように使用できます。

---

- hosts: all
  vars_files:
    - roles/users/vars/main.yml
  tasks:
    - name: Allow other users to login to the account
      authorized_key:
        user: user_name
        exclusive: yes
        key: "{{ developers|map(attribute='publish_ssh_key')|join('\n') }}"

roles/users/vars/main.ymlは次のようになります:

---

developers:
  - name: user1
    publish_ssh_key: ssh-rsa AAAA...
  - name: user2
    publish_ssh_key: ssh-rsa AAAA...
2
czerasz

この別の回答で書いたように( Ansible-複数のユーザーとロールの複数のSSHキーを管理する )これが私のユースケースでこの問題を解決した方法です。おそらくここで便利ですか?

変数内のファイル名の配列をuser-accountロールに渡します。次に、ロールはこれらの各ファイルの内容を取得し、それらを改行で区切られた文字列に追加し、最後にこの値を新しいユーザーのsshキーに設定します。

プレイブックファイル:

- hosts: aws-node1
  roles:
    - { role: user-account, username: 'developer1', ssh_public_keyfiles: ['peter-sshkey.pub', 'paul-sshkey.pub'] }

user-accountのロール定義:

- name: add user
  user:
    name: "{{username}}"


- name: lookup ssh pubkeys from keyfiles and create ssh_pubkeys_list
  set_fact:
    ssh_pubkeys_list: "{{ lookup('file', item) }}"
  with_items:
    "{{ssh_public_keyfiles}}"
  register: ssh_pubkeys_results_list


- name: iterate over ssh_pubkeys_list and join into a string
  set_fact:
    ssh_pubkeys_string: "{{ ssh_pubkeys_results_list.results | map(attribute='ansible_facts.ssh_pubkeys_list') | list | join('\n') }}"


- name: update SSH authorized_keys for user {{ username }} with contents of ssh_pubkeys_string
  authorized_key:
    user: "{{ username }}"
    key: "{{ ssh_pubkeys_string }}"
    state: present
    exclusive: yes
0
DrGecko