アンカーとエイリアスを使っているYAMLの処理がfedora 36で失敗

備忘

# 発生事象

以前は動いていた 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箇所が失敗。

```ruby
require 'yaml'
foo = YAML.load_file('molecule.yml')
```

# 具体例

以下のアンカーとエイリアスを用いたYAMLは

```yaml
- &fuga
  foo: 1
  bar: 2
- <<: *fuga
  bar: 3
```
以下を意味する。

```yaml
- 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