ansibleコマンドの標準出力を確認する方法は?


165

ansible-playbookコマンドの標準出力を表示するにはどうすればよいですか?-vは、個々のコマンドではなく、ansible出力のみを表示します。すぐにこれを行う方法を理解できれば素晴らしいので、何かが失敗したりハングしたりした場合は、その理由がわかります。

例えば

- name: print to stdout
  action: command echo "hello"

印刷します

TASK: [print variable] ******************************************************** 

hello


回答:


165

結果を変数に登録し、デバッグして印刷できると思います。

- name: print to stdout
  command: echo "hello"
  register: hello

- debug: msg="{{ hello.stdout }}"

- debug: msg="{{ hello.stderr }}"

26
さらに、を使用して変数を直接デバッグできます- debug: var=hello。これは、複数行の出力またはAnsibleモジュールの出力(command/ shelloutput ではなく)に役立つことがあります。
geerlingguy 14年

4
これを使用してJava出力を取得するのに問題がありました。修正はstdoutにJavaの出力のすべてをリダイレクトすることです:shell: java -version 2>&1
マティアス・ブラウン

20
それは何も良いことではありませんが、コマンドが正常に完了した後にのみstdoutメッセージを受け取ります。ansibleがハングするように見える問題がありました。理由は、rsyncコマンドに間違ったユーザー名を使用していたためです。このコマンドは、対話型パスワード要求をスプールしましたが、これは単にハングしました。デバッグするのは非常に困難でしたが、リアルタイムで標準出力を確認できれば、間違ったことをすぐに理解できたでしょう。可能であれば、この機能が大好きです。
マイケルB

10
これは機能しますが、それはansibleがデバッグを本当に難しくすることを意味します。最初のタスクが終了しないことを想像してみましょう(おそらく、ユーザー入力を愚かに待っています)...ユーザーは決して知りません!さらに、registerモジュール、またはそれが何であれ、stdoutor stderr変数が設定されたオブジェクトを生成しません。
vlad-ardelean

96

stdoutの代わりに、stdout_linesを使用することを勧めします。複数行出力の場合、これは非常に優れています。たとえば、

- hosts: all
  tasks:
    - name: Run ls.sh and output "ls /"
      script: ls.sh
      register: out

    - debug: var=out.stdout_lines

与える

TASK: [debug var=out.stdout_lines] ******************************************** 
ok: [local] => {
    "var": {
        "out.stdout_lines": [
            "total 61", 
            "lrwxrwxrwx   1 root root     7 Feb 15  2015 bin -> usr/bin", 
            "drwxr-xr-x   6 root root  1024 Aug 24 22:08 boot", 
            "drwxr-xr-x  22 root root  3580 Sep  8 18:41 dev",  
            [...] 
            "drwxr-xr-x   9 root root  4096 Aug 25 19:14 usr", 
            "drwxr-xr-x  13 root root  4096 Feb 25  2015 var"
        ]
    }
}

デバッグ用のリアルタイム出力に関しては、 これが不可能で実装されない理由を議論するクローズドバグレポート https://github.com/ansible/ansible/issues/3887#issuecomment-54672569があります。


16
「リアルタイム出力」バグをリンクするための+1。
ntc2

out.stdout_linesを(Ansibleメールタスクの本文として)送信する場合、電子メールを受信したときにこのように見えないように送信するにはどうすればよいですか?[u'total 61 '、u'lrwxrwxrwx 1 root root 7 2015年2月15日bin-> usr / bin'、u'drwxr-xr-x 6 root root 1024 Aug 24 22:08 boot '、u' .... 。 ']ターミナルで見られるように、私はそれがこのように見えることを望んでいます
クリスF

致命的:[127.0.0.1]:失敗しました!=> {"reason": "YAMLの読み込み中に構文エラーが発生しました。\ n予想される<ドキュメントの開始>が見つかりませんでした\ n \ nエラーは...構文の問題です。\ n \ n問題のある行は次のように表示されます:\ N \ N \ N-名:ファイル名を指定して実行ls.shと出力\ "LS / \" \ n個^ここでのn \ "}
ネイト

20

ansible-playbookでminimal stdout_callbackを使用すると、アドホックansibleを使用した場合と同様の出力が得られました。

ansible.cfgで(私はOS Xを使用しているためcallback_plugins、インストールに合わせてパスを変更してください)

stdout_callback     = minimal
callback_plugins    = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback

そのため、このようなタスク

---
- hosts: example
  tasks:
   - name: Say hi
     command: echo "hi ..."

アドホックコマンドのように、このような出力を提供します

example | SUCCESS | rc=0 >>
hi ...

私はansible-playbook 2.2.1.0を使用しています


素敵なコールバックプラグイン、シンプルな後処理は標準出力のみを抽出できます。
-RichVel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.