AnsibleでnginxにBasic認証を実装してみる【実践記録7】

実践記録7

前回までVagrantを用いて環境構築をしていましたが、今回はAnsibleを使用してみたいと思います。
Ansibleを使うことでVagrantだけで構成するよりもより汎用的な構成管理を行うことを目指します。

前提

VirtualBoxとVagrantがインストールされていること。
インストール方法は以下の記事を参考

関連記事

実践記録1VirtualBoxをインストールしてローカル開発環境を構築してみたいと思います。AWSなどのクラウドサービスを使った方が最近は簡単に環境を準備できますが、まずは自分のPCに仮想環境を構築してみようと思います。[…]

関連記事

実践記録2実践記録1でVirtualBoxを使ってローカル開発環境を構築してみましたが、今回はVagrantという仮想環境構築ツールを使ってVirtualBox上に仮想マシンを構築してみようと思います。前提使用する環境にVi[…]

Ansibleのインストール

実践記録6で使用したVagrantfileを使用してAnsibleをインストールします。

関連記事

実践記録6実践記録5でAnsibleが使えるように複数サーバ間のSSH接続用の公開鍵認証設定を行いました。しかし手動での設定は無くしたいので、Vagrantfileを修正して公開鍵認証の設定を自動でできるようにしたいと思いま[…]

以下コマンドを実行して仮想マシンを作成することでAnsibleインストール済みの環境ができます。

vagrant up
demohost:Ansible導入サーバ
demoweb:Ansibleで構築されるサーバ

AnsibleでnginxにBasic認証を導入

早速使っていきたいと思います。
まずはAnsibleが各サーバを認識できるようにインベントリファイル(hostsファイル)を作成します。

/etc/ansible/hostsファイルを以下の様に修正します。

hostsファイルを編集したらとりあえず一回動かしてみたいと思います。
ansibleは以下のコマンドで指示を送ることができるようです。

ansible <実行対象> -m <モジュール>
実行対象は全てのサーバであれば「all」、特定のサーバに向けて実行であればhostsファイルに定義した内容(今回でいうhostとweb)でできるようです。
「-m」はモジュールを指定する為に付けます。そういうものだと思っておきましょう。
モジュールとはAnsibleに指示を送る為の専用コマンドの様なものです。
以下のリンク先にモジュールの一覧がありますが、とても常人には覚えられる量ではありません。
ひとまず、なじみ深いpingをうってみます。

無事に動きました。

Ansibleではこの様に直接コマンドを入力して処理を実行することもできますが、
playbookというものを使ってまとめて処理を行うことができます。

playbookを使ってwebサーバにnginxを導入しつつ、Basic認証をかけてみたいと思います。(認証はやってみたいからやるだけです)
既にVagrantfileでnginxは導入してしまっているので、Ansibleの冪等性の確認もしてみたいと思います。

冪等性とは「何度実行しても同じ結果が得られる性質」のことだそうです。

今回でいえば、nginxが導入されてなければ導入するし、
導入されていれば何もしない。

何度実行しても結果として導入されている状態になるという事です。

ではここからは作業に入っていきます。
Basic認証をかけない状態でアクセスすると以下の様になります。

とりあえず見よう見まねでplaybookを作成しました。(後ほど内容載せます。)
実行する前に以下のコマンドでplaybookの構文エラーがないか確認してくれるようです。

ansible-playbook <作成したplaybookファイル名> –syntax-check
はい、なんか怒られました。。。
調べてみるとざっくりですがYAMLファイルでは以下の考慮が必要なようです。
・ハイフンの後ろは一つ空白を入れる
・コロンの後ろも一つ空白を入れる
・タブは使用不可
・インデントは半角2つで正確に
というわけで、上記注意点踏まえて修正したplaybookが以下です。
※最初に載せなかったのはあまりに修正点多かったからです(笑)
ざっくり説明すると、

hosts:処理対象
become:sudoで実行するか
vars:変数
tasks:処理内容
handlers:tasks内のnotifyに連動して呼び出される処理

です。

Basic認証を実装するためにhtpasswdをインストールする必要がありますが、
htpasswdを使用する為にはpasslibが必要となるのでそちらも合わせてインストールするようにしています。

またBasic認証用の設定を定義したnginx.confファイルを配置する為に、templateモジュール(ファイルの置き換え用モジュール)を使用しています。

そのため、Vagrantfileでdemohostサーバのフォルダと同期させているホストOSのフォルダにnginx.confファイルを配置しています。
※「server.vm.synced_folder」で定義しているフォルダのことです。

nginx.confファイルはデフォルトの状態から以下のlocation設定内に2行追加したのみです。
※本当は設定を入れ込む様にしたかったのですが上手くできなかったので一旦これで。。。

これで完璧のはず!
以下のコマンドで実行します。

ansible-playbook <作成したplaybookファイル名>
はい、エラーです。。。
どうやらpasslibは普通にyumでインストールしてはいけないようです。
調べてみるとyumの代わりにpipというコマンドを使うそうです。
そしてそのpipコマンドを使用する為には「python-pip」をインストールする必要があるようなのでその設定も追加
playbookを修正して、3度目の正直で行きます!

じゃん!

完璧ですね。
Ansibleには冪等性があるので既にVagrantfileで導入済みのnginxのインストールタスクはステータスが「OK」となっています。
すなわちインストール済みですよってことですね。

それ以降のタスクについてはインストールをしたり、ファイルを置き換えたりして状態が変わっているので「changed」のステータスになっています。

Basic認証が導入できているかテストしてみます。

こちらもばっちりですね。

普通にアクセスしようとすると401エラー(認証エラー)になっており、
認証情報を渡すとアクセスに成功しています!!

ちなみにもう一度playbookを実行すると以下の様になります。

全て導入済みの設定なのでステータスは「OK」となり、変化なしです。
その場合handlerは実行されないようです。

vagrant up実行時点でこの状態までもっていきたいですね。

長くなってきたので今回はここまでにします。

続きは以下の記事となります!

関連記事

実践記録8実践記録7でAnsibleを使ってnginxにBasic認証を導入してみました。しかしAnsibleの実行など一部手作業が含まれている状態でしたので、vagrant upを実行すれば処理が一括で進むようVagran[…]