2017-01-26

macOSで起動時にvagrant upする

開発環境のvagrantを毎回vagrant upするのが面倒だったのでlaunchctlでOS X起動時にvagrant upしてみました。

今回はNFSで共有フォルダをマウントするVagrantfileの設定を想定しています。NFSの共有フォルダの場合はホストOS側のrootユーザ権限を求められるため、パスワードを入力する必要があります。起動時に自動的にvagrant upするため、このパスワードの入力を自動化するためにexpectを利用します。

スクリプトはこんな感じで

#!/bin/bash

PW="{Input Your Password on Mac OS X}"
PATH=$PATH:/usr/local/bin

expect -c "
set timeout 200
spawn vagrant up
expect \"Password:\"
send \"${PW}\n\"
expect eof exit
"

plistはこんな感じで作ります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.freedom-man.vagrant</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/bash</string>
            <string>./vagrant.sh</string>
        </array>
        <key>WorkingDirectory</key>
        <string>{VAGRANTFILE_DIRECTORY}</string>
        <key>RunAtLoad</key>
        <true/>
        <!--
        <key>StandardOutPath</key>
        <string>{LOG_PATH}</string>
        -->
    </dict>
</plist>

デバッグしたいときはStandardOutPathは必須です。あとはlaunchctl load {plist file path}でロードすればOK

expectあれこれ

send直後にinteractでユーザの標準入力に戻すのはOK
expect -c "
set timeout 200
spawn vagrant up
expect \"Password:\"
send \"${PW}\n\"
interact
"
send後に何も記述しないとダメ
expect -c "
set timeout 200
spawn vagrant up
expect \"Password:\"
send \"${PW}\n\"
"

send直後にexitもダメ

expect -c "
set timeout 200
spawn vagrant up
expect \"Password:\"
send \"${PW}\n\"
exit
"
このエントリーをはてなブックマークに追加