Windows上でansible_localプロビジョナーを使ってみた (Vagrant + Ansibleで環境構築の自動化)

Vagrant + VirtualBoxでWindows上に仮想マシンを構築するところまでを、[こちら](http://qiita.com/ozawan/items/160728f7c6b10c73b97e) で紹介しました。
今回はAnsibleと連携して、CentOS6.7の初期設定の自動化をするところまで書きたいと思います。
(まとめる時間があまり無いので色々と端折ります)

検証環境は以下です。(2016-03-29時点での最新)

| ソフトウェア名 | バージョン |
|---------------|-----------|
| Windows       | 7 (64bit) |
| Vagrant       | 1.8.1     |
| VirtualBox    | 5.0.16    |
| Ansible       | 1.9.4     |

※Windowsユーザーで、Cygwinとか面倒だなーって人向けです。


# **Ansibleってなに？**

簡単に言うと、すんごいシンプルな構成管理ツールです。
エージェントレス(SSH接続できればOK)で、シンプルな定義ファイル(YAML, ini形式)が特徴。
ChefやPuppetなど競合の構成管理ツールよりは、とっつきやすいと言われてます。
僕も初めて使ってみましたが理解しやすかったです。

概要をまとめてくれている方がいるので、リンクを貼らせていただきます。

- [Ansibleをはじめる人に。](http://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c)
- [Ansible 入門](http://qiita.com/ArimaRyunosuke/items/1f9d840311584d8160bc)
- [AnsibleによるInfrastructure as code入門](http://www.slideshare.net/kk_Ataka/ansibleinfrastructure-as-code)
- [Ansible ではじめるインフラのコード化入門](http://www.slideshare.net/akagisho/ansible-52618704)
- [入門Ansible](http://www.slideshare.net/takushimizu/ansible-26200860)


あと、[公式ドキュメント](http://docs.ansible.com/ansible/)がよく出来ています。
各モジュールの構文・オプションなどがしっかり書いてあり、例文も多いです。ここしか見ないって人も多いみたい。

日本語の書籍は少なくて今のところ [入門Ansible](http://www.amazon.co.jp/dp/B00MALTGDY) だけっぽいですが、4月末にオライリーの [初めてのAnsible](http://www.amazon.co.jp/dp/4873117658) が出るようです。


# **Vagrantと連携**

Ansible単体でも実行可能ですが、今回はAnsibleをVagrantのprovisionerに使って、「仮想マシン作成」→「システム初期設定」→「よく使うパッケージのインストール」までを自動化してみます。

Vagrantには、2つのAnsible用provisionerがあります。

| provisioner | サポートしたバージョン | 仕組み                                |
|--------------|:-------------------:|---------------------------------------|
|[ansible](https://www.vagrantup.com/docs/provisioning/ansible.html)       |1.7                  |**ホストOS**のAnsibleを使ってプロビジョニング|
|[ansible_local](https://www.vagrantup.com/docs/provisioning/ansible_local.html) |1.8                  |**ゲストOS**のAnsibleを使ってプロビジョニング|

ホストOSがWindowsだとAnsibleをインストールできないので、ansible_localを使います。(Cygwinを使えばできるっぽい)
ansible_localは、ゲストOSにAnsibleが入っていなければインストールして、ローカルコネクションでPlaybookを実行します。
なのでWindows環境に追加でインストールするものはありません。

※そもそもローカル開発環境を作るくらいなら、shellスクリプトで初期設定して、vagrant packageでパッケージングしたものを使い回せば良いのではという話もありますが、いつか本番環境をAnsibleで運用したり、チームで開発環境を揃えるということがあるかもしれないので使ってみました。


# **PlaybookとVagrantfile**

まだ全然作成途中ですが、今回作成したファイルは [こちら](https://github.com/ozawan/vagrant-ansible-centos67) に公開しました。ちょっとずつ更新する予定。

※Playbook作成段階でトライ＆エラーを繰り返すときは、Vagrantとは連携せず、Vagrantのsaharaプラグインのサンドボックスモードですぐにロールバックできる状態にして、Ansible単体でPlaybookを実行した方が効率的だと思います。(毎回仮想マシン作成するのは時間の無駄なので)

- サンドボックスモードON

```dummy:コマンドプロンプト
vagrant up
vagrant sandbox on
```
※仮想マシンを停止した状態でサンドボックスモードONにした方が高速と言われているけど、それをロールバックすると共有フォルダがマウントされないかも？なので起動した状態でサンドボックスモードONにします。

- Playbookを更新して、以下を実行

```dummy:仮想マシンで実行
ansible-playbook -i /vagrant/playbook/hosts/local /vagrant/playbook/webservers.yml
```

- 以前の状態に戻すときはロールバック

```dummy:コマンドプロンプト
vagrant sandbox rollback
```

## **Playbook**

- ディレクトリ構成は、公式の[ベストプラクティス](http://docs.ansible.com/ansible/playbooks_best_practices.html)の構成に近くなるように作成。
- 例と同じようにwebサーバーとdbサーバー用のPlaybookを作成。
- 各サーバー共通で実行するタスク(locale, timezone, ntp設定など)をcommonロールとして定義
- webサーバーで実行するタスク(httpd, phpインストールなど)をwebロールとして定義
- dbサーバーで実行するタスク(postgresqlインストールなど[予定])をdbロールとして定義

それぞれのPlaybookにどのロールを適用するか定義する。

|ロール |webサーバー|dbサーバー|
|------|:--------:|:-------:|
|common|○         |○        |
|web   |○         |×        |
|db    |×         |○        |


## **Vagrantfile**

- webサーバー用ホスト(192.168.33.10)、dbサーバー用ホスト(192.168.33.20)の仮想マシン構築設定
- ansible_localによるプロビジョニング指定
- どのサーバーにどのPlaybookを適用するかの指定


## **使用方法**

### **1. VirtualBoxとVagrantをインストール**
Vagrant1.8以降なら大丈夫です。一応[こちら](http://qiita.com/ozawan/items/160728f7c6b10c73b97e#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86) にインストール手順があります。


### **2. VagrantfileとPlaybookをダウンロード**

```dummy:GitBashやコマンドプロンプトなど
git clone https://github.com/ozawan/vagrant-ansible-centos67.git
```
gitが入っていない場合はZIP形式でダウンロードしてください。


### **3. 仮想マシンを起動**

```dummy:GitBashやコマンドプロンプトなど
cd vagrant-ansible-centos67
vagrant up
```

結構時間がかかりますが、初期設定済みのCentOS6.7が起動するはずです。

※Vagrant Box(bento/centos-6.7)が追加されていない場合は、ダウンロード→追加を行うので更に時間がかかります。


# **その他の参考にしたサイト**

- [Ansible Galaxy](https://galaxy.ansible.com/list#/roles?page=1&page_size=10) - 作成したRoleの共有サービス
- [Ansible公式のPlaybookサンプル](https://github.com/ansible/ansible-examples) - Githubリポジトリ
- [Ansible コーディング規約 (の例)](http://tdoc.info/blog/2014/10/09/ansible_coding.html) - edXが公開したコーディング規約を翻訳したもの
- [YAML入門](http://magazine.rubyist.net/?0009-YAML) - YAML入門