もらったアプリケーションが、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の管理者モードで起動する。
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