在Ansible中,当JSON值包含一个字符串时解析JSON值。

4

这个Ansible playbook有效。

---
- hosts: localhost
  gather_facts: False

  vars:
    jq: "[?contains(name, 'Pizza')]"
    json: |
       [{
            "name": "Ted's Sub Shop - 720895714701",
            "templateid": "24632"
        },
        {
            "name": "Ted's Pizza - 720895714702",
            "templateid": "24663"
        }]

  tasks:
  - name: DEBUG
    debug:
      msg: "{{ json | from_json | json_query(jq) }}"

它返回以下内容。
ok: [localhost] => {
    "msg": [
        {
            "name": "Ted's Pizza - 720895714702",
            "templateid": "24663"
        }
    ]
}

我需要进一步操作,当name的值包含Pizza时,我需要返回末尾的12位数字。因此,返回输出应如下所示:

ok: [localhost] => {
    "msg": "720895714702"
}

你有什么想法?


... | map(attribute='name') | map('regex_replace', '^.*(\\d*)$', '\\1') => ... | map(attribute='name') | map('regex_replace', '^.*(\\d*)$', '\\1') - Zeitounator
这个可行!我只需要做一个小改动。我真正使用它的地方期望一个jinja语句,所以不需要{{}}。因此,\d和\1似乎不需要额外的\。这意味着它们只需要一个\而不是\在它们前面。不确定为什么(假设我最终会找到答案)...但现在我已经可以运行了! - pizzaguy39
2个回答

2

您可以尝试

- name: testplaybook jinja2
  hosts: localhost
  gather_facts: no
  vars:
    json: |
       [{
            "name": "Ted's Sub Shop - 720895714701",
            "templateid": "24632"
        },
        {
            "name": "Ted's Pizza - 720895714702",
            "templateid": "24663"
        }]
  tasks:
    - name: DEBUG
      debug:
        msg: "{{ json | from_json | selectattr('name', 'contains' , 'Pizza') 
                                  | map(attribute='name') 
                                  | map('regex_replace', '^.*?(\\d*)$', '\\1')}}" 

结果:

ok: [localhost] => {
    "msg": [
        "720895714702"
    ]
}

我一直在寻找一个“包含”运算符,但从未找到过。很高兴你分享了这个。现在可以完美地工作了。 - pizzaguy39

1

添加属性可能更有效。例如下面的声明:

    json_id: "{{ json|zip(id_hash)|map('combine')|list }}"
    id_hash: "{{ id_list|
                 map('community.general.dict_kv', 'id')|list }}"
    id_list: "{{ json|
                 map(attribute='name')|
                 map('split', '-')|
                 map('last')|
                 map('int')|list }}"

扩展为

json_id:
  - id: 720895714701
    name: Ted's Sub Shop - 720895714701
    templateid: '24632'
  - id: 720895714702
    name: Ted's Pizza - 720895714702
    templateid: '24663'

然后,使用起来很简单。例如

    - debug:
        msg: "{{ json_id|
                 selectattr('name', 'contains' , 'Pizza')|
                 map(attribute='id')|list }}"

提供

  msg:
  - 720895714702

同样的结果也可以使用下面的json_query

    - debug:
        msg: "{{ json_id|
                 json_query('[?contains(name, `Pizza`)].id') }}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接