ベストプラクティスからはじめるAnsible

## 対象

Ansibleに興味があり、
実際にAnsibleを使用してサーバー構成管理を体験してみたい人。

## はじめに

今回はAnsibleの公式ページで公開されているDirectory Layoutをもとに実際にAnsibleを動かすハンズオンを行う。

http://docs.ansible.com/ansible/playbooks_best_practices.html#directory-layout

## Ansibleのベストプラクティスについて

まずはハンズオンの前に下記のスライドをご覧下さい。

https://speakerdeck.com/yabaiwebyasan/besutopurakuteisukarahazimeruansible

## ハンズオン

### 環境準備

- [Virtual Box](https://www.virtualbox.org/wiki/Downloads)
- [Vagrant](https://www.vagrantup.com/downloads.html)

### Github

https://github.com/yukihirai0505/ansible-best-practice-hands-on

### 仮想環境構築

```
$ git clone https://github.com/yukihirai0505/ansible-best-practice-hands-on
$ cd ansible-best-practice-hands-on
$ vagrant up
```

ここで一旦

`ansible-best-practice-hands-on/httpdStore`

https://github.com/yukihirai0505/ansible-best-practice-hands-on/tree/master/httpdStore

の中身を覗いてみる。

### 今回のイメージ

- ステージング
- プロダクション

の環境にそれぞれNginxをインストールし、
簡単なhtmlファイルを表示するところまでやってみる。

オプションでローカルホストの構成管理もやってみる。

### Inventoryについて

下記ファイルがInventoryファイルにあたる。

- localhost
- stage
- production

どのサーバーを管理するかを書いていくファイル。

ここにはipやホスト名,ステージごとの変数などを記述していく。

### Playbookについて

下記ファイルがPlaybookにあたる

- site.yml
- fooapp.yml
- localhost.yml
- rolesディレクトリ配下

ここではNginxをインストールする,テンプレートファイルを転送するなどのサーバーに対しての構成を記述していく。

### コマンドについて

- ansible
- ansible-playbook
- ansible-galaxy

#### ansibleについて

```
ansible all -m ping
```

簡単にansibleの挙動を確認できる。

#### ansible-playbookについて

指定したInventoryにPlaybookを実行することができる。

```
ansible-playbook -i [inventory] [playbook].yml
```

またドライランを実行することもできる。

```
ansible-playbook -i [inventory] [playbook].yml --check
```

#### ansible-galaxyについて

https://galaxy.ansible.com/

[Ansible 初心者なら、まずは Ansible Galaxy から始めてみよう](http://akiyoko.hatenablog.jp/entry/2015/12/06/000100)
という記事もあるように、
galaxyにある設定を読むのもansibleの勉強になります。

### モジュールについて

http://docs.ansible.com/ansible/modules_by_category.html


## 実際に動かしてみる

### hostサーバーでansibleの設定

まずは今回ansibleを実行するサーバーで
ansibleのインストールと
sshの設定を行います。

- ansibleのインストール

```
$ vagrant ssh host
vagrant@host$ wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
vagrant@host$ sudo rpm -Uvh epel-release-6-8.noarch.rpm
vagrant@host$ sudo yum -y install ansible
# ansible2系が入っているか確認
vagrant@host$ ansible --version
vagrant@host$ touch ~/.ssh/config
```

- sshの設定

```.ssh/config
Host stage
 HostName 192.168.43.52
Host production
 HostName 192.168.43.53
```

```
vagrant@host$ chmod 600 .ssh/config
vagrant@host$ ssh-keygen -t rsa
vagrant@host$ ssh-copy-id stage
# Enter yes,vagrant
vagrant@host$ ssh-copy-id production
# Enter yes,vagrant
```

これでansileを実行できる環境は整いました。

次にhostサーバーで `/var/www/html` ディレクトリに移動します。

```
vagrant@host$ cd /var/www/html
```

それぞれのPlaybookを使用することができます。

*ステージング向け*

```
vagrant@host$ ansible-playbook -i stage site.yml
```

*プロダクション向け*

```
vagrant@host$ ansible-playbook -i production site.yml
```

これでそれぞれのIPにアクセスすれば `index.html` の内容が確認できます。

```
Host stage
 HostName 192.168.43.52
Host production
 HostName 192.168.43.53
```

## ローカル環境での実行


ホストサーバー向けに構成管理を行うこともできる。

まずはansible-galaxyを使用してjava用のroleをインストールします。

```
ansible-galaxy install -p ./roles geerlingguy.java
```

次にlocalhost用のplaybookを実行します。

```
vagrant@host$ ansible-playbook -i localhost localhost.yml
```

実際にホストサーバーに `java` が入ったことが確認できる。

```
java -version
```