Ansible regex_替换筛选器不工作
我尝试使用Ansible regex_replace从状态消息中过滤子字符串“application_1514971620021_4505”。 在shell中,消息如下所示: 我在Ansible中运行此代码:Ansible regex_替换筛选器不工作,regex,ansible,Regex,Ansible,我尝试使用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.RELE
---
- 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') }}"
你知道我的方法有什么问题吗 您的第一个问题是,
*
似乎与换行符不匹配。考虑这一点:
- debug:
msg: "{{ admininfo.stdout | regex_replace('.*application', 'foo') }}"
这将用foo
替换application
,但标题行将保持不变。由于^
将正则表达式锚定到文本的开头(而不是行首),因此表达式将永远不匹配
您可以利用ansible已经在注册输出的stdout\u line
键中为您提供了单独的行这一事实。在本例中,您将使用以下内容:
- debug:
msg: >
{{ admininfo.stdout_lines[2] | regex_replace('^.*(application_\d.*_\d*)\s.*', '\1') }}
请注意,我对引用和转义的方式做了一些更改。特别是,我使用折叠文字运算符
代替双引号,您需要使用\1
代替替换字符串的\\1
这给了我:
ok: [localhost] => {
"msg": "application_1514971620021_4505\n"
}
第一个问题是,
*
似乎与换行符不匹配。考虑这一点:
- debug:
msg: "{{ admininfo.stdout | regex_replace('.*application', 'foo') }}"
这将用foo
替换application
,但标题行将保持不变。由于^
将正则表达式锚定到文本的开头(而不是行首),因此表达式将永远不匹配
您可以利用ansible已经在注册输出的stdout\u line
键中为您提供了单独的行这一事实。在本例中,您将使用以下内容:
- debug:
msg: >
{{ admininfo.stdout_lines[2] | regex_replace('^.*(application_\d.*_\d*)\s.*', '\1') }}
请注意,我对引用和转义的方式做了一些更改。特别是,我使用折叠文字运算符
代替双引号,您需要使用\1
代替替换字符串的\\1
这给了我:
ok: [localhost] => {
"msg": "application_1514971620021_4505\n"
}
这个
^([^.]*).
作用于哪个字符串?如果没有
,它将删除该行。如果总是有一个
,最好使用这个\..*
替换为nothing。您提到的字符串仅用于测试-要知道,regex\u替换工作正常。主代码中正则表达式的问题:regex_replace('^.*(application_d.*.\ud*))\s、 *'-这是正确的,但不适用于AnsibleWhat's the确切的问题是什么?这在问题中有很好的描述。请不要发布文本图片。只发布文本本身。这使得阅读更容易,搜索更容易,如果有人想在编写答案时测试问题,复制和粘贴更容易。字符串是什么^([^.]*).
是否在作用?如果没有
,它将删除该行。如果总是有
,最好使用此\..*
替换为空。您提到的字符串仅用于测试-要看,该regex\u替换有效。我对主代码中regex表达式的问题:regex\u replace(“^.*(应用程序.\ud..\ud*)\s、 *'-这是正确的,但不适用于AnsibleWhat's the确切的问题是什么?这在问题中有很好的描述。请不要发布文本图片。只发布文本本身。这使阅读更容易,搜索更容易,如果有人想在编写答案时测试,复制和粘贴更容易。谢谢!这是我的这是正确的答案。我按照你的建议编辑了我的代码,它很有效!!!:-debug:msg=“{{admininfo.stdout_-lines[2]| regex_-replace('^..*(application\d.*.\s.*,'\1')}”谢谢!这是正确的答案。我按照你的建议编辑了我的代码,它很有效!!!:-debug:msg=“{{admininfo.stdout_-lines[2]| regex|replace('^)*(应用程序\ud.*\ud*)\s.'','\1')}”