2017-09-25 13 views
2

次のコードは'dict object' has no attribute 'failed'エラー結果の属性 "失敗":Ansibleシェルモジュールが認識しない、失敗したタスク

シェルモジュール:

- hosts: localhost 
    tasks: 
    - shell: "not_available_command" 
     register: module_result 
     until: module_result.failed == false 
     retries: 2 
     delay: 1 

結果:

fatal: [localhost]: FAILED! => { 
"failed": true, 
"msg": "The conditional check 'module_result.failed == false' failed. The error was: error while evaluating conditional (module_result.failed == false): 'dict object' has no attribute 'failed'" 

を}

しかし、私のようにuntilの構文を変更する場合:

 until: module_result.stderr == "" 

それが正常に再試行します。デバッグには-vvvオプションを付けて実行しました。

fatal: [localhost]: FAILED! => { 
"attempts": 2, 
"changed": true, 
"cmd": "not_available_command", 
"delta": "0:00:00.010290", 
"end": "2017-09-25 17:28:14.078318", 
"failed": true, 
"invocation": { 
    "module_args": { 
     "_raw_params": "not_available_command", 
     "_uses_shell": true, 
     "chdir": null, 
     "creates": null, 
     "executable": null, 
     "removes": null, 
     "warn": true 
    } 
}, 
"rc": 127, 
"start": "2017-09-25 17:28:14.068028", 
"stderr": "/bin/sh: 1: not_available_command: not found", 
"stderr_lines": [ 
    "/bin/sh: 1: not_available_command: not found" 
], 
"stdout": "", 
"stdout_lines": [] 

}

両方failed又はstderr属性しかしfailed存在している見られるように認識されないuntil構文を定義しようとしたとき:2回の再試行の後にそれが期待どおりに失敗しました。

のは、別のモジュールを試してみましょう:

GET_URLモジュール:

- hosts: localhost 
    tasks: 
    - get_url: 
     url: "http://unavailable_file_on_the_web.txt" 
     dest: "{{ playbook_dir }}" 
     register: module_result 
     until: module_result.failed == false 
     retries: 2 
     delay: 1 

この時間until: module_result.failed == false構文作品。 'failed'属性が認識されます。

モジュール上でこの問題を特定するにはどうすればよいですか?それはバグのようですか?

+0

あなたはどのようなバージョンをお使いですか?この動作はホスト上では再現できません。 –

+0

私は 'ansible 2.3.0.0'を使用します – Akif

答えて

3

はい、バグのようであるか、または予期しない動作です。failedフィールドは中間試行中に入力されません。あなたはANSIBLE_DEBUG=1でそれを調べることができます。

Ansible 2.4では
{ 
    "changed": true, 
    "end": "2017-09-25 13:01:17.269225", 
    "stdout": "", 
    "cmd": "not_available_command", 
    "rc": 127, 
    "start": "2017-09-25 13:01:17.257604", 
    "stderr": "/bin/sh: not_available_command: command not found", 
    "delta": "0:00:00.011621", 
    "invocation": { 
    "module_args": { 
     "warn": true, 
     "executable": null, 
     "_uses_shell": true, 
     "_raw_params": "not_available_command", 
     "removes": null, 
     "creates": null, 
     "chdir": null 
    } 
    }, 
    "warnings": [] 
} 

failedフィールドが存在しています。

のように、failed/succeededのような情報があります。
あなたのwhen/untilステートメントでそれらを使用することができます。

until: module_result | succeeded 

これは2.2.xのと2.3.x.に適しています

関連する問題