从任务的输出中获取值并调试Ansible Playbook中的消息

时间:2018-12-19 12:02:40

标签: shell scripting ansible yaml

我需要使用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 }}"

我无法通过上述方法过滤值。您能建议我一些最佳方法来筛选值吗?

1 个答案:

答案 0 :(得分:0)

我想您会被'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”键的词典列表,使您可以识别它们来自的记录集。

希望能帮助您入门。