Create: 2014/09/25
LastUpdate: 2014/09/25
LVS(ロードバランサ)の背後にある、WEBサーバ2台へのコンテンツ配置を自動化してみました。
動作確認では、JobScheduler1.7 を使用しています。
シナリオ
リリースの手順は、WEBサーバをロードバランサから切り離してから、コンテンツを配置し、再度、ロードバランサに接続することとします。
リリース対象のWEBサーバは、2台全部、または、どちらか1台のみと選択できるようにします。
サーバ構成は、「 [CentOS6][SOS JobScheduler] XenServer + JobScheduler でサーバを監視してスケールアウトを自動化する」を参照してください。
JobScheduler での実装方法
Webサーバ2台にリリースを行う JobChain を1つ作成します。
リリース対象のWEBサーバは、Oredr のパラメータで指示するようにし、パラメータで JobChain の state の流れを制御します。
JobChain の作成
JobChainは、以下のとおり。
ジョブ(change_state)で next_state を動的に変更し、state の流れを切り替えます。
- [ファイル名] JobChain01.job_chain.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <job_chain title="JobChain01"> <job_chain_node state="JobChainStart" job="/sos/jitl/JobChainStart" next_state="change_state01" error_state="!error"/> <!-- web01. type=01 and type=all --> <job_chain_node state="change_state01" job="change_state" next_state="web01_lvs_off" error_state="!error"/> <job_chain_node state="web01_lvs_off" job="ssh" next_state="web01_scp_put" error_state="!error"/> <job_chain_node state="web01_scp_put" job="scp" next_state="web01_deploy" error_state="!error"/> <job_chain_node state="web01_deploy" job="ssh" next_state="web01_lvs_on" error_state="!error"/> <job_chain_node state="web01_lvs_on" job="ssh" next_state="change_state02" error_state="!error"/> <!-- web02. type=02 and type=all --> <job_chain_node state="change_state02" job="change_state" next_state="web02_lvs_off" error_state="!error"/> <job_chain_node state="web02_lvs_off" job="ssh" next_state="web02_scp_put" error_state="!error"/> <job_chain_node state="web02_scp_put" job="scp" next_state="web02_deploy" error_state="!error"/> <job_chain_node state="web02_deploy" job="ssh" next_state="web02_lvs_on" error_state="!error"/> <job_chain_node state="web02_lvs_on" job="ssh" next_state="JobChainEnd" error_state="!error"/> <job_chain_node state="JobChainEnd" job="/sos/jitl/JobChainEnd" next_state="FINISH" error_state="!error"/> <job_chain_node state="FINISH"/> <job_chain_node state="!error"/> </job_chain>各 state のジョブに設定するパラメータは以下のとおり。
- [ファイル名] JobChain01.config.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="scheduler_configuration_documentation.xsl"?> <settings> <job_chain name="JobChain01"> <order> <params/> <process state="change_state01"> <params> <param name="s_type" value="02"/> <param name="s_state" value="web02_lvs_off"/> </params> </process> <process state="change_state02"> <params> <param name="s_type" value="01"/> <param name="s_state" value="JobChainEnd"/> </params> </process> <!-- Web01 Release --> <process state="web01_lvs_off"> <params> <param name="host" value="192.168.1.90"/> <param name="user" value="root"/> <param name="password" value="p@ssw0rd"/> <param name="auth_method" value="password"/> <param name="command" value="/root/tools/lvs_add.sh 10.0.0.91 0"/> </params> </process> <process state="web01_scp_put"> <params> <param name="host" value="192.168.1.91"/> <param name="user" value="root"/> <param name="password" value="p@ssw0rd"/> <param name="auth_method" value="password"/> <param name="action" value="put"/> <param name="file_list" value="rel.tgz"/> <param name="local_dir" value="/home/jobs/data"/> <param name="remote_dir" value="/var/www"/> </params> </process> <process state="web01_deploy"> <params> <param name="host" value="192.168.1.91"/> <param name="user" value="root"/> <param name="password" value="p@ssw0rd"/> <param name="auth_method" value="password"/> <param name="command" value="/root/tools/deploy.sh rel.tgz"/> </params> </process> <process state="web01_lvs_on"> <params> <param name="host" value="192.168.1.90"/> <param name="user" value="root"/> <param name="password" value="p@ssw0rd"/> <param name="auth_method" value="password"/> <param name="command" value="/root/tools/lvs_add.sh 10.0.0.91 10"/> </params> </process> <!-- Web02 Release --> <process state="web02_lvs_off"> <params> <param name="host" value="192.168.1.90"/> <param name="user" value="root"/> <param name="password" value="p@ssw0rd"/> <param name="auth_method" value="password"/> <param name="command" value="/root/tools/lvs_add.sh 10.0.0.92 0"/> </params> </process> <process state="web02_scp_put"> <params> <param name="host" value="192.168.1.92"/> <param name="user" value="root"/> <param name="password" value="p@ssw0rd"/> <param name="auth_method" value="password"/> <param name="action" value="put"/> <param name="file_list" value="rel.tgz"/> <param name="local_dir" value="/home/jobs/data"/> <param name="remote_dir" value="/var/www"/> </params> </process> <process state="web02_deploy"> <params> <param name="host" value="192.168.1.92"/> <param name="user" value="root"/> <param name="password" value="p@ssw0rd"/> <param name="auth_method" value="password"/> <param name="command" value="/root/tools/deploy.sh rel.tgz"/> </params> </process> <process state="web02_lvs_on"> <params> <param name="host" value="192.168.1.90"/> <param name="user" value="root"/> <param name="password" value="p@ssw0rd"/> <param name="auth_method" value="password"/> <param name="command" value="/root/tools/lvs_add.sh 10.0.0.92 10"/> </params> </process> </order> </job_chain> </settings>
Job の作成
ジョブ(change_state)の定義は以下のとおり。
- [ファイル名] change_state.job.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <job order="yes"> <script language="javax.script:rhino"> <![CDATA[ function spooler_process() { try { var parameters = spooler_task.order().params(); var rel_type = "" + String(parameters.value("rel_type")); var s_type = "" + String(parameters.value("s_type")); var s_state = "" + String(parameters.value("s_state")); spooler_log.info( " param : rel_type : " + rel_type ); spooler_log.info( " param : s_type : " + s_type ); spooler_log.info( " param : s_state : " + s_state ); if( rel_type != s_type ) { return true; } spooler_log.info( " change next_state : " + s_state ); var order = spooler_task.order(); order.set_state(s_state); return true; } catch (e) { spooler_log.warn("error occurred : " + String(e)); return false; } } ]]> </script> <monitor name="configuration_monitor" ordering="0"> <script java_class="sos.scheduler.managed.configuration.ConfigurationOrderMonitor" language="java"/> </monitor> <run_time /> </job>rel_type は order パラメータです。リリース対象のサーバを指定します。値は以下の3種類です。
- "all": 全サーバ "01":Web01のみ "02":Web02のみ
s_type が rel_type と一致する場合は、JobChainの流れを変えませんが、
s_type が rel_type と一致しない場合は、next_state を s_state に変更します。
例えば、上記JobChainの state="change_state01" ではジョブのパラメータを、s_type="0"、s_state="web02_lvs_off" と設定しているので、Orderパラメータで rel_type="02" とすると、next_state を変更して Web02 へのリリースだけ行うようになります。
ジョブのscp、ssh については、「 [CentOS6][SOS JobScheduler] XenServer + JobScheduler でサーバを監視してスケールアウトを自動化する」と同じです。
Oredrの作成
あらかじめ、上記の JobChain を実行するOrderを3つ用意して、JOCで選択して実行できるようにします。
- OrderID=rel_all ・・・ 全サーバにリリースする
- OrderID=rel_01 ・・・ Web01 のみリリースする
- OrderID=rel_02 ・・・ Web02 のみリリースする
- [ファイル名] JobChain01,rel_all.order.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <order title="Release All"> <params> <param name="rel_type" value="all"/> </params> <run_time let_run="no"/> </order>rel_01 の定義は以下のとおり。
- [ファイル名] JobChain01,rel_01.order.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <order title="Release Web01"> <params> <param name="rel_type" value="01"/> </params> <run_time let_run="no"/> </order>rel_02 の定義は以下のとおり。
- [ファイル名] JobChain01,rel_02.order.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <order title="Release Web02"> <params> <param name="rel_type" value="02"/> </params> <run_time let_run="no"/> </order>
設定確認
上記設定をJOCの[JobChains]タブで見ると下図のとおり。
上記設定をJOCの[Orders]タブで見ると下図のとおり。
ここから Order 選択して、右クリックしてメニューから[Start order now]を選択すれば即時実行できます。