sed/grep을 사용하여 쉘 스크립트의 ansible 출력 구문 분석

sed/grep을 사용하여 쉘 스크립트의 ansible 출력 구문 분석

Ansible 플레이북을 실행하는 쉘 스크립트가 있고 해당 플레이북의 출력을 처리하고 싶습니다. 어떻게 해야 할지 모르겠습니다.

스크립트:

#!/bin/sh
ansible-playbook -i inventory/ec2.py services_status.yml

ansible-playbook 명령의 출력은 다음과 같습니다.

PLAY [all] *********************************************************************

TASK [cmx_running_services] ****************************************************
ok: [172.31.35.225]

ok: [172.31.9.253]


TASK [debug] *******************************************************************
ok: [172.31.35.225] => {
    "services": {
        "changed": false,
        "meta": {
            "services": [
                "zk",
                "kafka"
            ]
        }
    }
}

ok: [172.31.9.253] => {
    "services": {
        "changed": false,
        "meta": {
            "MyService": [
                "default"
            ],
            "services": [
                "monitoring-agent"
            ]
        }
    }
}


PLAY RECAP *********************************************************************
172.31.35.225              : ok=2    changed=0    unreachable=0    failed=0
172.31.9.253               : ok=2    changed=0    unreachable=0    failed=0

내 스크립트에서는 이 출력을 처리하고 json 개체를 다음 형식으로 저장하려고 합니다.

{
  "172.31.35.225":{
    "services":[
      "zk",
      "kafka"
    ]
  },
  "172.31.9.253":{
    "MyService":[
      "default"
    ],
    "services":[
      "monitoring-agent"
    ]
  }
}

답변1

플레이북의 결과를 json으로 인쇄하고 Python과 같은 최신 언어로 구문 분석할 수 있습니다. 환경 변수 ANSIBLE_STDOUT_CALLBACK=json을 설정하기만 하면 됩니다.

예:

ANSIBLE_STDOUT_CALLBACK=json ansible-playbook -i hosts.ini main.yaml 

답변2

당신이 해야 할 일은 매우 복잡해질 수 있는 Ansible 로그 사용 sed을 잊어버리고 awk대신 콜백 플러그인을 개발하거나 사용자 정의하는 것입니다.

아마도 예제부터 시작해야 할 것입니다.json.pyAnsible 로그를 JSON 형식으로 출력합니다(적어도 이론상으로는 예제 코드가 github 외부에서 작동하지 않는 것 같기 때문에).

개발 및 구성에 대한 추가 정보콜백 플러그인공식 Ansible 문서에 있습니다.

관련 정보