使用 sed/grep 解析 shell 脚本中的 ansible 输出

使用 sed/grep 解析 shell 脚本中的 ansible 输出

我有一个执行 ansible playbook 的 shell 脚本,我想处理该 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 日志上使用sedawk,这会变得非常复杂,而是开发或定制一个回调插件。

您很可能应该从示例开始json.py它以 JSON 格式输出 Ansible 日志(至少理论上是这样,因为示例代码似乎无法在 github 之外运行)。

有关开发和配置的更多信息回调插件在 Ansible 官方文档中。

相关内容