首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ansible:带冒号的json元素条形键

Ansible:带冒号的json元素条形键
EN

Stack Overflow用户
提问于 2019-11-30 06:12:27
回答 2查看 1.1K关注 0票数 3

如何删除包含冒号(:)和jinja2 rejectattr的json键。

环境:

代码语言:javascript
复制
ansible 2.9.1
  config file = None
  configured module search path = [u'/home/<user>/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.15+ (default, Oct  7 2019, 17:39:04) [GCC 7.4.0]

json数据:

代码语言:javascript
复制
   {
        "tag:environment": "qa", 
        "tag:instance_id": "i-123456789"
    }

Ansible playbook:

代码语言:javascript
复制
- name: Remove InstanceID
  debug:
    msg:  "{{ instance_filter | rejectattr('['tag:environment'], 'defined' ') | list  }}

实际结果:

代码语言:javascript
复制
fatal: [localhost]: FAILED! => {
    "msg": "template error while templating string: expected token ',', got 'tag'. String: {{ instance_filter | rejectattr('['tag:environment'], 'defined' ') | list  }}"
}

预期结果:

代码语言:javascript
复制
   {
        "tag:environment": "qa"
   }
EN

回答 2

Stack Overflow用户

发布于 2019-11-30 06:46:04

rejectattr确实是实现目标的关键过滤器之一,但还需要更多的东西。下面是从您拥有的字典变量中删除该特定键的正确过滤器序列:

攻略:

代码语言:javascript
复制
---
- hosts: localhost
  gather_facts: false
  vars:
    instance_filter:
      tag:environment: qa
      tag:instance_id: i-123456789

  tasks:
  - name: print var
    debug:
      var: instance_filter

  - name: manipulate the var
    debug:
      msg: "{{ instance_filter | dict2items | rejectattr('key', 'equalto', 'tag:instance_id') | list | items2dict }}"

输出:

代码语言:javascript
复制
PLAY [localhost] *******************************************************************************************************************************************************************************************************

TASK [print var] *******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "instance_filter": {
        "tag:environment": "qa",
        "tag:instance_id": "i-123456789"
    }
}

TASK [manipulate the var] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "tag:environment": "qa"
    }
}

PLAY RECAP *************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

希望能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2019-11-30 20:21:32

JSON Q:“如何删除

密钥?”

答:create custom filter plugins是可能的。例如

代码语言:javascript
复制
$ cat filter_plugins/dict_utils.py
def dict_del_key(d, key):
    del d[key]
    return d

class FilterModule(object):
    ''' Ansible filters. Interface to Python dictionary methods.'''

    def filters(self):
        return {
            'dict_del_key' : dict_del_key
        }

下面的剧本

代码语言:javascript
复制
- hosts: localhost
  vars:
    dict:
      'tag:environment': 'qa' 
      'tag:instance_id': 'i-123456789'
  tasks:
    - debug:
        msg: "{{ dict|dict_del_key('tag:instance_id') }}"

给出

代码语言:javascript
复制
  msg:
    tag:environment: qa

备注:

请参见If you quote those config keys, they will become strings.

上提供的其他过滤器

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59111488

复制
相关文章

相似问题

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