開発環境の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あれこれ
- OKパターン
expect -c "
set timeout 200
spawn vagrant up
expect \"Password:\"
send \"${PW}\n\"
interact
"
- NGパターン
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
"