Ansible でユーザの作成(公開鍵認証 + sudo権限付与)

2016年7月13日  カテゴリー:Linux  タグ: ,
Pocket
LINEで送る

前回「Ansible のインストールと管理対象サーバへの接続設定メモ」の記事では、root ユーザ+パスワード認証でAnsibleを実行しましたが、「rootユーザでのリモートログイン」や「パスワード認証」は、セキュリティポリシーで禁止されている場合もあるかと思います。そこで今回は、Ansibleで、Ansible実行用のユーザを作成し、SSH公開鍵の登録とsudo権限を付与する Playbook を作成してみました。

Playbook と YAMLフォーマット

Ansibleでは、構成手順が書かれたファイルを「Playbook(プレイブック)」と呼び、Playbookは、構造化されたデータを表現するための YMAL(「ヤムル」と読むことが多いようです)というフォーマットで書きます。そのため、Playbookの拡張子は「.yml」になります。

YAMLは、「人に読みやすい」ことを目指して開発されているため、データ構造をインデントを使って表現するのが特徴です。YAMLは構文チェックをしっかりやってくれるので、以下の点に気をつけると良いでしょう。

  • インデントの縦を合わせる(インデント幅は慣習的にスペース2つ)
  • キーと値の区切り文字「:」の後ろは必ず空ける(× name:foo、○ name: foo)
  • 構文エラーになる場合は、クォートしてみる

YAML Syntax | Ansible Documentation
YAML Ain’t Markup Language (YAML™) Version 1.1

SSH鍵ペアの作成

下準備として、Ansible管理ホストでSSH鍵ペアを生成します。この鍵ペアのうちSSH公開鍵(id_rsa.pub)を、Ansibleで管理対象サーバに登録します。

ssh-keygen
(略)
Generating public/private rsa key pair.
Enter file in which to save the key (/home/foo/.ssh/id_rsa): <空エンター>
Created directory '/home/foo/.ssh'.
Enter passphrase (empty for no passphrase): <パスフレーズ>
Enter same passphrase again: <パスフレーズ>
(略)

ユーザ追加 Playbook の作成

管理対象サーバに、Linuxユーザを追加するための Playbook を作成します。

処理対象ホストの指定

vi /etc/ansible/adduser-ansible.yml

---
 YAMLフォーマットのファイルは、慣習的に「---」(ハイフン3つ)から始めます。

- hosts:
 処理対象のホストを指定します。ホストのIPアドレスまたはFQDNが、インベントリファイル「/etc/ansible/hosts」に、記載されている必要があります。

tasks:
 この下に実行したいタスク(処理)を書いていきます。

Intro to Playbooks | Ansible Documentation

 

ユーザの作成

- name:
 タスクの簡単な説明を書きます。(これはどのタスクでも共通です)

user:
 userモジュールを使って、ユーザを作成します。

name=
 ユーザ名を指定。今回は、ユーザ名を ansible としましたが、なんでも構いません。

uid=
 UIDを指定(任意です)多数のサーバを管理する場合は指定することをオススメします。これを指定しない場合、サーバAのfooユーザのUIDは「1002」、でもサーバBのfooユーザのUIDは「1003」ということが起こりえます。

 

ユーザの作成(パスワードを設定する場合)

今回は、公開鍵認証を使うため、上の例ではパスワードを指定していませんが、パスワード認証を使う場合は、ハッシュ化したパスワードを「password」オプションに指定します。

Pythonのパスワードハッシュ化ライブラリをインストールします。

yum -y install python-passlib

一行で書くと長くなるので、マッピング構造(連想配列のようなもの)で書きました。

 

SSH公開鍵の登録

authorized_key:
 authorized_keyモジュールを使って、SSH公開鍵を登録します。

user:
 ここで指定した管理対象サーバ上のユーザ(今回の場合は ansible)の authorized_keys ファイルにSSH公開鍵を登録します。

key:
 登録するSSH公開鍵を指定します。「lookup('file', '/home/foo/.ssh/id_rsa.pub')」は「cat /home/foo/.ssh/id_rsa.pub」と同義です。

 

sudo 権限の付与

lineinfile:
 lineinfileモジュールを使って、sudoersファイルを編集します。

dest:
 編集するファイルのパスを指定

backup:
 yes を指定すると、編集前のファイルをバックアップしてくれます。

line:
 追記する文字列を指定します。

 

完成した Playbook

以上でPlaybookの完成です。まとめると下記のようになります。

vi /etc/ansible/adduser-ansible.yml

 

Playbook の動作テスト

作成した Playbook が正しく動作するかテストしてみます。

構文チェック

Playbook を「--syntax-check」オプションを指定して実行します。なにもエラーが表示されなければOKです。

cd /etc/ansible/
ansible-playbook adduser-ansible.yml --syntax-check
 
playbook: adduser-ansible.yml

構文に誤りがある場合は、以下のようなエラーが表示されます。(下の場合はインデントがズレているため構文エラーになっています)

 

Dry Run(ドライラン)

Playbook を「--check(または -C)」オプションを付けて実行すると、実際には変更を加えない「Dry Run」モードで動作します。ただし、今回作成したPlaybookのように、前後のタスクに依存関係がある場合はエラーになります。

ansible-playbook adduser-ansible.yml -u root -k --check

実際にはansibleユーザが作成されていないため、SSH公開鍵が登録できずエラーになっています。

Check Mode (“Dry Run”) | Ansible Documentation

Playbook の実行

いよいよ作成した Playbook の実行です。

ansible-playbook adduser-ansible.yml -u root -k

-u SSH接続に使うユーザを指定
-k 接続パスワードの入力を求める

以下のような表示であれば成功です。

 
作成したユーザで、管理対象サーバに接続できることが確認できると思います。

ansible 172.16.1.111 -m ping -u ansible
Enter passphrase for key '/home/foo/.ssh/id_rsa':<パスフレーズ>
 
172.16.1.111 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

終わりに

次回は、Ansible で Playbook を分割してモジュール化する仕組み「Roles」についてまとめてみたいと思います。

スポンサーリンク
Pocket
LINEで送る

Ansible でユーザの作成(公開鍵認証 + sudo権限付与)」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です