【问题标题】:Fetch a value from the Output of a task and debug the message in Ansible Playbook从任务的输出中获取一个值并在 Ansible Playbook 中调试消息
【发布时间】:2019-05-19 22:07:16
【问题描述】:

我需要使用 set_fact 从下面的 JSON 输出中获取 ipv4Address 值。最后以一些错误结束。请您给我一些最好的方法。

JSON 输出:

    "result_dns": {
      "ansible_facts": {
        "azure_dnsrecordset": [
            {
                "etag": "440922d5-b234-488a-8cbc-97b77f0fef8f",
                "id": "2",
                "name": "test2",
                "properties": {
                    "ARecords": [
                        {
                            "ipv4Address": "10.30.23.5"
                        }
                    ],
                    "TTL": 3600,
                    "fqdn": "test2.testzone.com."
                },
                "type": "Microsoft.Network/dnszones/A"

我正在使用下面的 set_fact 来检索 ipv4Address。

    - name: name
      set_fact:
      host_name: "{{ result_dns.ansible_facts.azure_dnsrecordset map(attribute='ipv4Address') | list }}"

我无法通过上述方法过滤值。你能建议我一些过滤价值的最佳方法吗?

【问题讨论】:

    标签: shell scripting ansible yaml


    【解决方案1】:

    我认为您被“azure_dnsrecordset”包含字典列表这一事实所困。只有一个,但我想假设在其他条件下可能有多个。这将满足您的要求,但是一旦您拥有多个记录,您可能会发现您的要求比这个问题更详细:

    # Presumes that you have a 'result_dns' variable set in Ansible containing the JSON
    - set_fact:
        ip_s: "{{ ( ip_s | default([]) ) + [ item.1.ipv4Address ] }}"
      with_subelements:
        - "{{ result_dns.ansible_facts.azure_dnsrecordset }}"
        - properties.ARecords
    - debug:
        msg: "{{ ip_s }}"
    

    with_subelements,从字典列表中提取键。

    这只会生成一个 IP 地址列表,在您返回多个记录集的情况下可能没有用。如果您执行以下操作:

    ip_s: "{{ ( ip_s | default([]) ) + [ { 'etag': item.0.etag, 'ip_address': item.1.ipv4Address } ] }}"
    

    这将为您提供包含“etag”和“ip_address”键的字典列表,让您可以识别它们来自的记录集。

    希望足以让您入门。

    【讨论】:

      猜你喜欢
      • 2022-07-29
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多