
私はClamウイルス対策ソフトウェアでホストをスキャンするためにansibleを使用しており、電子メールでレポートを受信しています。レポートにはすべてが含まれています。私はstdoutラインだけを受け取りたいです。これを行う方法はありますか?私は以下に基づいて電子メールテンプレートを作成しました。https://gist.github.com/halberom/0aea275632d2b47af0536e5def01d4d2 唯一の違いは、かなりjsonでパイプしたことです。
The {{ host }} says {{ hostvars[host]['result']['stdout'] | to_nice_json }}
私が得るエラーは次のとおりです。
to_nice_jsonを使用してデータを変換することはできません。 to_json で置き換える: 'dict object' に 'stdout' 属性がありません。ジョブに定義されていない変数を含むオプションが含まれており、エラーはno_log:falseです。
削除すると、['stdout']
メールレポートは次のようになります。
ClamAV scan was performed on host_server
{
"changed": true,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": true,
"cmd": [
"clamscan",
"-r",
"-i",
"/usr/bin"
],
"delta": "0:00:37.293719",
"end": "2021-09-09 18:47:55.626094",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "clamscan -r -i /usr/bin",
"_uses_shell": false,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"item": "/usr/bin",
"rc": 0,
"start": "2021-09-09 18:47:18.332375",
"stderr": "",
"stderr_lines": [],
"stdout": "\n----------- SCAN SUMMARY -----------\nKnown viruses: 8563204\nEngine version: 0.103.2\nScanned directories: 1\nScanned files: 701\nInfected files: 0\nData scanned: 110.08 MB\nData read: 109.50 MB (ratio 1.01:1)\nTime: 37.113 sec (0 m 37 s)\nStart Date: 2021:09:09 18:47:18\nEnd Date: 2021:09:09 18:47:55",
"stdout_lines": [
"",
"----------- SCAN SUMMARY -----------",
"Known viruses: 8563204",
"Engine version: 0.103.2",
"Scanned directories: 1",
"Scanned files: 701",
"Infected files: 0",
"Data scanned: 110.08 MB",
"Data read: 109.50 MB (ratio 1.01:1)",
"Time: 37.113 sec (0 m 37 s)",
"Start Date: 2021:09:09 18:47:18",
"End Date: 2021:09:09 18:47:55 "
]
}
]
}
私のレポートからstdout_linesだけを取得する方法はありますか?シェルコマンドでgrepを試しましたが失敗しました。
答え1
デバッグのパスリストでループが実行されるシェルジョブresult
の登録変数。clamav
で述べたように可能なループ文書、登録されたvarは、results
各要素が現在の繰り返しでモジュールを実行した個々の結果であるリストを含むように変更されます(/usr/bin
例のように)。
この場合はresult.stdout
存在しませんが(エラーメッセージが明確に報告するように)、具体的な例としてresult.results.0.stdout
あなたの例には存在します。
ループに常に単一のパスがある場合は機能しますが、各結果からすべての標準出力のリストを取得したい場合があります。この場合、以下を使用できます。
result.results | map(attribute='stdout')
これを特定のテンプレートに戻し、特定の出力を提供できる場合は、host
次のような結果が出ます。
The {{ host }} says {{ hostvars[host].result.results | map(attribute='stdout') | to_nice_json }}
ここからjsonに行くことは電子メールのための最良の選択ではないかもしれません、そして上記の場合、スキャンされた元のルートに関する情報は失われます。別のオプションは、単に結果を繰り返し、必要な情報だけを印刷することです。
This is report for host {{ host }}
----------------------------------
{% for scan_result in hostvars[host].result.results %}
Scan performed in directory {{ scan_result.item }}:
{{ scan_result.stdout }}
{% endfor %}