2014年10月13日月曜日

Ansible で UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7

Ansible で次のエラーに遭遇しました。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 16: ordinal not in range(128)
調べてみると ": " が原因でした。
# ": " が含まれている
lineinfile: dest=/etc/aliases regexp="^#root:.+marc" insertafter="root: root@example.com" line="root: root@example.com"
# ": " を ":\ " に変更
lineinfile: dest=/etc/aliases regexp="^#root:.+marc" insertafter="root:\ root@example.com" line="root:\ root@example.com"
ダブルクォテーション(")で括れば解決できるというページもありましたが、私の場合は
\を追加してエスケープすることで解決できました。
(内容に誤りがありましたので、追記しました)

Ansible は YAML で記述するので今回は YAML のフォーマットに引っ掛かったようです。
気付くまでに 1時間くらい費やしてしまいました。

\ を追加してエスケープすると \ が含まれたままファイルに反映されていました。
# ":\ " だとファイルには root:\ root@example.com で反映されていました。
lineinfile: dest=/etc/aliases regexp="^#root:.+marc" insertafter="root:\ root@example.com" line="root:\ root@example.com"
エスケープせずに引数となる部分をシングルクォテーション(')で括ればエラーは解決できました。
lineinfile: 'dest=/etc/aliases regexp="^#root:.+marc" insertafter="root: root@example.com" line="root: root@example.com"'