ksaitoの日記

日々試したことの覚え書き

サーバに複数インスタンスを設定する

サーバ一台にミドルウェアをインストールしてインスタンス複数作る構成を設定するサンプルです。

ディレクトリ構成

ディレクトリ構成は、下記です。

$ tree 
.
├── host_vars
│   ├── appserv1
│   └── appserv2
├── hosts
├── roles
│   └── app
│       └── tasks
│           ├── main.yml
│           └── sample.yml
├── site.yml
└── vars
    ├── inst1.yml
    ├── inst2.yml
    └── insta.yml

5 directories, 9 files
$

設定

設定は、サーバ毎、インスタンス毎に変数ファイルにまとめます。 構成変更は、このファイルだけを変更します。

サーバの設定

host_varsディレクトリの下にサーバ名と同名のファイルにサーバについての設定を行います。 この場合、serverName変数がサーバ固有の設定です。

instlistに作成するインスタンスを定義します。 この場合、2インスタンス作ることを意味します。

$ cat host_vars/appserv1
serverName: app-server1
instlist:
  - inst1
  - inst2
$ 

インスタンスの設定

インスタンスの設定は、varsディレクトリの下にinstlistで定義した名前と同名のファイルに設定します。

$ cat vars/inst1.yml 
appName: inst1
appDB: db1
$ 

タスク

設定された値をもとにタスクを実行します。 ベストプラクティスに従ってrolesディレクトリ下に定義します。

サーバタスク

サーバ固有のタスクは、Hello, World!です。 インスタンスの設定は、sample.ymlに定義して、with_itemsとしてインスタンス毎に実行するように定義します。

$ cat roles/app/tasks/main.yml 
---
- name: Hello, World!
  debug: msg="hello"
- include: sample.yml
  with_items: instlist
$ 

インスタンスタスク

最初のinclude_varsタスクでvarsディレクトリ下のinstlistに定義された名前と同名の変数ファイルを読み込みます。 testタスクがインスタンス固有のタスクでインスタンス毎の値を参照します。

$ cat roles/app/tasks/sample.yml 
---
- include_vars: "{{item}}.yml"
- name: test
  debug: msg="appName={{appName}} appDB={{appDB}}"
$ 

インベントリ

インベントリで2台のサーバを含むグループを定義します。

$ cat hosts
[appservers]
appserv1
appserv2
$ 

まとめる

hostsにグループを指定して、同じロールを割り当てる複数のサーバを指定します。 新しいサーバが追加されたらインベントリにサーバを追加して、host_varsにサーバ、varsにインスタンスの設定をします。

$ cat site.yml 
---
- hosts: appservers
  roles:
    - app
 $ 

実行

これで1コマンドで2サーバ3インスタンスを一気に設定できる雛形の完成です。 ansibleすごい!

$ ansible-playbook -i hosts site.yml 

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [appserv2]
ok: [appserv1]

TASK [app : Hello, World!] *****************************************************
ok: [appserv1] => {
    "msg": "hello"
}
ok: [appserv2] => {
    "msg": "hello"
}

TASK [app : include] ***********************************************************
included: /home/vagrant/git/sample/roles/app/tasks/sample.yml for appserv2
included: /home/vagrant/git/sample/roles/app/tasks/sample.yml for appserv1
included: /home/vagrant/git/sample/roles/app/tasks/sample.yml for appserv1

TASK [app : include_vars] ******************************************************
ok: [appserv2]

TASK [app : test] **************************************************************
ok: [appserv2] => {
    "msg": "appName=insta appDB=db3"
}

TASK [app : include_vars] ******************************************************
ok: [appserv1]

TASK [app : test] **************************************************************
ok: [appserv1] => {
    "msg": "appName=inst1 appDB=db1"
}

TASK [app : include_vars] ******************************************************
ok: [appserv1]

TASK [app : test] **************************************************************
ok: [appserv1] => {
    "msg": "appName=inst2 appDB=db2"
}

PLAY RECAP *********************************************************************
appserv1                   : ok=8    changed=0    unreachable=0    failed=0   
appserv2                   : ok=5    changed=0    unreachable=0    failed=0   

$ 

以上