메일 모듈을 사용하여 Ansible을 통해 stdout_lines만 얻는 방법

메일 모듈을 사용하여 Ansible을 통해 stdout_lines만 얻는 방법

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

관련 정보