我无法在Ansible的regex_replace过滤器中找到更多文字(点)的方法。这是任务:
vsn_list=['1.23', '1.8.1.1']
print sorted( [ [int(v) for v in x.split(".")] for x in vsn_list ] )
我的目的是匹配并替换整个网址,例如 test.staging.domain.com 及其第一部分(示例中的测试)。
Ansible会报告以下错误:
- name: Display database name
debug:
msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}"
tags: [debug]
我们可能错了,但这个看起来可能是一个问题 缺少报价。始终引用模板表达式括号 开始一个价值。
如何在Ansible debug:
msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}"
^ here
过滤器中匹配文字?
答案 0 :(得分:6)
它实际上可以通过双反斜杠来逃避文字:
- name: Create database name and username
set_fact:
db_name: "{{ vhost | regex_replace('([^\\.]*)\\.(.+)$', '\\1') }}_stg"
上面的正则表达式正常工作。第一个捕获组提取URL的第一部分直到第一个点,整个正则表达式捕获整个URL。通过 test.staging.domain.co 传递它只会产生测试。
答案 1 :(得分:3)
我试图做同样的事情,最后这样做:
- name: Set hostname (minus the domain)
debug: msg={{ inventory_hostname | regex_replace('^([^.]*).*', '\\1') }}
*编辑,找到了更好的方法:
- name: Set hostname (minus the domain)
debug: msg={{ inventory_hostname.split('.')[0] }}
答案 2 :(得分:1)
对于逃避字符可能有些不妥,但是有一种无法逃脱的方法来编写字面点:
[.]
所以你的正则表达式可以写成
(.+[.])(.+)$
大多数字符在字符类中都会失去特殊含义,而点是其中之一。