Ansibleのshellモジュールで、falseコマンドを実行できない?
※超小ネタです。
先日Playbookがコケたときの挙動を確認すべく下記のようなtaskを作成しましたが、なぜかsyntaxのエラーが出てしまいました。
% cat test.yml --- - hosts: Vag1 gather_facts: False tasks: - name: fail on purpose shell: false
% ansible-playbook test.yml --syntax-check ERROR! unexpected parameter type in action: <class 'bool'> The error appears to be in '/Users/koh/vag_test/test.yml': line 5, column 7, but may be elsewhere in the file depending on the exact syntax problem. The offending line appears to be: tasks: - name: fail on purpose ^ here %
原因
原因は false
を実行するコマンドとして書いたつもりが、Ansibleにbooleanとして認識されてしまっているようです。
エラー内容を確認するとbooleanを指定すべきではないよ。と出ています。
ERROR! unexpected parameter type in action: <class 'bool'>
shellモジュールは値としてstringを指定してあげる必要があります。
= free_form The shell module takes a free form command to run, as a string. There is no actual parameter named 'free form'. See the examples on how to use this module. type: str
※ansible-docの出力抜粋
対策
今回の場合は false
をクォーテーションでくくってあげるとstrとして認識されるので問題なくplaybookを実行できます。
[koh@kohs-MBP] ~/vag_test % cat test.yml --- - hosts: Vag1 gather_facts: False tasks: - name: fail on purpose shell: "false" [koh@kohs-MBP] ~/vag_test % ansible-playbook test.yml --syntax-check playbook: test.yml [koh@kohs-MBP] ~/vag_test % ansible-playbook test.yml PLAY [Vag1] ***************************************************************************************** TASK [fail on purpose] ****************************************************************************** fatal: [Vag1]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "false", "delta": "0:00:00.005244", "end": "2020-01-16 13:22:40.832329", "msg": "non-zero return code", "rc": 1, "start": "2020-01-16 13:22:40.827085", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []} PLAY RECAP ****************************************************************************************** Vag1 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 [koh@kohs-MBP] ~/vag_test %
playbookの実行を失敗させるのであればfailモジュールを使用するのもありです。
まとめ
Ansibleがうまく動かないときはだいたい型が間違ってる気がします。(自分の場合)