나는 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 %}