sed / grepを使用したシェルスクリプトのansible出力の解析

sed / grepを使用したシェルスクリプトのansible出力の解析

Ansible PlayBookを実行するシェルスクリプトがあり、そのPlayBookの出力を処理したいと思います。どうすればいいのかわかりません。

スクリプト:

#!/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

PlayBookの結果を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ドキュメントにあります。

関連情報