Ansibleを使ってみる

## 概要
Ansibleを触る機会があったので、あまり詳しくないため調べたことをメモする。

## Ansibleとは
Ansibleとは、エージェントレスの構成管理ツールとのことです。
操作対象サーバにエージェント(ツール)をインストールしなくても操作できるツールらしい。
似たようなツールで`Puppet`や`Chef`などもあるがそちらはエージェントが必要らしい。

まとめると以下のような違いがあるようです。

* **エージェントレス型** ( Ansible )
※ プル型： 
　操作するサーバから操作対象サーバへログインして操作する

* **エージェント型** ( Puppet, Chef )
※ プッシュ型： 
　操作対象サーバのエージェントが中央サーバから必要な情報を取得して操作する

## Ansibleの構成
以下の３つの機能で構成されているようです。

* **Inventory**
※ 操作対象サーバの情報を定義

* **Module**
※ Ansibleの実行コマンド

* **Playbook**
※ Ansibleで実行する処理内容を定義

## 今回の構成
vagrantでCentOS7を起動し、Ansibleで操作してみる。

![structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/12d4716a-4a70-cf10-ffaa-726603a0f67c.png)

## ファイル構成
今回は、以下のようになる予定です。

```
├ ansible.cfg      <- ansibleの設定
├ hosts            <- Inventryファイル
├ site.yml         <- Playbookファイル
└ Vagrantfile
```

## 前提条件

* **MacOS (Homebrew インストール済み)**
https://brew.sh/index_ja

* **virtualbox & vagrant インストール済み**

```bash
$ brew cask install virtualbox vagrant
```

* **ansible インストール済み**

```bash
$ curl -fsSL https://bootstrap.pypa.io/get-pip.py | sudo python2
$ sudo pip2 install ansible
```

## vagrant準備
下記のvagrantイメージを利用することにします。
https://app.vagrantup.com/bento/boxes/centos-7

```bash
$ vagrant init bento/centos-7
```

起動して、サーバ情報を確認する。

```bash
$ vagrant up
$ vagrant ssh-config
```

## ■ Inventoryファイルの作成

`hosts`ファイルで、どのマシンに接続するかの定義を行います。

```:hosts
vagrant-machine ansible_host=127.0.0.1 ansible_port=2222 ansible_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/default/virtualhost/private_key
```

「~/.ssh/known_hosts」ファイルのチェックを無効化しておく。

```:ansible.cfg
[defaults]
host_key_checking = False
```

操作対象のサーバへ接続を確認してみる。

```bash
$ ansible all -i hosts -m ping
```

## ■ Playbookの作成 (基本形)

Playbookの基本形のYAMLファイルを作成する。

```yaml:site.yml
---
- name: Playbookチュートリアル
  hosts: all
  tasks:
```

Playbookを実行してみる。

```bash
$ ansible-playbook -i hosts site.yml 
```

setupにより自動収集したサーバ情報を確認してみる。

```bash
$ ansible all -i hosts -m setup
```

## ■ Playbookに管理者権限を付与
管理者権限でPlaybookを実行するようにします。
※ `become` 属性を追加する

```yaml:site.yml
---
- name: Playbook Sample
  hosts: all
  become: true
  tasks:
```

## SeLinux対応
CentOS 7系のSELinuxをPythonから扱えるようにする。

```yaml:site.yml
---
- name: Playbook Sample
  hosts: all
  become: true
  tasks:
    - name: install libselinux-python
      yum:
        name: libselinux-python
        state: present
```
※ state属性について
　present： インストール状態(installed)
　absent： 非インストール状態(removed)
　latest： 最新版インストール状態

## EPELリポジトリ
EPELリポジトリをインストールします。

```yaml:site.yml
---
- name: Playbook Sample
  hosts: all
  become: true
  tasks:
    - name: install libselinux-python
      yum:
        name: libselinux-python
        state: present

    - name: install EPEL Repository
      yum:
        name: epel-release
        state: present
```

## Nginxのインストール
PlaybookでNginxをインストールして起動してみる。

```yaml:site.yml
---
- name: Playbook Sample
  hosts: all
  become: true
  tasks:
    - name: install libselinux-python
      yum:
        name: libselinux-python
        state: present

    - name: install EPEL Repository
      yum:
        name: epel-release
        state: present

    - name: install Nginx
      yum:
        name: nginx
        state: present

    - name: start nginx & auto start setting
      service:
        name: nginx
        state: started
        enabled: true
```
※ state属性について
　started: 起動状態
　stopped: 停止状態
　restarted: 再起動実施（停止＋起動）
　reloaded: リロード実行 (ワーカープロセスのみ再起動)

Playbookを実行してみる。

```bash
$ ansible-playbook -i hosts site.yml 
```

ブラウザで確認してみる。

```bash
$ open http://192.168.33.10
```

![nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/7eaa9059-0f5e-5c81-7be9-8b53b9b9bead.png)

## モジュールの使い方について
下記のように`ansible-doc`コマンドにてモジュールのマニュアルが確認できるようです。

```bash
$ ansible-doc yum
```

## 参考文献
* [Ansible徹底入門](https://www.shoeisha.co.jp/book/detail/9784798149943)

以上