タスク出力をファイルに記録するにはどうすればよいですか?


9

私の不可能なタスクの1つは、を使用してOracleデータベースをインポートしますimpdp

これにより、コンソールに大量の出力が生成されるため、設定しましたno_log: True

ただし、これが失敗した場合は、ログを確認したいと思います。

この特定のタスクログをコンソールではなくファイルにするにはどうすればよいですか?


コマンドモジュールを使用していますか?
モニカチェリオのボイコットSE 2017年

[ハックの詳細]の1つのアイデアは、ログを外部ファイルに書き込み、その後にfailed_when条件を使用するタスクを実行し、ログファイルを削除することです。タスクは成功しました:)
Dawny33

とにかく、正常な実行中にコンソール出力を表示できるのはなぜですか?タスクの実行中にstdoutを表示するための構成を見たことがなかったし、その可能性もないと思いました。[ok:host name]が表示されるだけです。しかし、エラーが検出された場合、出力はansible制御コンソール(および定義されたansibleログ)にダンプされますが、通常の正常な実行中に大きなstdoutを提供する構成を共有してもよろしいですか?
hvindin 2017年

@hvindin 詳細ログを取得-vvvするansible-playbookコマンドの後に挿入します。
Dawny33

1
変数を登録することは、最も論理的な動きのように思われます。AnsibleTriggeredコマンドからの出力をどう処理するかについての私の意見については、回答に対する私のコメントを参照してください。
hvindin 2017

回答:


4

[コメントを回答に変換]

これを行う1つの方法は、ログを外部ファイルに書き込み、その後、failed_when条件を使用するタスクを実行し、前のタスクが成功した場合はログファイルを削除することです。

このような何かがあなたを助けるはずです。

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

注:これは、問題を処理するための最良の方法ではない場合があります。しかし、これはハッキングであり、ロギングとモニタリングを行うのに役立ちました。


2
私はさらに進んで、コマンドをstdout / stderrに書き込み続けて、失敗への応答としてそれらを単にダンプすることができると言います。したがって、上記の例の例として、障害が発生した場合に実行を停止したい場合、failタスクを使用して、rc!= 0の場合にPyScriptに登録されているstdoutとstderrを出力するだけで、より包括的な解決策に思えます。ansiblesの組み込みメカニズムを使用する場合、例として制御サーバーで設定されたansibleロギングがある場合、その制御サーバーはansibleログに障害を記録します。どの私はそれのために正しい場所になると思います
hvindin

3

必要なのは、必要なすべてのコマンドの出力を登録(変数に格納)し、変数をファイルにダンプすることだけです。そうすれば、後で確認できます。

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

次に、dumpall.j2で:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

私が使用している例はここからです


3

私はこれを追加して解決しました

ignore_errors: true
register: results

no_log-taskへ。これにより、タスクが失敗した場合でも、次のタスクへの継続が可能になります。次に、次のタスクに対してデバッグタスクを定義します。これは常に失敗し、登録された変数を出力しますが、前のタスクが失敗したときにのみ実行されます。

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

したがって、no_log:trueを使用しても、失敗したタスクの出力が表示されます。このソリューションは、要求どおりにファイルにログを記録するのではなく、「失敗したときにログを表示する」必要性を完全に満たします。もちろん、Teeをリダイレクトまたは使用して、完全なansible出力をファイルに出力できます。これにより、このソリューションで失敗したタスクのログも含まれます。


2

実行するコマンドがあり、失敗した場合にのみログを取得したい場合は、次のようにします(/bin/sh -c '...'イニシエーターがsystem呼び出しを使用しないか、シェルなしでコマンドを直接実行しない場合のように、シェルコマンドによってプレフィックスが付けられます)。 :

command 2&>1 > command-log.txt || cat command-log.txt

これにより、エラーと標準出力がファイルにリダイレクトされ、失敗した場合にのみファイルの内容が表示されます。コマンドが非常に詳細であり、問​​題がないときにログを保持したくない場合は、次のようにできます。

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

shマンページの引用&&||使用法:

記号&&(||)は、先行するパイプラインがゼロ(非ゼロ)値を返した場合にのみ、後続のリストを実行します。

これはおそらくansibleを使用する最も慣用的な方法ではありませんが、コマンドの標準出力を表示する機能を提供する構成管理システムとの移植性が非常に高いという利点があります。


0

ansibleがstderrに適切にエラーをスローすると仮定すると、出力リダイレクトを使用して、任意のプログラムのエラーの出力をファイルにキャプチャできます。

some command 2> error.log

しかし、そうではないと思います。

代わりに、このガイドを参照して、いつエラーが発生するかを判断します。http://docs.ansible.com/ansible/playbooks_error_handling.html次に、ファイルに出力する前に、エラーを示す文字列の出力をgrepします。

すなわち。

ansible-playbook my-playbook | grep 'error' > error.log


-2

あなたが探しているのは、単純にstdoutとstreetをファイルにリダイレクトするだけかもしれません。

通常、いくつかのコマンド&> logfile.log

またはいくつかのバリアント...。


これは部分的な答えにすぎませんが、OPはエラーの場合に備えてログを表示したいと考えています。
Tensibai

これは、この質問に対する部分的な答えでさえない。シェルスクリプトでは問題ありませんがansibleでのコーディングには役に立ちません
ヒヨコ

@雛私はそれがansible内の 'shell'メソッドアプローチの有効な回避策であると思う(私はあまり知りません)
Tensibai

-2

Teeはロギング用の非常にシンプルなツールになるため、次のコマンドを参照できます。

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

2
1.これは、1つのタスクだけでなく、実行全体に影響します。2. stdoutをファイルにリダイレクトする場合は、T型にパイプする意味はありません。これは、コマンドの使用方法ではありません。3. teeを適切に使用している場合でも、OPが望まないすべてのスパムがコンソールに出力されます。
モニカチェリオのボイコットSE、2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.