首页 > 解决方案 > 如何从 ansible 调试的字典键值中删除不需要的字符串

问题描述

当我运行 ansible playbook 时,我有以下输出

ok: [localhost] => {
    "msg": [
        {
            "last-heard-processing-time": "18611 secs ago(took 15 secs)",
            "name": "XXXX",
            "status": "conn:Getting ALL"
        },
        {
            "last-heard-processing-time": "20375 secs ago(took 17 secs)",
            "name": "AAAA",
            "status": "conn:Getting ALL"
        },
        {
            "last-heard-processing-time": "20292 secs ago(took 11 secs)",
            "name": "BBBB",
            "status": "conn:Getting ALL"
        },
        {
            "last-heard-processing-time": "4 secs ago(took 13 secs)",
            "name": "CCCC",
            "status": "conn:idle"
        },
        {
            "last-heard-processing-time": "51 secs ago(took 10 secs)",
            "name": "DDDD",
            "status": "conn:idle"
        },
        {
            "last-heard-processing-time": "53 secs ago(took 10 secs)",
            "name": "EEEEE",
            "status": "conn:idle"
        },
        {
            "last-heard-processing-time": "9 secs ago(took 10 secs)",
            "name": "FFFF",
            "status": "conn:idle"
        }
    ]
}

需要专家的一些帮助/提示/线索(我是 ansible 的新手)我需要使用哪个过滤器来删除“last-heard-processing-time”键值中的额外字符串,以便我可以低于输出,我只需要last-heard-processing-time 键值中的第一个数字

ok: [localhost] => {
    "msg": [
        {
            "last-heard-processing-time": "18611",
            "name": "XXXX",
            "status": "conn:Getting ALL"
        },
        {
            "last-heard-processing-time": "20375",
            "name": "AAAA",
            "status": "conn:Getting ALL"
        },
        {
            "last-heard-processing-time": "20292",
            "name": "BBBB",
            "status": "conn:Getting ALL"
        },
        {
            "last-heard-processing-time": "4",
            "name": "CCCC",
            "status": "conn:idle"
        },
        {
            "last-heard-processing-time": "51",
            "name": "DDDD",
            "status": "conn:idle"
        },
        {
            "last-heard-processing-time": "53",
            "name": "EEEEE",
            "status": "conn:idle"
        },
        {
            "last-heard-processing-time": "9",
            "name": "FFFF",
            "status": "conn:idle"
        }
    ]
}

我正在尝试使用 regex_replace

msg: "{{output.msg| regex_replace('\\d+\\ssecs\\sago\\(took\\s\\d+\\ssecs\\)', '\\d+')}}"

出错

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: re.error: bad escape \d at position 0
fatal: [localhost]: FAILED! => {}

标签: regexparsingansiblejinja2regexp-replace

解决方案


创建第一个数字的列表,.eg

    - set_fact:
        time: "{{ output.msg|
                  map(attribute='last-heard-processing-time')|
                  map('regex_replace', '^(\\d+)\\s+.*$', '\\1') }}"

  time:
  - '18611'
  - '20375'
  - '20292'
  - '4'
  - '51'
  - '53'
  - '9'

然后结合更新的字典并连接列表

    - set_fact:
        out: "{{ out|d([]) +
                 [item.0|combine({'last-heard-processing-time': item.1})] }}"
      with_together:
        - "{{ output.msg }}"
        - "{{ time }}"

  out:
  - last-heard-processing-time: '18611'
    name: XXXX
    status: conn:Getting ALL
  - last-heard-processing-time: '20375'
    name: AAAA
    status: conn:Getting ALL
  - last-heard-processing-time: '20292'
    name: BBBB
    status: conn:Getting ALL
  - last-heard-processing-time: '4'
    name: CCCC
    status: conn:idle
  - last-heard-processing-time: '51'
    name: DDDD
    status: conn:idle
  - last-heard-processing-time: '53'
    name: EEEEE
    status: conn:idle
  - last-heard-processing-time: '9'
    name: FFFF
    status: conn:idle

更新时间属性的值是一个字符串。如果您想要一个整数,请添加int过滤器。

    - set_fact:
        time: "{{ output.msg|
                  map(attribute='last-heard-processing-time')|
                  map('regex_replace', '^(\\d+)\\s+.*$', '\\1')|
                  map('int') }}"

推荐阅读