はじめに
こんにちは!
株式会社BFT名古屋支店・インフラ女子(?)のやまぐちです。
DockerfileでAnsibleとServerspecを実行できるイメージを作成しました。しかしVSCodeからコンテナに接続して「rake -T」コマンドを実行するとエラーが発しました。
今回はその対応について解決方法を残しておきます!
VSCodeからのrakeコマンド実行で「LoadError: cannot load such file -- rspec/core/rake_task」が発生する
前提条件
この現象は以下の環境で確認しています。
- ホストOS
- WIndows 11 Pro 22H2, OSビルド22621.1265
- Docker Desktop for WSL2 backend
- 4.16.3
- コンテナ
- RHEL9 UBI(Release 9.1)
- VSCode
- 1.75.1
また、AnsibleやServerspecの開発資材をローカルのフォルダに配置し、コンテナを起動する際にそのフォルダをマウントしています。
図にすると以下の通りです。
事象の詳細
コンテナの起動後にVSCodeからコンテナに接続、「rake -T」コマンドを実行すると以下のエラーが表示されました。
$ rake -T rake aborted! LoadError: cannot load such file -- rspec/core/rake_task <internal:/home/ansibleuser/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require' <internal:/home/ansibleuser/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require' /home/ansibleuser/work/ansible/src/rakefile:2:in `<top (required)>' (See full trace by running task with --trace) [ansibleuser@c93fe7e16837 src]$
しかし、コンテナを起動した側のコマンドプロンプトで同じ「rake -T」コマンドを実行すると正常に表示されます。
$ rake -T rake all # Run serverspec to all test rake serverspec:Apache_set_OS # Run serverspec for Apache_set_OS rake serverspec:Apache_set_httpdconf # Run serverspec for Apache_set_httpdconf rake serverspec:OS_Add_packages # Run serverspec for OS_Add_packages rake serverspec:OS_Check_runlevel # Run serverspec for OS_Check_runlevel rake serverspec:OS_Copy_functions # Run serverspec for OS_Copy_functions rake serverspec:OS_Set_hostname # Run serverspec for OS_Set_hostname rake serverspec:OS_Set_selinux # Run serverspec for OS_Set_selinux rake serverspec:OS_set_userlimit_all # Run serverspec for OS_set_userlimit_all rake serverspec:OS_set_userlimit_apache # Run serverspec for OS_set_userlimit_apache
まったく仕様が理解できないですが、とりあえずVSCodeから実行するとエラーになる、ということがわかりました。
解決方法
解決するためにはrspecとansible_spec(この環境はansible_specも必要なため)パッケージをインストールします。
$ gem install rspec Fetching diff-lcs-1.5.0.gem Fetching rspec-expectations-3.12.2.gem ~中略~ Parsing documentation for rspec-3.12.0 Installing ri documentation for rspec-3.12.0 Done installing documentation for rspec-support, diff-lcs, rspec-mocks, rspec-expectations, rspec-core, rspec after 4 seconds 6 gems installed
ここでもう一度「rake -T」コマンドを実行すると今度は以下のエラーが表示されます。
$ rake -T rake aborted! LoadError: cannot load such file -- ansible_spec <internal:/home/ansibleuser/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require' <internal:/home/ansibleuser/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require' /home/ansibleuser/work/ansible/src/rakefile:4:in `<top (required)>' (See full trace by running task with --trace)
LoadErrorの対象が「rspec/core/rake_task」から「ansible_spec」に変わっています。一つ一つインストールが必要なパッケージを確認していくとよさそうです。
$ gem install ansible_spec Fetching little-plugger-1.1.4.gem Fetching httpclient-2.8.3.gem ~中略~ Installing ri documentation for ansible_spec-0.3.2 Done installing documentation for rubyntlm, nori, multi_json, little-plugger, logging, httpclient, builder, gyoku, ffi, gssapi, erubi, winrm, sfl, net-telnet, net-ssh, net-scp, specinfra, rspec-its, serverspec, oj, inifile, hostlist_expression, oroku_saki, ansible-vault, ansible_spec after 13 seconds 25 gems installed
「ansible_spec」をインストール後に「rake -T」コマンドを実行します。コマンドプロンプトで実行したのと同じ実行結果を得られるようになりました。
$ rake -T rake all # Run serverspec to all test rake serverspec:Apache_set_OS # Run serverspec for Apache_set_OS rake serverspec:Apache_set_httpdconf # Run serverspec for Apache_set_httpdconf rake serverspec:OS_Add_packages # Run serverspec for OS_Add_packages rake serverspec:OS_Check_runlevel # Run serverspec for OS_Check_runlevel rake serverspec:OS_Copy_functions # Run serverspec for OS_Copy_functions rake serverspec:OS_Set_hostname # Run serverspec for OS_Set_hostname rake serverspec:OS_Set_selinux # Run serverspec for OS_Set_selinux rake serverspec:OS_set_userlimit_all # Run serverspec for OS_set_userlimit_all rake serverspec:OS_set_userlimit_apache # Run serverspec for OS_set_userlimit_apache
rspecもansible_specもインストール済みなのでコマンドプロンプトでは実行できます。なぜかVSCodeで接続したときには実行できません。うーん…
終わりに
もしかしたらRspec系の拡張機能をインストールすれば解決するのかもしれませんが、未確認です。Dockerイメージを作ったのにみんなに配ったらServerspec実行できない環境になってるじゃん!(泣)という問題のワークアラウンドが見つかってよかったです!
以上、ここまで読んでいただきありがとうございました~ ^ ^