Ansible regex_replace过滤器不起作用

时间:2018-01-05 17:09:42

标签: regex ansible

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

我在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') }}"

你有一个想法,我的方法出了什么问题?

1 个答案:

答案 0 :(得分:3)

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

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

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

您可以利用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"
}