用 jinja2 ansible 裁剪一个子字符串

ansible crop a substring with jinja2

我想在 ansible 中裁剪一个 sting,最好使用 replace 命令。 “db-FFREG.domain.inet”应更改为“db-FFREG”。我已经找到了一个 split 的解决方案,它正在工作。但我想用 regex

来做到这一点

解决方案有效,但不够优雅:

---
- hosts: localhost
  gather_facts: no
  vars:
    hostname: db-FFREG.domain.inet

  tasks:
    - name: Change hostname into ORACLE SID
      set_fact:
        myOracleSid: "{{hostname.split('.') }}"

    - debug:
        msg:
          -  "ORACLE_SID: {{ myOracleSid[0] }}"

我更喜欢的解决方案是使用 jinja2 - 没有错误消息,但不会裁剪任何内容:

---
- 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 }}"

嗯,这个成功了! 这比我想象的要容易!

---
- 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 }}"

如果要从字符串的 end 中删除 .domain.inet,则需要使用正则表达式:

{{ hostname | regex_replace('\.domain\.inet$', '') }}

注意使用了 regex_replace 函数,点被转义以匹配文字点,$ 用于匹配字符串的结尾。

要删除第一个点之后的所有内容,请使用

{{ hostname | regex_replace('\..*', '') }}

其中 \. 匹配文字 . 并且 .* 匹配除换行符以外的任何零个或多个字符。