koh’s blog

Sys Admin who loves automation

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モジュールを使用するのもありです。

docs.ansible.com

まとめ

Ansibleがうまく動かないときはだいたい型が間違ってる気がします。(自分の場合)