vagrantをもう少しmake風に

vagrantは"Vagrantfile"なんてものを作るので
make風にターゲットを複数指定したり依存解決してくれるのかと思いきや、

$ vagrant up ssh halt
The machine with the name 'ssh' was not found configured for
this Vagrant environment.

とかやっても怒られるだけ。


『これだから最近の若いものは・・・』と思いつつ、
とりあえずmake風になるbashの関数"vag"を作ってみた。
まだ途中だが、とりあえずメモ(気が向いたら直します)。

連続したtargetは実行してくれて、"vagrant ssh"が失敗したときだけは"vagrant up"して"vagrant ssh"してくれる。

# vagrant like make function
vag()
{
    local arglist=()
    # struct command list
    local arg
    for arg in "$@" ;do
        case "$arg" in
        box|connect|destroy|global-status|halt|help|init|login|package|plugin|port|powershell|\
        provision|push|rdp|reload|resume|share|snapshot|ssh|ssh-config|status|suspend|up|version)
            target="$arg"
            arglist+=("$target") ;;
        -*) arglist[((${#arglist[@]} - 1))]+=" $arg" ;;
        esac
    done
    # execute dependencies
    local cmd
    for cmd in "${arglist[@]}" ;do
        echo "vagrant $cmd"
        vagrant $cmd
        local status=$?
        echo [status: $status]
        if [ $status -ne 0 ] ;then
            case "$cmd" in
            ssh*)
                echo "must vagrant up before [$cmd]"
                echo "auto execute vagrant up"
                cmd2="vagrant up"
                echo $cmd2
                $cmd2
                local status2=$?
                echo [status2: $status2]
                if [ $status2 -ne 0 ] ;then
                    echo "fail: $cmd2"
                    return 1
                fi
                echo "rerun [$cmd]"
                vagrant $cmd
                local status3=$?
                echo [status3: $status3]
                if [ $status3 -ne 0 ] ;then
                    echo "fail(rerun): vagrant $cmd"
                    return 1
                fi ;;
            *)  echo "fail: vagrant $cmd"
                return 1 ;;
            esac
        fi
    done
}

例えば

vag ssh halt

とすれば自動で上げて(vagrant upして)くれて
vagrant sshしていろいろやった後で
抜けたときに自動で落として(vagrant haltして)くれるので楽。

# 関係ないけど.vimrc整備したらめちゃくちゃ捗るようになった。