備忘
発生事象
以前は動いていた vagrant up が失敗。
$ vagrant up
Vagrant failed to initialize at a very early stage:
There was an error loading a Vagrantfile. The file being loaded
and the error message are shown below. This is usually caused by
a syntax error.
Path: /foo/bar/molecule/default/Vagrantfile
Line number: 0
Message: Psych::BadAlias: Unknown alias: platform
PD
PDの結果、YAMLファイルから情報を読み取って使用していたVagrantfileが失敗するようになっていた。
具体的には以下の樣なYAML.load_file箇所が失敗。
require 'yaml'
foo = YAML.load_file('molecule.yml')
具体例
以下のアンカーとエイリアスを用いたYAMLは
- &fuga
foo: 1
bar: 2
- <<: *fuga
bar: 3
以下を意味する。
- foo: 1
bar: 2
- foo: 1
bar: 3
しかしYAML.load_fileを掛けると失敗する。
$ echo "- &fuga
foo: 1
bar: 2
- <<: *fuga
bar: 3
" | ruby -r yaml -e "puts YAML.dump_stream(YAML.load(STDIN.read))"
/usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:430:in `visit_Psych_Nodes_Alias': Unknown alias: fuga (Psych::BadAlias)
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/visitor.rb:30:in `visit'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/visitor.rb:6:in `accept'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:35:in `accept'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:345:in `block in revive_hash'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:343:in `each'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:343:in `each_slice'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:343:in `revive_hash'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:167:in `visit_Psych_Nodes_Mapping'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/visitor.rb:30:in `visit'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/visitor.rb:6:in `accept'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:35:in `accept'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:338:in `block in register_empty'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:338:in `each'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:338:in `register_empty'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:146:in `visit_Psych_Nodes_Sequence'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/visitor.rb:30:in `visit'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/visitor.rb:6:in `accept'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:35:in `accept'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:318:in `visit_Psych_Nodes_Document'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/visitor.rb:30:in `visit'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/visitor.rb:6:in `accept'
from /usr/share/gems/gems/psych-4.0.3/lib/psych/visitors/to_ruby.rb:35:in `accept'
from /usr/share/ruby/psych.rb:335:in `safe_load'
from /usr/share/ruby/psych.rb:370:in `load'
from -e:1:in `<main>'
原因
YAML.loadで使用しているpsych Ruby GEMがV3からV4に変更された際に仕様変更され、エイリアス、アンカーをデフォルトで許可しなくなったため。
Ruby GEMを明示的に上げた記憶はないが、FedoraをFedora Linux 36にバージョンアップした際に影響を受けた可能性。
$ gem list psych
*** LOCAL GEMS ***
psych (4.0.3)
対応
YAML.unsafe_load_fileに置き換え。
YAML.unsafe_load_file('molecule.yml')
もしくはYAML.safe_load_fileに置き換え、aliases: true を付与。
YAML.safe_load_file('molecule.yml', aliases: true)
確認
$ echo "
- &fuga
foo: 1
bar: 2
- <<: *fuga
bar: 3
" | ruby -r yaml -e "puts YAML.dump_stream(YAML.safe_load(STDIN.read, aliases: true))"
---
- foo: 1
bar: 2
- foo: 1
bar: 3
課題
YAML.load_streamなどはaliases: trueといった制御を持たない様子。
https://github.com/ruby/psych/issues/381
参考
GitHub
https://github.com/ruby/psych
パラメーター確認
https://docs.ruby-lang.org/ja/latest/class/Psych.html
大体ここに書いてあった。
https://secret-garden.hatenablog.com/entry/2021/05/23/200803