はじめに
2020/06/09 開催の【リモート開催】Ansibleもくもく会 (サーバ編 & NW編)2020.06 にメンターとして参加させていただきました。
いただいた質問の中に、変数名の参照の際にダブルクォーテーションで囲う場合と囲わない場合があるが必須?というものがありました。
確かにテキストの中では、囲ったり囲ってなかったりしました。
普段、癖で囲っているので、そういえばなんでだろうと思い、その場で調べた結果をこちらにも共有します。
[2020/06/10 追記]
なお、公式ドキュメントを quote variable で検索しました。
{ で始まる文字列をディクショナリと認識させないため
答えはこちらのページにありました。
{ から始まると、YAMLシンタックス的にディクショナリだと解釈しようとするため、というのが理由でした。
YAML Syntax — Ansible Documentation にも
If a value after a colon starts with a “{“, YAML will think it is a dictionary, so you must quote it
とあります。
例えば、以下のような場合は囲う必要があります。
msg: "{{ greeting }}" # OK
以下のように、囲わない場合は、エラーになります。
msg: {{ greeting }} # エラー
- エラー
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: Expecting value: line 1 column 1 (char 0)
Syntax Error while loading YAML.
found unacceptable key (unhashable type: 'AnsibleMapping')
The error appears to be in '/home/studentXX/ansible-files/test.yml': line 11, column 15, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
debug:
msg: {{ greeting }}
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
Should be written as:
with_items:
- "{{ foo }}"
一方で、これはエラーになりません。
msg: msg is {{ greeting }} # セーフだが・・
まとめ
混乱を避けるため、クォーテーションで囲うように統一するのが良いと思いました。