tohokuaikiのチラシの裏

技術的ネタとか。

VagrantとChefで開発環境を作る

もらったアプリケーションが、VagrantとChefを使ってるぽかったのでWindows10でChefからVagrantを通して開発環境を作ってみるメモ。

とりあえず参考資料 Vagrant と Chef による仮想環境構築の自動化(VirtualBox編) | オブジェクトの広場

Vagrantはインストールして使ってるので、Chefのインストールから。

Chefのインストールとセットアップ

https://downloads.chef.io/chef-dk/ から最新版のChef Development Kitをダウンロードしてインストール。

セットアップ

さきほどのブログ記事には

Chef-DK にバンドルされた Ruby の利用が推奨されています。以下のコマンドで Chef-DK の Ruby を使うように指定して下さい。
% eval "$(chef shell-init SHELL_NAME)"
(注意)SHELL_NAME の箇所は自分が使っているシェル名に置き換えてください。

ってあるけど、よくわからない。こういう時は本家ドキュメントを読む。インストール手順からのhttps://docs.chef.io/dk_windows.html:title=Windowsでのセットアップ]

WindowsのスタートメニューからインストールされたChef DKを起動。PowerShellの管理者モードで起動する。
f:id:tohokuaiki:20180919142715p:plain

Chef実行時の環境設定を行う。rubyコマンドで C:/opscode/chefdk/embedded/bin にあるruby.exeが使われるようになる。

現在のセッションだけなら

chef shell-init powershell | Invoke-Expression

を実行。
パーマネントに設定したい場合は、下記のようにする。

"chef shell-init powershell | Invoke-Expression" >> $PROFILE

この時、$PROFILEファイルは、

PS C:\WINDOWS\system32> $PROFILE
C:\Users\t-ito\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

なのだけど、これが無い場合は

if(Test-Path $PROFILE){ chef shell-init powershell | Add-Content $PROFILE } else { New-Item -Force -ItemType File $PROFILE; chef shell-init powershell | Add-Content $PROFILE }

とする。

PowerShellスクリプト実行は、セキュリティ上実行されない場合があるので 

Set-ExecutionPolicy RemoteSigned

で「Y」を選択実行しておく。

chefコマンド-vでチェックしておく。cygwinだとうまくいかなかった。

Vagrant のインストール

本体はインストール済みなので、プラグインを。

$ vagrant plugin install vagrant-vbguest
$ vagrant plugin install vagrant-chef-zero
$ vagrant plugin install vagrant-omnibus

と3つインストールする。最初のvagrant-vbguestはおそらく既にインストール済みである。

次のvagrant-chef-zeroをインストールする所で引っかかる。

2> vagrant plugin install vagrant-chef-zero
Installing the 'vagrant-chef-zero' plugin. This can take a few minutes...
Building native extensions.  This could take a while...
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:

ERROR: Failed to build gem native extension.

    current directory: C:/Users/t-ito/.vagrant.d/gems/2.4.4/gems/ffi-yajl-1.4.0/ext/ffi_yajl/ext/encoder
C:/HashiCorp/Vagrant/embedded/mingw64/bin/ruby.exe -r ./siteconf20180919-1164-1h53pll.rb extconf.rb
 -IC:/Users/t-ito/.vagrant.d/gems/2.4.4/gems/libyajl2-1.2.0/lib/libyajl2/vendored-libyajl2/include -march=x86-64 -mtune=generic -O2 -pipe
 -LC:/Users/t-ito/.vagrant.d/gems/2.4.4/gems/libyajl2-1.2.0/lib/libyajl2/vendored-libyajl2/lib -L. -pipe
creating Makefile

current directory: C:/Users/t-ito/.vagrant.d/gems/2.4.4/gems/ffi-yajl-1.4.0/ext/ffi_yajl/ext/encoder
make "DESTDIR=" clean

current directory: C:/Users/t-ito/.vagrant.d/gems/2.4.4/gems/ffi-yajl-1.4.0/ext/ffi_yajl/ext/encoder
make "DESTDIR="
generating encoder-x64-mingw32.def
compiling encoder.c
encoder.c: In function 'Init_encoder':
encoder.c:382:20: error: 'rb_cFixnum' undeclared (first use in this function); did you mean 'rb_isalnum'?
   rb_define_method(rb_cFixnum, "ffi_yajl", rb_cFixnum_ffi_yajl, 2);
                    ^~~~~~~~~~
                    rb_isalnum
