我尝试使用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') }}"
你有一个想法,我的方法出了什么问题?
答案 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"
}