[CentOS6][SOS JobScheduler] WEBサーバ2台へのリリースを自動化する


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、s_state は、JobChainの各 state で指定するパラメータです。
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で選択して実行できるようにします。
  1. OrderID=rel_all ・・・ 全サーバにリリースする
  2. OrderID=rel_01 ・・・ Web01 のみリリースする
  3. OrderID=rel_02 ・・・ Web02 のみリリースする
rel_all の定義は以下のとおり。
  • [ファイル名]  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]を選択すれば即時実行できます。