akadama

そこらへんにいるプログラマが適当にやってます

Vagrant-awsを使う際はuser_dataを設定してみよう

流行りの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/sudoersDefaults 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経由で制御することが可能になった。
インスタンスの立ち上げ、廃止、プロビジョニングが簡単なのはすごい捗るなぁ。