てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 「ERROR! failed to combine variables, expected dicts but got a 'dict' and a 'AnsibleUnicode'」発生時の対処

遭遇したエラー

先日、ansible-playbook コマンド実行時に、以下のエラーに遭遇しました。

$ ansible-playbook -i inventory.ini test.yml 

PLAY [sv] ********************************************************************************************************************************************************************************
ERROR! failed to combine variables, expected dicts but got a 'dict' and a 'AnsibleUnicode': 
{}
"\u3042"

なにやら、期待される種類の文字以外ものが入ってる系のエラーのようです。しかし、Playbook やインベントリファイルを確認、切り分けしてもとくにおかしいところはありませんでした。

原因

かなり苦戦してしまったのですが、原因は group_vars 配下の変数定義ファイルでした。

以下のようにマルチバイト文字が、キーバリュー形式ではないかたちで入ってました。

(あくまで再現可能な範囲のサンプルです)

---

おそらく host_vars でも同様だと思います。

気になったので、もう少し他のパターンも試しました。: のあとにスペースがない場合です。

---
key1:val1

の場合は、以下のエラーでした。

ERROR! failed to combine variables, expected dicts but got a 'dict' and a 'AnsibleUnicode': 
{}
"key1:val1"

もっと YAML 的にエラーになるようにすると ERROR! Syntax Error while loading YAML. になりますが、微妙なラインだとちゃんと読み込もうとしてエラーになるようです。マルチバイトかどうかは関係ないってことですね。

この手のエラーが発生したら、変数定義ファイルを確認するよ良さそうです。ついつい Playbook の方ばかり見てしまいますが。