LoginSignup
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-29

概要

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

環境情報

種類 バージョン
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の環境構築に関してはこちらを参考にしてください。

ホスト変数とは

簡単にいうと、特定のホスト固有の変数....ですかね...

ホスト変数の設定

  1. inventoryファイルにはまず、環境ごとにグループ分けをしましょう

    hosts
    [dev]
    192.168.33.11
    [stage]
    192.168.33.12
    [prod]
    192.168.33.13
    
  2. ホスト変数の設定

    • 書き方は2通りくらいあるが、私は下記の書き方が好きです。
    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
    

    それぞれにdevstageprodと言うホスト変数を用意して、
    実行対象のグループによって、どの変数にどんな値を入れるか、環境によって分けれます。

  3. 動作確認

    • main.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で適切な値が格納されていることがわかります。

ホスト変数活用(条件分岐)

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

  1. ホスト変数を設定

    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
    
  2. グループ変数を設定
    ansibleの条件分岐はjinja2 というテンプレートエンジンを利用して下記のように書けます。

    var1: "{% if hoge %}true{% else %}false{% endif %}"
    var2: "{% if hoge %}true{% elif fuga %}true{% else %}false{% endif %}"
    

    上記を参考にpasswordに値を設定する。

    • 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 %}"
    
  3. 動作確認
    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環境: passworddev_password
  • stage環境: passwordstage_password
  • 本番環境: passwordprod_password

おわり

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12