[Ansible #02] Playbookを書いてみる

[Ansible #02] Playbookを書いてみる

こんにちは、NDです。

最近、いわゆる「3日間で3GB」制限にハマってしまいストレスフルであります。

さて、弊社(株式会社オープントーン)では本社の拡張移転も完了し、おかげさまで社員数も増加の一途をたどっております。
社員増加は嬉しい半面、会社の管理として手間も増えるため手放しには喜ばません。
まさに嬉しい悲鳴といったところでしょうか。

そのような会社で、サーバ管理者を兼務しております筆者にも火の粉が降りかかり、炎上寸前です。
サーバ管理者として新入社員が入ってきた際に行う業務は、主にアカウント管理です。
新入社員が滞りなく仕事に入れるように各種アカウントの追加や必要な権限の付与を行うわけです。

弊社では専任のサーバ管理者がいるわけではないので、忙しい通常業務の合間を縫ってサーバ運用に勤しんでおります。
そこでサーバ管理チームでは、「少しでも楽をしよう」をモットーに自動化などに取り組んでいます。
※実際にはそんなモットーはありません。

ながながと愚痴のような前置きをしてしまいました。
そんなわけで筆者もサーバ管理者として、楽をすべく自動化に励みました。
今回は無理やりAnsibleをつかって楽をしようとした軌跡です。

■Playbookとは

前回もチラッと話しに出ましたが「Playbook」について説明します。
前回のAnsible記事については、こちらを参照してください。

Playbookとは、Ansibleで使用できるモジュールをつらつらと記述したものです。
そのモジュールの組み合わせによって、管理対象サーバの構成を表すことができます。

ここで肝心なのは、Playbookのなかに記述することは「冪等性」があるということです。
したがって、Playbookを何度実行しようともサーバの状態を表しているだけなので、変化はありません。

冪等性について詳しく説明しませんが、最後まで読んでいただくと分かるかもしれませんし、分からないかもしれません。

結局のところPlaybookは、Chefで言うところの「レシピ」だと思ってください。

■環境構築

今回もVagrantで複数サーバ構成を再現し、Playbookの簡単な記述方法を試してみます。
Vagrantについては、こちらの記事を参照してください。

今回のゴール(Playbookでやること)
  • 新入社員の「foobar」さんが会社の「WIKI」と「SVN」を見れるようになること
    ≒ 各サーバのhtpasswdファイルにfoobarさんの「ユーザー名」と「パスワード」を追記する。

さて、まずは下図のような構成をVagrantで用意しましょう。

構成図の説明
  • Ansibleをインストールして、管理するサーバの「host」があります。
  • 管理されるサーバ(管理対象サーバ)の「wiki」と「svn」があります。
  • 会社のWIKIはwikiサーバに、SVNはsvnサーバにのっています。
  • 新入社員の「foobar」さんがいます。(この人は用意しなくてもいいです。)
  • サーバのOSはすべて「CentOS 6.5」としています。
  • hostから各管理対象サーバへは、SSHでログインできる状態です。
構築ポイント
  • WIKIとSVNを見るためには、ベーシック認証をとおること
  • ベーシック認証用のhtpasswdファイルは、それぞれ「/var/www/.htpasswd」に配置されていること
  • 検証用として管理対象サーバにそれぞれ「Webサーバ」をたてておくこと
  • 各サーバのPythonには「passlib」ライブラリが入っていること

※ちなみに今回は確認用にWebサーバ(Apache)をたてていますが、htpasswdファイルへの書き込みが確認できればWebサーバは必要ありません。

では環境構築ができたので、次へ進みましょう!

■Inventoryをつくる

前回と同様、Inventoryファイルを作成します。

[bash]
[vagrant@host ~]$ vi hosts.ini
[/bash]

今回は「wiki」と「svn」でグループを分けました。

[bash]
[wiki]
192.168.33.11

[svn]
192.168.33.12
[/bash]

■Playbookをつくる

さて、今回のメインとなるPlaybookをつくる部分です。

Inventoryファイルと同様に、Ansibleコマンド実行時にPlaybookファイルを指定するので「適当な場所に適当なファイル名」でつくりましょう。

[bash]
[vagrant@host ~]$ vi htpasswd-add.yml
[/bash]

PlaybookはYAML形式で記述するため、拡張子も「.yml」としています。
作成したファイルをいったん見ていただきましょう。

[bash]
---
- hosts: all
  sudo: yes
  tasks:
    - name: add htpasswd
      htpasswd: create=no name=foobar password=hogehoge path=/var/www/.htpasswd state=present
[/bash]

※先頭のハイフン3つは、YAMLファイルであることを表しています。

Playbookの中身を詳しくみていきます。

hostsInventoryファイルで記述したグループを指定します。
ここで指定したグループが処理対象となります。
今回はすべて対象とするので「all」を指定します。
sudosudoをつかって実行するか指定します。
tasksモジュールをつかって実行したいタスクを列挙します。
 name必須ではありませんがタスクの名前を任意で記述します。
 htpasswd今回はhtpasswdファイルに追記したいので、htpasswdというモジュールをつかいます。
モジュール名とコマンド名は必ずしも一致しないので、公式ドキュメントを参照してください。

上記のPlaybookでも実行できますが、Playbookの中で変数をつかうこともできます。
以下のように波括弧で括ることで変数とすることができ、「vars」で値を指定します。

[bash]
---
- hosts: all
  sudo: yes
  vars:
    name: foobar
    password: hogehoge
  tasks:
    - name: add htpasswd
      htpasswd: create=no name={{name}} password={{password}} path=/var/www/.htpasswd state=present
[/bash]

ただし、これでは次の新入社員が入ってきた場合にPlaybookを書き直す必要があります。
それにパスワードが記述されているのも気持ちが悪いです。

なので、実行時にユーザー名とパスワードを聞かれるようにしましょう。

[bash]
---
- hosts: all
  sudo: yes
  vars_prompt:
    name: "Enter Newcomer Name"
    password: "Enter Newcomer Password"
  tasks:
    - name: add htpasswd
      htpasswd: create=no name={{name}} password={{password}} path=/var/www/.htpasswd state=present
[/bash]

「vars_prompt」の中に変数名とプロンプトに表示する文字を記述するだけでOKです。

これでPlaybookの完成!

■Playbookの実行

Playbookを実行するには「ansible-playbook」コマンドを使用します。

[bash]
[vagrant@host ~]$ ansible-playbook htpasswd-add.yml -i hosts.ini
[/bash]

ansible-playbookコマンドの後にPlaybookファイルと、前回同様にInventoryファイルを指定します。
実行するとプロンプトで、ユーザー名とパスワードが聞かれます。
(なぜかパスワードの方から聞かれるんですが…これはおいおい調べてみます。)

[bash]
Enter Newcomer Password: : hogehoge
Enter Newcomer Name: : foobar
[/bash]

実行結果が以下です。

[bash]
PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.33.11]
ok: [192.168.33.12]

TASK: [add htpasswd] **********************************************************
changed: [192.168.33.11]
changed: [192.168.33.12]

PLAY RECAP ********************************************************************
192.168.33.11 : ok=2 changed=1 unreachable=0 failed=0
192.168.33.12 : ok=2 changed=1 unreachable=0 failed=0
[/bash]

何かが変わったことを示すように「changed=1」になっているのが分かると思います。

■確認

新入社員がWIKIとSVNを見れるようになったのか、確認します。

管理対象サーバのhtpasswdファイルを見ればいいのですが、せっかくWebサーバをたてたのでブラウザでアクセスしてみます。

foobarさんはベーシック認証をパスできましたでしょうか?

■さいごに

Playbookの記述方法はそんなに難しくなかったと思います。

それよりもAnsibleでつかえるモジュールを調べたりするほうが難だと思います。
ドキュメントが英語ですからねー。

今回は一つのタスクで、一つのモジュールしかつかいませんでした。
しかし、これらを組み合わせることで複雑な処理もできることを理解されたと思います。

筆者もPlaybookをつかって、サーバ管理者業務をもっと楽にしていきたいです。

ではでは。