2011年12月1日木曜日

対話的にデプロイを行うシェルを書いた。

サーバ側にある対話型デプロイツールを使うとき、
いちいちサーバにsshするのがめんどくさいので、
シェルを書いてみた。

expectコマンドの使い方

対話型アプリケーションを自動実行する
対話型のコマンドを自動化できるexpectコマンド
[expect] spawnしたプロセスの終了ステータスを得る


① 対話型リモートデプロイシェル
まず、expectをインストール(apt-get install expect)
deploy() {
    #--- for backspace  
    stty intr ^\?
    stty erase ^H

    #--- get parameter  
    DEPLOY_ENV=$1

    #--- confirm commit  
    if [ "${DEPLOY_ENV:-null}" = "null" ]; then
        echo
        echo "deploy type"
        echo "type :  tst # kg_tsubasa.dev.klabgames.net"
        echo "        stg # kg_tsubasa.klabgames.net"
        echo
        return

    elif [ $DEPLOY_ENV = 'tst' ]; then
        DEPLOY_SERVER="tsubasa.dev.klabgames.net"

    elif [ $DEPLOY_ENV = 'stg' ]; then
        DEPLOY_SERVER="tsubasa.klabgames.net"

    else
        echo
        echo "deploy type"
        echo "type :  tst # kg_tsubasa.dev.klabgames.net"
        echo "        stg # kg_tsubasa.klabgames.net"
        echo
        return
    fi
    #--- which deploy  
    echo
    echo -n "Which Deploy (site:s / mgr:m) > "
    read FLG_DEPLOY_TYPE

    if [ "${FLG_DEPLOY_TYPE:-null}" = "s" ]; then
        DEPLOY_TYPE="site"
    elif [ "${FLG_DEPLOY_TYPE:-null}" = "m" ]; then
        DEPLOY_TYPE="mgr"
    else
        echo
        echo "Please Input s or m."
        echo
        return
    fi

    #--- confirm deploy  
    echo
    echo -n "Deploy on $DEPLOY_SERVER of $DEPLOY_TYPE ? (y/n) > "
    read FLG_DEPLOY

    if [ "${FLG_DEPLOY:-null}" = "y" ]; then
        echo ""
    elif [ "${FLG_DEPLOY:-null}" = "n" ]; then
        echo
        echo "Thank you."
        echo
        return
    else
        echo
        echo "Please Input y or n."
        echo
        return
    fi

    #--- confirm commit  
    SSH_AGENT_PS=`ps -e | grep ssh-agent`
    echo $SSH_AGENT_PS
    if [ "${SSH_AGENT_PS:+exist}" = "exist" ]; then
        expect -c "
            set timeout 1
            spawn ssh -l kg_tsubasa $DEPLOY_SERVER 
            expect \"kg_tsubasa@w112:~$ \" 
            send \"deploy -s $DEPLOY_TYPE \n\"
            expect \"Deploy OK?\"
            send \"n\n\"
            send \"exit\n\"
            interact
        "
    elif [ "${SSH_AGENT_PS:-nonexist}" = "nonexist" ]; then
        expect -c "
            set timeout 1
            spawn ssh -l kg_tsubasa $DEPLOY_SERVER
            expect \"Enter passphrase for key '/home/karino/.ssh/id_rsa':\" {
                send \"password\n\"
            }
            expect \"kg_tsubasa@w112:~$ \"
            send \"deploy -s $DEPLOY_TYPE \n\"
            expect \"Deploy OK?\"
            send \"n\n\"
            send \"exit\n\"
            interact
        "
    fi
    echo

ssh-agentが立ち上がっているか否かによって、
条件分岐をしているが、
もう少しうまいやり方がありそうな気がする。

そして、正常終了したか否かのステータスはつけていない・・・。

0 件のコメント:

コメントを投稿