インフラ

効率よく公開鍵を配布する方法 Ansibleで複数のサーバとユーザに公開鍵を登録する

複数のユーザを作成して、それぞれ公開鍵を配置したい時がたまにあります。
sshして公開鍵を置くのは、面倒です。1台とかだったらいいかもしれませんが、10台・20台とかだとミスが怖いです。
今回はその作業を、Ansibleで自動化して楽に配布します。

Contents

今回のゴール

hostsサーバからSlaveサーバのそれぞれのユーザに、公開鍵認証で接続できるようにします。
   
ansibleの図

環境構築

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で実行する必要があります。

Amazonで「Ansible」の本をみてみる!!

【Ansible】playbookを分割してユーザ作成・グループ作成をする以前、ユーザの作成をやってみたのですが、今回はplaybookを分けてやってみます。 playbookを分けると、再利用性や可読性が高...
[Ansible入門]俺でもできた!Vagrantを使ってAnsible環境を作る(MAC・Windows)VagrantでAnsible練習用の環境を作ります。Mac向けの手順となっていますが、Windowsでもできるよう注釈を入れています。...
現役インフラエンジニアが選ぶUdemyインフラ系のおすすめコース3選動画学習プラットフォームUdemyのインフラ系おすすめコースを厳選しました。どのコースも基礎から学べるので、インフラ経験が浅い人にもおすすめです。...