Ansible を初めて使ってLAMP環境を作成してみる

#はじめに
Ansibleを使用してLAMP環境を作成していきます。
作成するサーバはユーザ登録がされている状態です。
詳細は、以下の記事に記載しています。
[CentOS7 の初期設定をしてみよう](https://qiita.com/ryuji_i3/items/d786f725e3f7c8614b2e)

コードだけ見たい方は[こちら](https://github.com/ryuji-i3/ansible-lamp)

#環境
CentOS7
ansible 2.4.2.0

#Ansibleとは
システム構築、運用を自動化できるツールです。
Ansibleをインストールしているサーバから、SSH接続をして対象サーバを操作します。
何台でも同時に操作することが可能で、全く同じ設定を反映させることができます。

#構成
Ansibleは主に次の3つのファイルで構成されています。

###inventry
どのサーバを管理するかを設定する

###ansible.conf
inventryファイルの場所を設定する

###playbook
どのような構成にしたいのかを設定する。構築手順書のようなものです。
このファイルがAnsibleの肝となる部分になります。
（例：httpdをyumでインストールして、起動させる）

#ホストサーバー（指示をだすサーバー）の設定
##Ansibleのインストール
インストールする前に、epelというリポジトリが必要なため、
合わせてyumでインストールします。

```
# yum install epel-release.noarch
# yum install ansible
$ ansible --version
ansible 2.4.2.0
```

##鍵認証でログイン設定
鍵を作製して、操作したいサーバに公開鍵を渡し、SSH接続できるようにします。

```
$ ssh-keygen -t rsa
$ ssh-copy-id -p ポート番号　ユーザ名@IPアドレス
$ ssh -p ポート番号　ユーザ名@IPアドレス
```

##inventryを作成してみよう
ファイル名は何でもよいです。
[]に任意のグループ名を記載することで、操作するサーバをグループ分け出来ます。
`$ vim inventory`

```inventory
[lamp]
IPアドレス:ポート番号
```
lampというグループを作成して、操作するサーバ情報を登録しています。

##ansible.confを作成してみよう
作成したinventoryファイルを指定することで実行できますが、
ansible.cfgファイルにinventoryファイルのパスを記載することによって、
ファイルを指定しないで実行できるようになります。
`vim ansible.cfg`

```ansible.cfg
[defaults]
inventory = ./inventory
```
##さっそく実行してみよう！
lampグループに対して、pingコマンドを実行してみます。
(全てのサーバを対象にしたい場合は、「lamp」⇒「all」に変更します)

```
$ ansible lamp -m ping
IPアドレス | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
```

##Playbookを作成してみよう
Apache、MySQL、PHPをインストールする手順をPlaybookに記載していきます。

###Apacheをインストールして起動し、自動起動の設定をしよう
yml形式で記載します。

`vim playbook.yml`

```playbook.yml
---
- hosts: lamp
  sudo : yes
  tasks:
    - name: install httpd
      yum: name=httpd state=latest
    - name: apache start / enable
      service: name=httpd state=started enabled=yes
```
上から順番に説明していきます。
**- hosts**で操作したいサーバを指定します。今回は「lamp」グループが対象です。
**sudo**でsudu権限をつけています。
**tasks**に何をするのかを、記述していきます。
**- name**は任意の名前です。何をしているのか、分かりやすい題名にします。
**yum**のnameでインストールするhttpdを指定し、state=latestで最新版を選択しています。
**service**のnameでhttpdを指定し、state=startedで起動しています。また、enabled=yesで自動起動の設定をしています。

###MySQLをインストールして起動し、自動起動の設定をしよう
先ほど作成したファイルに続けて記載していきます。

```playbook.yml
    - name: install mysql repository
      yum: name=http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm state=present
    - name: install mysql
      yum: name=mysql-server state=latest
    - name: mysql start / enable
      service: name=mysqld state=started enabled=yes
```
基本的には、Apacheの時と同じです。
CentOS7はyumのパッケージにmysql-serverがないため、
リポジドリをインストールしてから、mysqlをインストールしています。

**state=present**はインストール済みの場合（ここではmysql-serverがある場合）は、何もしません。

###PHPのインストールをして、Apacheを再起動させよう

```playbook.yml
    - name: install php
      yum: name={{item}} state=latest
      with_items:
        - php
        - php-devel
        - php-mbstring
        - php-mysql
        - php-gd
      notify:
        - httpd restart
  handlers:
    - name: httpd restart
      service: name=httpd state=restarted
```

**{{item}}**で変数を設定できます。中身は**with_items**に記載します。
**notify**に任意の名前を付けて、PHPのインストールが完了した後に、一度だけ処理を実行させることができます。
**handlers**でPHPのインストールが完了した後の処理を記載します。nameには先ほどの任意の名前を対応付けます。
ここでは、PHPがインストールされたら、apacheの再起動をするように設定しています。


###Ansibleを実行してみよう！

実行する前に、playbookの文法があっているか確認できます。

```
ansible-playbook playbook.yml --syntax-check
```

また、実際に実行したらどういう結果になるかシミュレーションできます。

```
ansible-playbook playbook.yml --ask-become-pass --check
```

**--ask-become-pass**は、sudoでパスワードが設定がされている場合に必要です。

問題がなければ以下のコマンドで実行できます。

```
ansible-playbook playbook.yml --ask-become-pass
```


#まとめ
一度実行して、インストールできているものは、二度目以降は実行されません。
そのため、playbookを書いたらすぐに実行して、どんどん設定を追加していけるので
思っていたよりも、スラスラかけました。

テストサーバの構築時にそのまま実行すれば
同じサーバーが自動でできることになるので、積極的に使っていきたいなと思います！
ファイルのコピーとかもできるので、脆弱性対応時に設定ファイルを変更して、
一斉に対応させることとかできそうですね。

あとは、playbookファイルがそのまま構築手順書のようになり
何をしたか見直せるのが、個人的には感動しました！