お疲れ様です。伊藤です。

とりあえずAnsibleが動く、というところまで行きましたので今日はプレイブックを動かしてみたいと思います。

昨日アップした記事の中でhostsファイルに変数を設定した箇所があります([windows:vars]配下の部分)
変数は環境やサーバ毎に変わるものが多いので、サーバをグループ分けしてグループごとに変数の設定などができるようになったら便利です。(開発環境と本番環境で変数の値を変えたい場合など)その為に公式のHPでベストプラクティスが公開されています。まあ、この通りに作ったら後々楽だよ、というやつですね。まずはその環境を作っていきましょう。

以下が公式の情報で公開されているディレクトリ構造です。一応コメントは翻訳しておきました。

production                # 運用サーバーのインベントリファイル
staging                   # ステージング環境用のインベントリファイル

group_vars/
   group1                 # ここでは、特定のグループに変数を割り当てます
   group2                 # 
host_vars/
   hostname1              # システムに特定の変数が必要な場合は、ここに入力してください
   hostname2              # 

library/                  # カスタムモジュールがあれば、ここに入れてください(オプション)
filter_plugins/           # 任意のカスタムフィルタプラグインがあれば、ここに入力してください(オプション)

site.yml                  # マスタープレイブック
webservers.yml            # WebServer層用のプレイブック
dbservers.yml             # DBServer層のプレイブック

roles/
    common/               # この階層は役割(role)を表します
        tasks/            #
            main.yml      #  <-- タスクファイルには、保証が必要な場合は小さいファイルを含めることができます
        handlers/         #
            main.yml      #  <-- ハンドラファイル
        templates/        #  <-- テンプレートリソースで使用するファイル
            ntp.conf.j2   #  <------- templates end in .j2
        files/            #
            bar.txt       #  <-- コピーリソースで使用するファイル
            foo.sh        #  <-- スクリプトリソースで使用するスクリプトファイル
        vars/             #
            main.yml      #  <-- この役割に関連付けられた変数
        defaults/         #
            main.yml      #  <-- このロールのデフォルト優先度の低い変数
        meta/             #
            main.yml      #  <-- 役割の依存関係
        library/          # ロールにはカスタムモジュールも含めることができます
        lookup_plugins/   # またはこの場合のルックアップのような他のタイプのプラグイン

    webtier/              # 上記の「共通」と同じ種類の構造が、Webtierの役割のために行われました
    monitoring/           # 
    fooapp/               # 

ごくごく簡単に説明すると、役割(role)毎にディレクトリを作成し管理する、といった感じでしょうか。上の構成ではcommonのところに色々と詳細なディレクトリが切っていますので他のroleもそれを真似して作って、ということになります。今回は上のディレクトリに従って作成し、commonの配下に色々と作っていきます。

まずはトップディレクトリを作りましょう。これはなんでもいいです。

# mkdir /ansible_test
# cd /ansible_test

その配下にディレクトリを作成していきます。

# mkdir -p ./group_vars
# mkdir -p ./host_vars
# mkdir -p ./roles/common/tasks
# mkdir -p ./roles/common/handlers
# mkdir -p ./roles/common/templates
# mkdir -p ./roles/common/files
# mkdir -p ./roles/common/vars
# mkdir -p ./roles/common/defaults
# mkdir -p ./roles/common/meta
# mkdir -p ./roles/webtier
# mkdir -p ./roles/monitoring
# mkdir -p ./roles/fooapp

これでディレクトリ構造は完成です。権限や所有者は状況に合わせて変える必要があるかと思います。

続いて、プレイブックを作っていきたいと思います。ステージング環境にあるLinuxのWebServer(192.168.1.105)とDBServer(192.168.1.106)にユーザを追加する簡単なものを作ります。

ステージング用のインベントリファイルを作っていきます。

# vi staging
[webservers01]
192.168.1.105

[dbservers01]
192.168.1.106

[webservers:children]
webservers01

[dbservers:children]
dbservers01

続いてプレイブックを作っていきます。WebServer用プレイブック

# vi webservers.yml
---
- hosts: webservers
  roles:
    - common

DBServer用のプレイブック。

# vi dbservers.yml
---
- hosts: dbservers
  roles:
    - common

マスタープレイブック。

# vi site.yml
---
- include: webservers.yml
- include: dbservers.yml

変数ファイル。

# vi ./group_vars/all.yml
user_name: test_user
user_password: "$1$hhjIgYWI$QBpgSeSmTLQBQlyHobutt/"
user_groups: "wheel"

最小単位のプレイブック。

# vi ./roles/common/tasks/main.yml
- name: users add
  user: name="{{ user_name }}" state=present password={{ user_password }} groups="{{ user_groups }}"

これでとりあえずプレイブックが出来ました。実行してみましょう。

# ansible-playbook -i staging site.yml -u root -k

kオプションをつけているのでSSHの接続用パスワードを聞かれます。入力して次に進めてください。

SSH password:

以下のような表示が出れば成功です。各サーバに入りユーザが登録されているか確認してみてください。

PLAY [webservers] ********************************

TASK [Gathering Facts] ********************************
ok: [192.168.1.105]

TASK [common : users add] ********************************
changed: [192.168.1.105]

PLAY [dbservers] ********************************

TASK [Gathering Facts] ********************************
ok: [192.168.1.106]

TASK [common : users add] ********************************
changed: [192.168.1.106]

PLAY RECAP ********************************
192.168.1.105              : ok=2    changed=1    unreachable=0    failed=0
192.168.1.106              : ok=2    changed=1    unreachable=0    failed=0

お疲れ様でした。