首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板字符串时的模板错误:预期名称或数字。String:使用Ansible读取JSON时

模板字符串时的模板错误:预期名称或数字。String:使用Ansible读取JSON时
EN

Stack Overflow用户
提问于 2022-03-16 03:08:46
回答 1查看 749关注 0票数 0

下面是我的样本

代码语言:javascript
复制
[
  {
    "?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"
              }
            ]
          },
          {
            "log": [
              {
                "name": "myserv1"
              },
              {
                "file-name": "/web/bea_logs/domains/mydom/myserv1/myserv1.log"
              }
            ]
          }
        ]
      },
      {
        "server": [
          {
            "name": "myserv2"
          },
          {
            "ssl": {
              "name": "myserv2"
            }
          },
          {
            "reverse-dns-allowed": "false"
          },
          {
            "log": [
              {
                "name": "myserv2"
              },
              {
                "file-name": "/web/bea_logs/domains/mydom/myserv2/myserv2.log"
              }
            ]
          },
          {
            "server-start": [
              {
                "name": "CANVL01"
              },
              {
                "java-vendor": "Sun"
              },
              {
                "java-home": "/web/bea/platform1221/jdk"
              }
            ]
          }
        ]
      }
    ]
  }
]

下面的代码可以从file-name数组中提取log元素。

代码语言:javascript
复制
- hosts: localhost
  gather_facts: no
  vars:
    json: "{{ lookup('file', './this1.json') | from_json }}"
  tasks:
    - name: display
      debug:
        msg: "{{ server.0.name }} -> {{ filename.0.log[1]['file-name'] }}"
      loop: "{{ json[1].domain }}"
      vars:
        server: "{{ item.server | selectattr('name', 'defined') }}"
        filename:  "{{ item.server | selectattr('log', 'defined') }}"
      when: item.server is defined and (item.server | selectattr('log', 'defined')) != []

在类似的行中,我希望提取server-start数组的server-start元素。下面是相同的代码:

代码语言:javascript
复制
 - name: display CPATH
   debug:
     msg: "{{ server.0.name }} -> {{ cpath.0.'server-start'[2]['java-home'] }}"
   loop: "{{ jsondata[1].domain }}"
   vars:
     server: "{{ item.server | selectattr('name', 'defined') }}"
     cpath:  "{{ item.server | selectattr('server-start', 'defined') }}"
   when: item.server is defined and (item.server | selectattr('server-start', 'defined')) != []

但是,我得到了以下错误:

代码语言:javascript
复制
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'}]}]})
fatal: [localhost]: FAILED! => {"msg": "template error while templating string: expected name or number. String: {{ server.0.name }} -> {{ cpath.0.'server-start'[2]['java-home'] }}"}

我试过以下几种方法,但没有一种有效:

代码语言:javascript
复制
     msg: "{{ server.0.name }} -> {{ cpath.0.\"server-start\"[2]['java-home'] }}"
     msg: "{{ server.0.name }} -> {{ cpath.0.server-start[2]['java-home'] }}"
     msg: "{{ server.0.name }} -> {{ cpath.0.'[server-start]'[2]['java-home'] }}"
     msg: "{{ server.0.name }} -> {{ cpath.0.[server-start][2]['java-home'] }}"
     msg: "{{ server.0.name }} -> {{ cpath.0.['server-start'][2]['java-home'] }}"

这些都不起作用。你能建议一下吗?

注意:这只是一个示例json,server-start的位置可能会有所不同。因此使用selectattr

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-16 07:25:54

试试这个剧本:

代码语言:javascript
复制
- hosts: localhost
  gather_facts: no
  vars:
    json: "{{ lookup('file', './file2.json') | from_json }}"
  tasks:
    - name: display
      debug:
        msg: "{{ server.0.name }} -> {{ cpath[0]['server-start'][2]['java-home'] }}"
      loop: "{{ json[1].domain }}"
      vars:
        server: "{{ item.server | selectattr('name', 'defined') }}"
        cpath:  "{{ item.server | selectattr('server-start', 'defined') }}"
      when: item.server is defined and (item.server | selectattr('server-start', 'defined')) != []

结果:

代码语言:javascript
复制
skipping: [localhost] => (item={'name': 'mydom'}) 
skipping: [localhost] => (item={'domain-version': '12.2.1.3.0'}) 
skipping: [localhost] => (item={'server': [{'name': 'AdminServer'}, {'ssl': {'name': 'AdminServer'}}, {'listen-port': '12400'}, {'listen-address': 'mydom.host1.bank.com'}]}) 
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'}]}]}) 
ok: [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'}]}, {'server-start': [{'name': 'CANVL01'}, {'java-vendor': 'Sun'}, {'java-home': '/web/bea/platform1221/jdk'}]}]}) => {
    "msg": "myserv2 -> /web/bea/platform1221/jdk"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71491385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档