如何在Ansible中使用Jinja2的replace过滤器通过正则裁剪字符串
Ansible 字符串裁剪解决方案
问题根因
之前的代码未生效是因为使用了Jinja2的普通replace过滤器,该过滤器仅支持固定字符串匹配替换,不会解析正则表达式,同时替换逻辑将匹配到的内容直接替换为空,也不符合获取前缀的需求。
可用实现方案
方案1:使用普通replace实现(固定后缀场景最简写法)
如果你的域名后缀固定为.domain.inet,直接用普通replace即可实现需求,不需要用到正则:
--- - hosts: localhost gather_facts: no vars: hostname: db-FFREG.domain.inet tasks: - name: Change hostname into ORACLE SID set_fact: myOracleSid: "{{ hostname | replace('.domain.inet', '') }}" - debug: msg: - "ORACLE_SID: {{ myOracleSid }}"
方案2:使用regex_replace正则实现(通用场景,适配任意后缀)
如果需要适配任意域名后缀,只取第一个.之前的内容,使用支持正则的regex_replace过滤器即可:
--- - hosts: localhost gather_facts: no vars: hostname: db-FFREG.domain.inet tasks: - name: Change hostname into ORACLE SID set_fact: myOracleSid: "{{ hostname | regex_replace('^([^.]*)\\..*$', '\\1') }}" - debug: msg: - "ORACLE_SID: {{ myOracleSid }}"
正则逻辑说明:
^([^.]*):匹配字符串开头所有非.的字符,存入第一个捕获组\\..*$:匹配第一个.之后到字符串结尾的所有内容\\1:将整个匹配结果替换为第一个捕获组的内容,即第一个.之前的前缀
内容的提问来源于stack exchange,提问作者WalterS777
相关产品推荐
相关产品推荐

