web-dev-qa-db-ja.com

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"
    ]
  }
}
2
Ankur K Gupta

プレイブックの結果をjsonとして印刷し、Pythonなどの現代語で解析できます。あなたがする必要があるのは環境変数ANSIBLE_STDOUT_CALLBACK = jsonを設定することです

例:

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

あなたがする必要があるのは、Ansibleログでsedまたはawkを使用することを忘れることです。これは非常に複雑になり、代わりにコールバックプラグインを開発またはカスタマイズします。

ほとんどの場合、例から始める必要があります json.py これはAnsibleログをJSON形式で出力します(少なくとも理論的には、サンプルコードはgithubの外では機能しないようです)。

公式のAnsibleドキュメントで コールバックプラグイン の開発と構成の詳細。

1
techraf