簡體   English   中英

無法在 RedHat 上使用 Ansible 2.10 版本從 JSON 文件中獲取數組元素

[英]Unable to get array element from JSON file using Ansible 2.10 version on RedHat

下面是我的 JSON 文件

[
  {
    "?xml": {
      "attributes": {
        "encoding": "UTF-8",
        "version": "1.0"
      }
    }
  },
  {
    "domain": [
      {
        "name": "mydom"
      },
      {
        "domain-version": "12.2.1.3.0"
      },
      {
        "server": [
          {
            "name": "AdminServer"
          },
          {
            "ssl": {
              "name": "AdminServer"
            }
          },
          {
            "listen-port": "12400"
          },
          {
            "listen-address": "mydom.host1.bank.com"
          }
        ]
      },
      {
        "server": [
          {
            "name": "myserv1"
          },
          {
            "ssl": [
              {
                "name": "myserv1"
              },
              {
                "login-timeout-millis": "25000"
              }
            ]
          },
          {
            "listen-port": "22421"
          }
        ]
      },
      {
        "server": [
          {
            "name": "myserv2"
          },
          {
            "ssl": {
              "name": "myserv2"
            }
          },
          {
            "reverse-dns-allowed": "false"
          },
          {
            "log": [
              {
                "name": "myserv2"
              },
              {
                "file-name": "/web/bea_logs/domains/mydom/myserv2/myserv2.log"
              }
            ]
          },
          {
            "listen-port": "12401"
          }
        ]
      }
    ]
  }
]

我希望打印listen-port ,同時記住listen-port元素的 position 可能會在數組中發生變化。

我能夠使用下面的播放獲得最新 ansible 版本 2.12.2 的監聽端口

 - name: display Listen Port
   debug:
     msg: "{{ myserver.0.name }} -> {{ cpath[0]['listen-port'] }}"
   loop: "{{ jsondata[1].domain }}"
   vars:
     myserver: "{{ item.server | selectattr('name', 'defined') | list }}"
     cpath:  "{{ item.server | selectattr('listen-port', 'defined') | list }}"
   when: item.server is defined and (item.server | selectattr('listen-port', 'defined') | list ) != []

但是,此游戲不適用於 ansible 版本為 2.10 的 redhat OS,最新版本。

以下是我收到的錯誤:

TASK [create YML for server name with Listen port] ************************************************************
Wednesday 16 March 2022  08:41:06 -0500 (0:00:00.171)       0:00:05.917 *******
skipping: [localhost] => (item={'name': 'mydom'})
skipping: [localhost] => (item={'domain-version': '12.2.1.3.0'})
failed: [localhost] (item={'server': [{'name': 'AdminServer'}, {'ssl': {'name': 'AdminServer'}}, {'listen-port': '12400'}, {'listen-address': 'mydom.host1.bank.com'}]}) => {"ansible_loop_var": "item", "changed": true, "cmd": "echo AdminServer_httpport: 12400>>/web/aes/admin/playbooks/Migrator/wlsdatadump.yml", "delta": "0:00:00.006786", "end": "2022-03-16 08:41:07.175709", "item": {"server": [{"name": "AdminServer"}, {"ssl": {"name": "AdminServer"}}, {"listen-port": "12400"}, {"listen-address": "mydom.host1.bank.com"}]}, "msg": "non-zero return code", "rc": 1, "start": "2022-03-16 08:41:07.168923", "stderr": "/bin/sh: 12400: Bad file descriptor", "stderr_lines": ["/bin/sh: 12400: Bad file descriptor"], "stdout": "", "stdout_lines": []}
skipping: [localhost] => (item={'server': [{'name': 'myserv1'}, {'ssl': [{'name': 'myserv1'}, {'login-timeout-millis': '25000'}]}, {'log': [{'name': 'myserv1'}, {'file-name': '/web/bea_logs/domains/mydom/myserv1/myserv1.log'}]}]})
skipping: [localhost] => (item={'server': [{'name': 'myserv2'}, {'ssl': {'name': 'myserv2'}}, {'reverse-dns-allowed': 'false'}, {'log': [{'name': 'myserv2'}, {'file-name': '/web/bea_logs/domains/mydom/myserv2/myserv2.log'}]}]})

你能建議任何其他解決方案嗎?

我建議您創建一個自定義過濾器以避免多重選擇:

您在filter_plugins myfilter.py與您的劇本相同級別),我已將插件命名為customfilter

#!/usr/bin/python
class FilterModule(object):
    def filters(self):
        return {
            'customfilter': self.customfilter
        }
 
    def customfilter(self, json):
        result = []
        
        for obj in json[1]['domain']:
            for server in obj:
                ob = {}
                if server == 'server':                 
                    for k in obj[server]:
                        for x in k:
                            ob.update({x: k[x]})
                    result.append(ob)
                              
        #print(result)
        
        return result

劇本:

- hosts: localhost
  gather_facts: no
  vars:
    json: "{{ lookup('file', './file.json') | from_json | customfilter }}"
  tasks:
    - name: display
      debug:
        msg: "server name: {{ server }} -> filename: {{ filename }} -> listenport: {{ listenport }}"
      loop: "{{ json }}"
      vars:
        server: "{{ item.name }}"
        filename:  "{{ item.log[1]['file-name'] | d('')}}"
        listenport: "{{ item['listen-port'] | d('') }}"

結果:

ok: [localhost] => (item={'name': 'AdminServer', 'ssl': {'name': 'AdminServer'}, 'listen-port': '12400', 'listen-address': 'mydom.host1.bank.com'}) => {
    "msg": "server name: AdminServer -> filename:  -> listenport: 12400"
}
ok: [localhost] => (item={'name': 'myserv1', 'ssl': [{'name': 'myserv1'}, {'login-timeout-millis': '25000'}], 'listen-port': '22421'}) => {
    "msg": "server name: myserv1 -> filename:  -> listenport: 22421"
}
ok: [localhost] => (item={'name': 'myserv2', 'ssl': {'name': 'myserv2'}, 'reverse-dns-allowed': 'false', 'log': [{'name': 'myserv2'}, {'file-name': '/web/bea_logs/domains/mydom/myserv2/myserv2.log'}], 'listen-port': '12401'}) => {
    "msg": "server name: myserv2 -> filename: /web/bea_logs/domains/mydom/myserv2/myserv2.log -> listenport: 12401"
}

插件的作用是將每個記錄服務器的所有詞典歸為一個詞典,並簡化您要使用的數據。

[
  {
    "name": "AdminServer",
    "ssl": {
      "name": "AdminServer"
    },
    "listen-port": "12400",
    "listen-address": "mydom.host1.bank.com"
  },
  {
    "name": "myserv1",
    "ssl": [
      {
        "name": "myserv1"
      },
      {
        "login-timeout-millis": "25000"
      }
    ],
    "listen-port": "22421"
  },
  {
    "name": "myserv2",
    "ssl": {
      "name": "myserv2"
    },
    "reverse-dns-allowed": "false",
    "log": [
      {
        "name": "myserv2"
      },
      {
        "file-name": "/web/bea_logs/domains/mydom/myserv2/myserv2.log"
      }
    ],
    "listen-port": "12401"
  }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM