【问题标题】:Ansible regex_replace filter does not workAnsible regex_replace 过滤器不起作用
【发布时间】:2018-01-05 17:09:41
【问题描述】:

我尝试使用 Ansible regex_replace 从状态消息中过滤子字符串“application_1514971620021_4505”。 在 shell 中,消息如下所示:

我在 Ansible 中运行这段代码:

---
- hosts: [npif]
  remote_user: root
  tasks:
    - block:

      - name: Admin submit check
        command: chdir=/usr/spring-xd-1.3.1.RELEASE-yarn/ bin/xd-yarn submitted
        register: admininfo

      - debug: msg="{{ admininfo.stdout }}"

      - debug: msg="{{ admininfo.stdout | regex_replace('^.*(application\_\d.*\_\d*)\s.*', '\\1') }}"

      become: yes
      become_user: ingestdev

debug: msg="{{ admininfo.stdout }}" 以不同于 shell 的格式返回状态消息:

ok: [npif] => {
    "msg": "  APPLICATION ID                  USER       NAME       QUEUE     TYPE  STARTTIME       FINISHTIME  STATE    FINALSTATUS  ORIGINAL TRACKING URL\n  ------------------------------  ---------  ---------  --------  ----  --------------  ----------  -------  -----------  ------------------------\n  application_1514971620021_4505  ingestdev  spring-xd  batch_cb  XD    1/3/18 2:49 PM  N/A         RUNNING  UNDEFINED    http://x.x.x.x:9394"
}

当我使用 regex_replace 运行第二个调试时,我得到与第一个调试输出相同的输出 - 没有应用 regex_replace 过滤器。正则表达式过滤器是正确的 - 我已经在外部对其进行了测试。基本上 Ansible 代码也可以正常工作 - 我已经用下面的行进行了测试,并按预期得到了“测试”。

- debug: msg="{{ 'test.home.com' | regex_replace('^([^.]*).*', '\\1') }}"

你有什么想法,我的方法有什么问题?

【问题讨论】:

  • ^([^.]*).* 作用于什么字符串?如果没有.,它将删除该行。如果总是有一个 . ,最好用这个 \..* 替换。
  • 您提到的字符串仅用于测试 - 看看, regex_replace 工作。我对主代码中正则表达式的问题: regex_replace('^.*(application_\d.*_\d*)\s.*' - 它是正确的,但不适用于 Ansible
  • 您遇到的具体问题是什么?
  • 问题中有很好的描述。
  • 请不要张贴图片的文字。只需发布文本本身。如果有人想在回答问题时进行测试,这将使其更易于阅读、更易于搜索并且更易于复制和粘贴。

标签: regex ansible


【解决方案1】:

您的第一个问题是 .* 似乎与换行符不匹配。考虑一下:

- debug:                                                                    
    msg: "{{ admininfo.stdout | regex_replace('.*application', 'foo') }}"  

这会将application 替换为foo,但会保持标题行不变。由于^ 将您的正则表达式锚定到 text 的开头(不是 line 的开头),因此您的表达式将永远不会匹配。

您可以利用 ansible 已经在您的注册输出的 stdout_lines 键中为您提供了单独的行这一事实。在这种情况下,你会使用类似的东西:

- debug:
    msg: >
      {{ admininfo.stdout_lines[2] | regex_replace('^.*(application_\d.*_\d*)\s.*', '\1') }}

请注意,我对引用和转义内容的方式进行了一些更改。特别是,我使用折叠文字运算符> 代替双引号,并且您需要使用\1 而不是\\1 作为替换字符串。

这给了我:

ok: [localhost] => {
    "msg": "application_1514971620021_4505\n"
}

【讨论】:

  • 谢谢!这是正确的答案。我按照您的建议编辑了我的代码并且它有效! : - 调试: msg="{{ admininfo.stdout_lines[2] | regex_replace('^.*(application_\d.*_\d*)\s.*', '\1') }}"
猜你喜欢
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2014-08-24
  • 2018-01-04
相关资源
最近更新 更多