首页 > 解决方案 > 从 cloudfromation 将 json 输出存储在 bash 中

问题描述

我正在使用 aws ecs 查询来获取当前正在运行的任务正在使用的属性列表。

命令 - cft = "aws ecs describe-tasks --cluster arn:aws:ecs:us-west-2:4984314772:cluster/secrets --tasks arn:aws:ecs:us-west-2:4984314772:task/secrets/86855757eec4487f9d4475a1f7c4cb0b

我将其存储在输出变量中

输出 = $( 评估 $cft)

输出:

    "tasks": [
        {
            "attachments": [
                {
                    "id": "da8a1312-8278-46d5-8e3b-6b6a1d96f820",
                    "type": "ElasticNetworkInterface",
                    "status": "ATTACHED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-0a151f2eb959ad4"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-081948e3666253f"
                        },
                        {
                            "name": "macAddress",
                            "value": "02:2a:9i:5c:4a:77"
                        },
                        {
                            "name": "privateDnsName",
                            "value": "ip-172-56-17-177.us-west-2.compute.internal"
                        },
                        {
                            "name": "privateIPv4Address",
                            "value": "172.56.17.177"
                        }
                    ]
                }
            ],
            "availabilityZone": "us-west-2a",
            "clusterArn": "arn:aws:ecs:us-west-2:4984314772:cluster/secrets",
            "containers": [
                {
                    "taskArn": "arn:aws:ecs:us-west-2:4984314772:task/secrets/86855757eec4487f9d4475a1f7c4cb0b",
                    "name": "nginx",
                    "image": "nginx",
                    "lastStatus": "PENDING",
                    "networkInterfaces": [
                        {
                            "attachmentId": "da8a1312-8278-46d5-6b6a1d96f820",
                            "privateIpv4Address": "172.31.17.176"
                        }
                    ],
                    "healthStatus": "UNKNOWN",
                    "cpu": "0"
                }
            ],
            "cpu": "256",
            "createdAt": "2020-12-10T18:00:16.320000+05:30",
            "desiredStatus": "RUNNING",
            "group": "family:nginx",
            "healthStatus": "UNKNOWN",
            "lastStatus": "PENDING",
            "launchType": "FARGATE",
            "memory": "512",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "nginx"
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "tags": [],
            "taskArn": "arn:aws:ecs:us-west-2:4984314772:task/secrets/86855757eec4487f9d4475a1f7c4cb0b",
            "taskDefinitionArn": "arn:aws:ecs:us-west-2:4984314772:task-definition/nginx:17",
            "version": 2
        }
    ],
    "failures": []
}

现在,如果回显 $output.tasks[0].containers[0] 没有任何反应,它会再次打印整个内容,我想将结果存储在输出变量中并像我们以 json 格式一样引用不同的参数。

标签: jsonbashamazon-web-servicesscriptingamazon-ecs

解决方案


您将需要使用 json 解析器,例如 jq 等:

eval $cft | jq '.tasks[].containers[]'

为避免使用 eval,您可以将 aws 命令简单地通过管道传输到 jq 中,因此:

aws ecs describe-tasks --cluster arn:aws:ecs:us-west-2:4984314772:cluster/secrets --tasks arn:aws:ecs:us-west-2:4984314772:task/secrets/86855757eec4487f9d4475a1f7c4cb0b | jq '.tasks[].containers[]'

或者:

cft=$(aws ecs describe-tasks --cluster arn:aws:ecs:us-west-2:4984314772:cluster/secrets --tasks arn:aws:ecs:us-west-2:4984314772:task/secrets/86855757eec4487f9d4475a1f7c4cb0b | jq '.tasks[].containers[]')

echo $cft | jq '.tasks[].containers[]'

推荐阅读