サーバ一台にミドルウェアをインストールしてインスタンスを複数作る構成を設定するサンプルです。
ディレクトリ構成
ディレクトリ構成は、下記です。
$ 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 $
以上