私は数週間Ansibleプレイブックを開発してきました。そのため、そのような技術での私の経験は比較的短いです。私の戦略の一部には、カスタムansible_ssh_user
ただし、インベントリ全体でホストをプロビジョニングするには、そのようなユーザーは独自のSSHキーペアを必要とします。これには、対応する秘密キーを保持/保存するための何らかのプランが含まれます。実稼働環境では、このプレイブックは複製/プルされ、特定のplaybook node内で実行されます。その役割は、インフラストラクチャの残りをプロビジョニングすることです。
最初は、その秘密鍵をPlaybookのgitリポジトリ内に置くことを考えていましたが、それでも、主にやや明白なセキュリティ上の理由とその周りの常識のために、私はそれについて再考しています。本件。
これがテーブルに設定されている場合、次の質問があります。
SSH秘密鍵を含め、あらゆる種類のプレーンテキストの秘密をリビジョン管理に保存するのは悪い考えです。代わりに、ansible-vaultを使用して秘密鍵を保存します。
ansible-vault
は、任意のファイルタイプで操作できます。ファイルを暗号化するだけです
ansible-vault encrypt /path/to/local/private_key
次に、キーをインストールします。
- name: Install a private SSH key
vars:
source_key: /path/to/local/private_key
dest_key: /path/to/remote/private_key
tasks:
- name: Ensure .ssh directory exists.
file:
dest: "{{ dest_key | dirname }}"
mode: 0700
owner: user
state: directory
- name: Install ssh key
copy:
src: "{{ source_key }}"
dest: "{{ dest_key }}"
mode: 0600
owner: user
Ansible-vaultの以前のバージョンは、varファイルで定義された変数でのみ動作するため、次のようなことをしなければなりませんでした。
ssh_key: |
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
key_file: /home/user/.ssh/id_rsa
Ansible-vaultで暗号化する:
ansible-vault encrypt /path/to/var_file
キーをインストールします。
- name: Ensure .ssh directory exists.
file:
dest: "{{ key_file | dirname }}"
mode: 0700
owner: user
state: directory
- name: Install ssh key
copy:
content: "{{ ssh_key }}"
dest: "{{ key_file }}"
mode: 0600
owner: user
コメントで回答を改善してくれた以下の方々に感謝します。
ゼロからプロビジョニングするため、generateplaybook nodeの秘密/公開キーペアを使用し、authorized_keys
モジュールを介して公開キーを配布する必要があります。これにより、必要なホスト以外の場所に秘密を保存する必要がなくなります。 playbook nodeで実行されるこれを実現するためのプレイブックを次に示します。
---
- hosts: 127.0.0.1
Sudo: yes
gather_facts: no
tasks:
- name: create ansible_ssh_user locally
user: name=ansible_ssh_user generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa
- name: copy the generated public key to an accessible location for the next play
Shell: cp ~ansible_ssh_user/.ssh/id_rsa.pub /tmp/ansible_ssh_user.pub
- hosts: all
Sudo: yes
gather_facts: no
tasks:
- name: create ansible_ssh_user
user: name=ansible_ssh_user groups=group1,group2
- name: Add RSA public key to the remote Host
authorized_key: user=ansible_ssh_user key="{{ lookup('file', '/tmp/ansible_ssh_user.pub') }}"
- hosts: 127.0.0.1
Sudo: yes
gather_facts: no
tasks:
- name: remove public key from /tmp
Shell: rm /tmp/ansible_ssh_user.pub
...