【问题标题】:Ansible extract value using regexAnsible 使用正则表达式提取值
【发布时间】:2019-10-17 12:05:29
【问题描述】:

我有一个类似于下面的文件。

SITE "A" (id:1,bindings:http/*:80:,net.tcp/808:*,net.pipe/*,state:Stopped)
SITE "B" (id:2,bindings:https/*:344:,net.tcp/325:*,net.pipe/*,state:Started)
SITE "C" (id:3,bindings:http/:80:xyz.domain.com,http/*:80:xyz,http/*:80:seiging,http/*:80:seiging.domain.com,state:Started)
SITE "D" (id:4,bindings:http/:901:,http/*:80:actdaov,state:Started)
SITE "E" (id:5,bindings:https/:443:idu.domain.com,http/*:80:idu.domain.com,state:Started)

我想提取以下内容。

"A,id:1,",
"B,id:2,",
"C,id:3,http/:80:seiging.domain.com",
"D,id:4,",
"E,id:5,http/
:80:idu.domain.com",

第三个字段 - 如果 domain.com 存在,我需要提取它,否则它应该是空白的。如果存在多个 domain.com,那么我需要使用最后一个。

我尝试如下:

set_fact: inv_op="{{  item | regex_replace('SITE \\\"(.*)\\\" \((.*)\,bindings(.*)\,state.*', '\\1,\\2,\\3')  }}"

输出如下:

"A,id:1,:http/:80:,net.tcp/808:,net.pipe/",
"B,id:2,:https/
:344:,net.tcp/325:,net.pipe/", "C,id:3,:http/:80:xyz.domain.com,http/:80:xyz,http/:80:seiging,http/:80:seiging。 domain.com",
"D,id:4,:http/:901:,http/
:80:actdaov",
"E,id:5,:https/:443:idu.domain.com,http/*:80:idu.domain.com",

请指教

【问题讨论】:

    标签: regex ansible


    【解决方案1】:

    可以先创建字典。例如任务

    - set_fact:
        my_lines: "{{ lookup('file', 'data.csv').splitlines() }}"
    - set_fact:
        my_lists: "{{ my_lists|default([]) + [item.split(' ')] }}"
      loop: "{{ my_lines }}"
    - set_fact:
        my_dict: "{{ my_dict|default({})|
                     combine({item.1.1: {'id': item.2.split(',')[0].split(':')[1],
                                         'state': item.2.split(',')[-1].split(':')[1][:-1],
                                         'bindings': item.2.split(',')[1:-1]|
                                          map('regex_replace', 'bindings:', '')|list}})
                                          }}"
      loop: "{{ my_lists }}"
    

    给

    "my_dict": {
        "A": {
            "bindings": [
                "http/*:80:", 
                "net.tcp/808:*", 
                "net.pipe/*"
            ], 
            "id": "1", 
            "state": "Stopped"
        }, 
        "B": {
            "bindings": [
                "https/*:344:", 
                "net.tcp/325:*", 
                "net.pipe/*"
            ], 
            "id": "2", 
            "state": "Started"
        }, 
        "C": {
            "bindings": [
                "http/:80:xyz.domain.com", 
                "http/*:80:xyz", 
                "http/*:80:seiging", 
                "http/*:80:seiging.domain.com"
            ], 
            "id": "3", 
            "state": "Started"
        }, 
        "D": {
            "bindings": [
                "http/:901:", 
                "http/*:80:actdaov"
            ], 
            "id": "4", 
            "state": "Started"
        }, 
        "E": {
            "bindings": [
                "https/:443:idu.domain.com", 
                "http/*:80:idu.domain.com"
            ], 
            "id": "5", 
            "state": "Started"
        }
    }
    

    然后打印数据。例如任务

    “第三个字段 - 如果 domain.com 存在,我需要提取它,否则它应该是空白的。如果存在多个 domain.com,那么我需要取最后一个。” em>

    - debug:
        msg: |
          {{ item.key }},id:{{ item.value.id }},
          {%- if item.value.bindings|select('search', 'domain\.com')|list %}
          {{ item.value.bindings|select('search', 'domain\.com')|reverse|list|first }},
          {% endif %}
      loop: "{{ my_dict|dict2items }}"
    

    给予

    "msg": "A,id:1,\n"
    "msg": "C,id:3,http/*:80:seiging.domain.com,\n"
    "msg": "B,id:2,\n"
    "msg": "E,id:5,http/*:80:idu.domain.com,\n"
    "msg": "D,id:4,\n"
    

    【讨论】:

    • 在第三个 set_fact: my_dict, what is item,我看不到任何循环。我收到错误“项目”未定义
    • 对。我已经修复了循环。谢谢。
    • 我也尝试了下面的 ansible,正则表达式实际上是在正则表达式工具中工作,但不是在 ansible 中。它不会显示错误,但也不会提取 url。你能告诉我这里有什么问题吗? set_fact: inv_op="{{ item | regex_replace('^SITE \\\"(.*)\\\" ((.*)\,bindings:(.*):(\b\w*\b)\ .domain\.com\,(.*)state(.*)', '\\1,\\2,\\4') }}"
    • 这是三重扩展 1. Ansible "{{ 2. function( 3. regex。当然有可能,但为什么呢?抱歉,我不打算测试它。Keep it simple, stupid 并把regex/replace 到单独的变量中。见example。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多