昔の記事「Vagrant+Chef-Zero入門」でprovisionを行おうと思い、vagrant upしたところ、次のエラーでプロビジョニングがコケました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
==> default: Running provisioner: shell... default: Running: inline script ==> default: curl: (6) Couldn't resolve host 'www.opscode.com' ==> default: Running provisioner: chef_zero... default: Installing Chef (latest)... The following SSH command responded with a non-zero exit status. Vagrant assumes that this means the command failed! yum install -y -q curl Stdout from the command: Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=stock error was 14: PYCURL ERROR 7 - "Failed to connect to 2a02:2498:1:3d:5054:ff:fed3:e91a: Network is unreachable" |
よく見るとinline scriptとchef両方でコケてる
inline script はゲストOSにchefをインストールするスクリプトで、opscode.comからダウンロードしてくるのですが、3行目でこれが失敗しています。
原因はホストアドレスの名前解決ができなかったようですね。
chefがインストールできていないので、chef provisionがコケるのは当然なのですが、14行目でも network is unreachable ということで、ゲストOSから名前解決が正しくできていないために、インターネットに出て行けなかったのではないかと推測できます。
解決策
ゲストOSから名前解決がうまくいかないとき、ホストOSで名前解決するようプロキシする設定にすることが可能なようで、VirtualBoxの NAT Networking settings に詳細が記載されていました。
https://www.virtualbox.org/manual/ch08.html#idp46608649138592
今回はこの設定の中の natdnshostresolver
をVagrantfileから有効にします。
1 2 3 |
config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] end |
vagrant up でVMを立ち上げ直すと、正しく名前解決が行われるようになります。
このオプションを有効化することによる副作用はなさそうなので、配布する場合は付けておいたほうがよさそうです。
所感
この原因が解明できておらず曖昧なのですが、Vagrantを使っているとネットワーク周りの問題にはよく遭遇します。
自分の中でネットワークに関しては知識面において弱点でもあるので、克服できるように精進したいと思います。
余談ではありますが、本記事内や以前の記事で書いた opscode.com は chef.io に引っ越しが行われており、古いドメインでもリダイレクトされますが、DNSルックアップが2度走ることになるので気になる方は新しい方を参照するように修正すると良いでしょう。