首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从一些字典键中获取值的不可用的剧本

从一些字典键中获取值的不可用的剧本
EN

Stack Overflow用户
提问于 2019-04-05 10:26:09
回答 1查看 1.1K关注 0票数 0

我正在写一本剧本来收集一些网络设备的数据,但是现在我很难过滤这些数据。我只需要一些钥匙的价值。

这是我得到的全部数据:

代码语言:javascript
复制
       "license": {
    "response": {
        "@status": "success",
        "result": {
            "licenses": {
                "entry": [
                    {
                        "authcode": "11111111",
                        "description": "Feature A",
                        "expired": "no",
                        "expires": "September 10, 2020",
                        "feature": "Feature A",
                        "issued": "September 10, 2016",
                        "serial": "96765555555"
                    },
                    {
                        "authcode": "222222222",
                        "description": "Feature B",
                        "expired": "no",
                        "expires": "September 14, 2020",
                        "feature": "Feature B",
                        "issued": "September 14, 2016",
                        "serial": "77777777777"

因此,我只需要这个特性和过期信息,比如:

代码语言:javascript
复制
                        "expires": "September 10, 2020",
                        "feature": "Feature A",
                        "expires": "September 14, 2020",
                        "feature": "Feature B",

我正试图像下面这样处理regex,但是我无法得到它的全部值,并且它的前进只是第一个键(有两个具有相同名称的键):

  • set_fact:特征:“{ (license_output.stdout regex_search('feature(.+?)‘)}”}}:"{{ (license_output.stdout \x{.+?)}“
  • 调试: msg:"{{ Feature}}“msg:"{{ Ex订}}”

我现在的代码是:

  • set_fact:特征:{{ (license_output.stdout regex_search('feature(.+?)‘)}}“ 过期:"{{ (license_output.stdout \x{regex_search(‘Ex远(.+?)’)}“}
  • 调试: msg:"{{ Feature}}“msg:"{{ Ex订}}”

这是预期的结果:

代码语言:javascript
复制
                        "expires": "September 10, 2020",
                        "feature": "Feature A",
                        "expires": "September 14, 2020",
                        "feature": "Feature B",
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-05 12:52:36

看起来,您在license_output.stdout中得到了一个JSON响应。当您只需在json数据中直接查找值时,就没有理由尝试使用正则表达式来解析它。考虑:

代码语言:javascript
复制
---
- hosts: localhost
  gather_facts: false
  vars:
    license_output:
      stdout: |
        {
          "license": {
            "response": {
              "@status": "success",
              "result": {
                "licenses": {
                  "entry": [
                    {
                      "authcode": "11111111",
                      "description": "Feature A",
                      "expired": "no",
                      "expires": "September 10, 2020",
                      "feature": "Feature A",
                      "issued": "September 10, 2016",
                      "serial": "96765555555"
                    },
                    {
                      "authcode": "222222222",
                      "description": "Feature B",
                      "expired": "no",
                      "expires": "September 14, 2020",
                      "feature": "Feature B",
                      "issued": "September 14, 2016",
                      "serial": "77777777777"
                    }
                  ]
                }
              }
            }
          }
        }

  tasks:
    - debug:
        msg:
          feature: "{{ item.feature }}"
          expires: "{{ item.expires }}"
      loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"

这将产生以下结果:

代码语言:javascript
复制
    TASK [debug] **********************************************************************************
    ok: [localhost] => (item=Feature A) => {
            "msg": {
                    "expires": "September 10, 2020", 
                    "feature": "Feature A"
            }
    }
    ok: [localhost] => (item=Feature B) => {
            "msg": {
                    "expires": "September 14, 2020", 
                    "feature": "Feature B"
            }
    }

目前还不清楚您想要对这些值做什么;在您的示例中使用的是set_fact,但是由于有多个特性,所以不能使用一个名为featureexpires的变量。一种可能是这样的:

代码语言:javascript
复制
- set_fact:
    "expires_{{ item.feature.lower().replace(' ', '_') }}": "{{ item.expires }}"
  loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"
  loop_control:
    label: "{{ item.feature }}"

- debug:
    msg: "Feature A expires on {{ expires_feature_a }}"

这将创建名为expires_feature_aexpires_feature_b的变量。上面的示例将输出:

代码语言:javascript
复制
TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Feature A expires on September 10, 2020"
}

另一个例子可能是构建一个将功能名称映射到过期日期的字典:

代码语言:javascript
复制
- set_fact:
    features: "{{ features|default({})|combine({item.feature: item.expires}) }}"
  loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"
  loop_control:
    label: "{{ item.feature }}"

- debug:
    msg: "Feature {{ item.0 }} expires on {{ item.1 }}"
  loop: "{{ features.items() }}"

这将产生以下结果:

代码语言:javascript
复制
TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => (item=[u'Feature B', u'September 14, 2020']) => {
    "msg": "Feature Feature B expires on September 14, 2020"
}
ok: [localhost] => (item=[u'Feature A', u'September 10, 2020']) => {
    "msg": "Feature Feature A expires on September 10, 2020"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55533373

复制
相关文章

相似问题

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