【问题标题】:AWS CLI Query IF conditionAWS CLI 查询 IF 条件
【发布时间】:2019-05-31 15:12:43
【问题描述】:

我能否获得有关在 cli 表输出中获取别名记录的值的帮助?

test.emea.example.com。是别名。

顺便说一句,如果 DNS 记录是多值的,如何将这些值扁平化并连接起来

下面是例子:

 $ aws route53 list-resource-record-sets --hosted-zone-id Z34XXXXXXXX4EF --query "ResourceRecordSets[?Type=='A']"
[
    {
        "ResourceRecords": [
            {
                "Value": "10.189.134.12"
            }
        ], 
        "Type": "A", 
        "Name": "dnsforwarder0.emea.example.com.", 
        "TTL": 300
    }, 
    {
        "ResourceRecords": [
            {
                "Value": "10.189.134.47"
            }
        ], 
        "Type": "A", 
        "Name": "dnsforwarder1.emea.example.com.", 
        "TTL": 300
    }, 
    {
        "ResourceRecords": [
            {
                "Value": "10.189.134.78"
            }
        ], 
        "Type": "A", 
        "Name": "dnsforwarder2.emea.example.com.", 
        "TTL": 300
    }, 
    {
        "AliasTarget": {
            "HostedZoneId": "Z32O12XQLNTSW2", 
            "EvaluateTargetHealth": false, 
            "DNSName": "dualstack.kubernetes-elb-k8fca-prod-emea-1745420721.eu-west-1.elb.amazonaws.com."
        }, 
        "Type": "A", 
        "Name": "test.emea.example.com."
    }
]
[Tiger-Pengs-MacBook-Pro:~/aws/aws_fed]
tpeng $ aws route53 list-resource-record-sets --hosted-zone-id Z34XXXXXXXX4EF --query "ResourceRecordSets[?Type=='A'].[Name,Type,ResourceRecords[0].Value]" --output table --color off 
-----------------------------------------------------------
|                 ListResourceRecordSets                  |
+----------------------------------+----+-----------------+
|  dnsforwarder0.emea.example.com. |  A |  10.189.134.12  |
|  dnsforwarder1.emea.example.com. |  A |  10.189.134.47  |
|  dnsforwarder2.emea.example.com. |  A |  10.189.134.78  |
|  test.emea.example.com.          |  A |  None           |
+----------------------------------+----+-----------------+

【问题讨论】:

  • 你能展示你正在寻找的样本输出吗?
  • 在进入这个兔子洞之前,您是否考虑运行一个单独的命令来获取AliasTarget 记录,而不是必须在一个命令中获取它们?或者,您是否考虑过在 Python 中执行此操作,这样您可以更好地控制结果?
  • "顺便说一句,如果 DNS 记录是多值的,如何将这些值进行扁平化和连接"。我不确定我理解你所说的扁平化和连接值是什么意思。在任何情况下,都应该在一个单独的问题中提出,并提供一些示例输入以及您希望在输出中看到的内容。
  • John Rotenstein:我想要输出中显示的别名的 DNSName,而不是“None”;而且我喜欢一个 cmd 中的所有内容 - 糟糕的 Perlish 旧习惯 ;-)

标签: aws-cli json-query


【解决方案1】:

基于 John 和 Alex 的想法,我使用 union 以及 join 函数来获得我想要的。但是,它太冗长了。

$ aws route53 list-resource-record-sets --hosted-zone-id Z34XXXXXXXX4EF --query "[ResourceRecordSets[?Type=='A' && contains(keys(@), 'AliasTarget')].[Name,Type,AliasTarget.DNSName],ResourceRecordSets[?Type=='A' && contains(keys(@), 'ResourceRecords')].[Name,Type,join(', ', ResourceRecords[].Value)]]" --output table
-------------------------------------------------------------------------------------------------------------------------
|                                              ListResourceRecordSets                                                   |
+-----------------------------+----+------------------------------------------------------------------------------------+
|  test.example.com.          |  A |  dualstack.kubernetes-elb-k8fca-prod-emea-1745420721.eu-west-1.elb.amazonaws.com.  |
|  dnsforwarder0.example.com. |  A |  10.189.134.12                                                                     |
|  dnsforwarder1.example.com. |  A |  10.189.134.47                                                                     |
|  dnsforwarder2.example.com. |  A |  10.189.134.78                                                                     |
|  privatezone.example.com.   |  A |  10.20.30.40, 10.10.30.40, 10.30.30.40                                             |
+-----------------------------+----+------------------------------------------------------------------------------------+

【讨论】:

    【解决方案2】:

    您可以通过将 JMESpath And expression 与 keys 和 contains 函数结合使用来实现此目的。所以这会起作用:

    aws route53 list-resource-record-sets --hosted-zone-id Z34XXXXXXXX4EF \
      --query 'ResourceRecordSets[?Type==`A` && contains(keys(@), `AliasTarget`)].Name'
    

    【讨论】:

    • Alex,您的查询仅搜索 A 类型别名(不包括正常的 A 记录)。如果是普通的 A 记录,我正在查找查询检索 IP,如果是别名记录,则检索 DNSName。
    • 我想你可以从查询@Tigerpeng 中删除Type==`A` && 吗?您的示例表明这就是您想要的。
    猜你喜欢
    • 2016-11-06
    • 2016-02-07
    • 1970-01-01
    • 2020-10-24
    • 2021-05-24
    • 2018-08-16
    • 2013-10-11
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多