【Ansible】ホスト変数を使って条件分岐

## 概要
- 開発環境・stage環境・本番環境等....<br>環境が増えてくると、環境の違いにより、設定値が異なってきたりして、手動で変えるなんてもう面倒臭すぎるのでホスト変数を使って楽々運用にする。


## 環境情報
|種類|バージョン|
|:--:|:--:|
|OS|centos6.7|
|ansible|2.3.1.0|
|python|2.6.6|

- また、今回は対象のサーバも下記のように用意しています。

|環境|IP|OS|
|:--:|:--:|:--:|
|dev|192.168.33.11|CentOS6.7|
|stage|192.168.33.12|CentOS6.7|
|production|192.168.33.13| CentOS6.7|

## ディレクトリ構成
こんなシンプルなもので大丈夫です。秒で作れますね
(仮想環境は必ず1台以上用意してください。)

```
.
├── test.yml
├── group_vars
│   └── main.yml
└── hosts
```

ansibleの環境構築に関しては[こちら](https://qiita.com/da-sugi/items/65ee9034bdb313fed1ab)を参考にしてください。


## ホスト変数とは
簡単にいうと、**<font color="red">特定のホスト固有の変数</font>**....ですかね...

### ホスト変数の設定
1. inventoryファイルにはまず、環境ごとにグループ分けをしましょう

    ```yml:hosts
    [dev]
    192.168.33.11
    [stage]
    192.168.33.12
    [prod]
    192.168.33.13
    ```
1. ホスト変数の設定
    - 書き方は2通りくらいあるが、私は下記の書き方が好きです。

    ```yml:hosts
    [dev]
    192.168.33.11
    [stage]
    192.168.33.12
    [prod]
    192.168.33.13


    [dev:vars]
    dev=yes
    stage=no
    prod=no

    [stage:vars]
    dev=no
    stage=yes
    prod=no

    [prod:vars]
    dev=no
    stage=no
    prod=yes
    ```  
それぞれに`dev`、`stage`、`prod`と言うホスト変数を用意して、<br>実行対象のグループによって、どの変数にどんな値を入れるか、環境によって分けれます。
1. 動作確認
    - main.ymlに簡単なタスクを作って動作確認してみます。

    ```yml:main.yml
    ---
    - hosts: all
      remote_user: vagrant
      tasks: 
      - name: debug
        debug: msg="{{ dev }},{{ stage }},{{ prod }}"
        tags: debug
    ```
    - 実行

    ```
    $ ansible-playbook -i hosts main.yml --diff --tags debug

    PLAY [all] **************************************************************************************************************************************************************************

    TASK [Gathering Facts] **************************************************************************************************************************************************************
    ok: [192.168.33.11]
    ok: [192.168.33.12]
ok: [192.168.33.13]

    TASK [debug] ************************************************************************************************************************************************************************
ok: [192.168.33.11] => {
    "msg": "yes,no,no"
}
ok: [192.168.33.12] => {
    "msg": "no,yes,no"
}
ok: [192.168.33.13] => {
    "msg": "no,no,yes"
}


    PLAY RECAP **************************************************************************************************************************************************************************
192.168.33.11              : ok=2    changed=0    unreachable=0    failed=0
192.168.33.12              : ok=2    changed=0    unreachable=0    failed=0
192.168.33.13              : ok=2    changed=0    unreachable=0    failed=0
    ```
    - ↑のようにホスト変数の値は、dev,stage,prodで適切な値が格納されていることがわかります。

## ホスト変数活用(条件分岐)
それではホスト変数も設定できたことですし、その値によって条件分岐をさせてみましょう
今回は、環境によって変わってくるパスワードを設定することを仮定して、<font color="red">password</font>という変数の値をホスト変数の値によって条件分岐させて変える。
値の確認は`debugモジュール`で<font color="red">password</font>という変数の中身を確認してみます。

1. ホスト変数を設定
    
    ```yml:hosts
    [dev]
192.168.33.11
[stage]
192.168.33.12
[prod]
192.168.33.13

    [dev:vars]
dev=true
stage=
prod=

    [stage:vars]
    dev=
stage=true
prod=

    [prod:vars]
dev=
stage=
prod=true
    ```

1. グループ変数を設定
   ansibleの条件分岐はjinja2 というテンプレートエンジンを利用して下記のように書けます。
 
    ```
    var1: "{% if hoge %}true{% else %}false{% endif %}"
    var2: "{% if hoge %}true{% elif fuga %}true{% else %}false{% endif %}"
    ```
   上記を参考に<font color="red">password</font>に値を設定する。
    - dev環境: **dev_password**
    - stage環境: **stage_password**
    - 本番環境: **prod_password**

    ```:group_vars/main.yml
    ---
    password: "{% if dev %}dev_password{% elif stage %}stage_password{% elif prod %}prod_password{% endif %}"
    ```
1. 動作確認
main.ymlにまた簡単なタスクを作って動作確認してみます。
    
    ```main.yml
    ---
    - hosts: all
      remote_user: vagrant
      tasks: 
      - name: debug
        debug: msg="{{ password }}"
        tags: debug
    ```

- 実行
    
    ```
    $ ansible-playbook -i hosts main.yml --diff --tags debug

    PLAY [all] **************************************************************************************************************************************************************************

    TASK [Gathering Facts] **************************************************************************************************************************************************************
    ok: [192.168.33.11]
    ok: [192.168.33.12]
    ok: [192.168.33.13]
    TASK [debug] ************************************************************************************************************************************************************************
    ok: [192.168.33.11] => {
    "msg": "dev_password"
}
    ok: [192.168.33.12] => {
    "msg": "stage_password"
}
    ok: [192.168.33.13] => {
    "msg": "prod_password"
}


    PLAY RECAP **************************************************************************************************************************************************************************
192.168.33.11              : ok=2    changed=0    unreachable=0    failed=0
192.168.33.12              : ok=2    changed=0    unreachable=0    failed=0
192.168.33.13              : ok=2    changed=0    unreachable=0    failed=0
    ```

↑を見ていただければわかるように、環境ごとに適当な値が入っていることがわかります。

- dev環境: <font color="red">password</font>に**dev_password**</font>
- stage環境: <font color="red">password</font>に</font>**stage_password**
- 本番環境: <font color="red">password</font>に**prod_password**


# おわり