複数のユーザを作成して、それぞれ公開鍵を配置したい時がたまにあります。
sshして公開鍵を置くのは、面倒です。1台とかだったらいいかもしれませんが、10台・20台とかだとミスが怖いです。
今回はその作業を、Ansibleで自動化して楽に配布します。
今回のゴール
hostsサーバからSlaveサーバのそれぞれのユーザに、公開鍵認証で接続できるようにします。
環境構築
Vagrant上にをサーバを2台立てます。
AnsibleはVagrantのサーバ(host)にインストールします。
Vagrant上でAnsibleの環境構築する方法はこちら
事前準備
- 公開鍵をフォルダに置いておく。
- Ansibleを実行するユーザでアクセス可能であること
それぞれのユーザの「.ssh」ディレクトリから公開鍵を指定できればいいのですが、rootでansibleを実行する必要がありそうでした。
今回は、vagrantユーザでansibleを実行しています。
参考
フォルダ構造はこんな感じ
publickey/
├ user1/
│ └ id_rsa.pub/
├ user2/
│ └ id_rsa.pub/
├ user3/
└ id_rsa.pub/
playbook
グループを作成する
- name: add a admin group
group: name=admin state=present
シンプルにユーザが所属するグループ「admin」を作成しています。
ユーザを追加する
- name: add a new user
user:
name: "{{ item.name }}"
uid: "{{ item.uid}}"
password: "{{ item.password | password_hash('sha512') }}"
group: admin
groups: wheel
state: present
with_items:
- "{{ users }}"
先ほど作成したグループに所属するユーザを作成しています。
with_itemsを使うことで繰り返しができます。ユーザ名等は「var.yaml」から取ってきています。
例えば、「item.name」だと「var.yaml」の「hoge1」「hoge2」「hoge3」「hoge4」をさします。
ディレクトリを作成する
- name: mkdir .ssh
file:
path: /home/{{ item.name }}/.ssh/
state: directory
owner: "{{ item.name }}"
group: admin
mode: 0700
with_items:
- "{{ users }}"
公開鍵を置くためのディレクトリ、「./ssh」を作成します。
余談ですが、ディレクトリの作成にfileモジュールを使うこと最近知りました。
ローカルから公開鍵を配布する
- name: add authorized_key
authorized_key:
user: "{{ item.name }}"
key: "{{ lookup('file', '/home/vagrant/ansible/ansible_useradd/publickey/{{ item.name }}/id_rsa.pub') }}"
with_items:
- "{{ users }}"
公開鍵の登録を行なっています。
公開鍵の登録にはauthorized_keyモジュールを使います。
ユーザとローカル(ansibleの実行元)の公開鍵がある場所を指定すると、「.ssh/」の下に「authorized_keys」を作成してくれます。
まとめ
公開鍵の配布をAnsibleで簡単にできます。複数のサーバに複数のユーザの公開鍵を登録したいときに役に立ちそうです。
ただ、配布する公開鍵を1箇所に置くかrootで実行する必要があります。