encoder.c:382:20: note: each undeclared identifier is reported only once for each function it appears in
encoder.c:383:20: error: 'rb_cBignum' undeclared (first use in this function); did you mean 'rb_cFixnum'?
   rb_define_method(rb_cBignum, "ffi_yajl", rb_cBignum_ffi_yajl, 2);
                    ^~~~~~~~~~
                    rb_cFixnum
make: *** [Makefile:242: encoder.o] Error 1

make failed, exit code 2

Gem files will remain installed in C:/Users/t-ito/.vagrant.d/gems/2.4.4/gems/ffi-yajl-1.4.0 for inspection.
Results logged to C:/Users/t-ito/.vagrant.d/gems/2.4.4/extensions/x64-mingw32/2.4.0/ffi-yajl-1.4.0/gem_make.out

よくわからない…無視して進める。

貰ったVagrantfileにberkshelfが使ってあるっぽいんでインストール、

>vagrant plugin install vagrant-berkshelf
Installing the 'vagrant-berkshelf' plugin. This can take a few minutes...
Fetching: vagrant-berkshelf-5.1.2.gem (100%)
The Vagrant Berkshelf plugin requires Berkshelf from the Chef Development Kit.
You can download the latest version of the Chef Development Kit from:

    https://downloads.chef.io/chefdk

Installing Berkshelf via other methods is not officially supported.
Successfully uninstalled hashie-2.1.2
Successfully uninstalled libyajl2-1.2.0
Successfully uninstalled mixlib-log-1.7.1
Installed the plugin 'vagrant-berkshelf (5.1.2)'!
Post install message from the 'vagrant-berkshelf' plugin:

The Vagrant Berkshelf plugin requires Berkshelf from the Chef Development Kit.
You can download the latest version of the Chef Development Kit from:

    https://downloads.chef.io/chefdk

Installing Berkshelf via other methods is not officially supported.

そして、vagrant upすると

vm:
* The host path of the shared folder is missing: ../projects

と出る。

Vagrantfileがある階層の1個上にprojectsというフォルダを作成し、再度vagrant upするとなにやら進みだした。Windowsから管理者権限チェックが入るがとりあえず「はい」を選択して進める。Windows Defenderからもなんか聞かれるが通す。

なんか、vagrant upすると同時にyumで色々とインストールが始まった。たぶん、chef-zeroはいらなかったっぽい。

で、進んでくと、

    default: SSH auth method: private key
==> default: Mounting shared folders...
    default: /vagrant => C:/Users/t-ito/VagrantBox/xxxxxxx/projects
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o dmode=777,fmode=666,uid=500,gid=500 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

となった。mountで引っかかったのだけど、とりあえずVMは起動しててvagrant sshで接続は可能。

Vagrantfileのマウントの設定がMacOSのパス設定だったのでWindowsのものに変更。

  config.vm.synced_folder "C:\\hogehoge\\projects", project_path

という感じで書き換えた。(バックスラッシュ二重)

ネットワークアダプタの日本語が邪魔してる?

しかし、どうもローカルからVagrantへのマウントができない。

Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem "vboxsf" is not available.

とか

C:/HashiCorp/Vagrant/embedded/gems/2.1.5/gems/vagrant-2.1.5/lib/vagrant/util/io.rb:32:in `encode': "\x80" on Windows-31J (Encoding::InvalidByteSequenceError)

とか言われる。日本語なんて使ってないのに…。

全うに取り組むのをあきらめて、VagrantコマンドでEncoding::InvalidByteSequenceErrorであったように直接 C:/HashiCorp/Vagrant/embedded/gems/2.1.5/gems/vagrant-2.1.5/lib/vagrant/util/io.rb を書き換えてやった。そしたら、マウントしてshefが動くところまで行った。

しかし、

$ vagrant vbguest

でヴァージョン合わすといいよとあったのでやってみるとむしろ悪化。再びマウントができなくなってしまい…。

NoMethodError: undefined method `tz=' for #<Chef

Chef v13でtimezone-iiを使う(なるべく使わない方が良い)