私は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
オプションを同時に使用する方法はありますか?
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
本番環境で実行する前にこのコードを確認してください!
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
ユーザーを変数内に保持する場合は、次のように使用できます。
---
- 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...
この別の回答で書いたように( 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