流行りのVagrantでEC2インスタンスを制御できるvagrant-awsプラグインを使ったときの小ネタ
環境は以下の通り
* MacOSX
* Vagrant 1.2.2
* vagrant-aws 0.2.2
* AmazonLinux(ami-173fbf16)
基本的な使い方はid:naoyaさんのブログとかGitHubを参考に。
Vagrantfileの書き方に関してはnaoyaさんが試した時点から、SSH関連の設定方法に変更があったのでGitHubのほうも参照したほうがいいです。
Vagrant 1.1 で EC2 を vagrant up - naoyaのはてなダイアリー
mitchellh/vagrant-aws · GitHub
で、起動してみると最後に↓こんなエラーがでます。
[default] Rsyncing folder: /Users/chiastolite/workspace/vagrant/ec2/ => /vagrant
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
mkdir -p '/vagrant'
なんだろ? と思ったら /etc/sudoers
でDefaults requiretty
が設定されているのがエラーが出ている原因らしい
さて、これをどう直すか? ということなんだけど、sshで入って直すのはVagrant使ってる意味がないなと。 じゃあ、chefで直すか?と思ってもcookbooksのsyncがコケるしそもそもchefが入ってない。 ということでuser_dataを使ってみることにした。
Vagrantfileはこんな感じ
Vagrant.configure("2") do |config|
config.vm.box = "dummy"
config.vm.provider :aws do |aws, override|
# 中略
# sedでrequitettyのとこをコメントアウト
aws.user_data = <<-USER_DATA
#!/bin/sh
sed -i -e 's/^\\(Defaults.*requiretty\\)/#\\1/' /etc/sudoers
USER_DATA
end
end
設定はこのプルリクを参考にした
で、vagrant up
し直すと
[default] Rsyncing folder: /Users/chiastolite/workspace/vagrant/ec2/ => /vagrant
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
mkdir -p '/vagrant'
まだエラー…
でもvagrant provison
し直すとエラーが起きない。
多分、user_dataが設定される前にmkdirをしちゃっているのでエラーになってるんだと認識。
ちょっと気になるけどこれでしかたないかな。
ついでにuser_data使えば↓こんな感じでchef clientを入れることも出来ることを確認。
Vagrant.configure("2") do |config|
config.vm.box = "dummy"
config.vm.provider :aws do |aws, override|
# 中略
aws.user_data = <<-USER_DATA
#!/bin/sh
curl -L https://www.opscode.com/chef/install.sh | bash
USER_DATA
end
end
これでEC2をvagrant経由で制御することが可能になった。
インスタンスの立ち上げ、廃止、プロビジョニングが簡単なのはすごい捗るなぁ。