在ansible中用多个值替换多个模式

she*_*rri 3 python regex json ansible

我在ansible中使用regex_replace过滤器。我可以让它工作,但它真的很麻烦。这就是我正在做的

- set_fact:
    variable: "{{ value | regex_replace("84","89") | regex_replace("76","78") | regex_replace("45","23"}}"
Run Code Online (Sandbox Code Playgroud)

有没有一种方法,我可以通过管道 regex_replace 一次并用多个值替换多个模式。

Vla*_*tka 7

问:“我可以通过管道 regex_replace 一次并用多个值替换多个模式吗?”

答:不,这是不可能的。但是,您可以循环执行此操作。例如,

  vars:

    my_var: ABCDEFGH

  tasks:

    - set_fact:
        my_var: "{{ my_var|regex_replace(item.regex, item.replace) }}"
      loop:
        - {regex: 'A', replace: '1'}
        - {regex: 'C', replace: '3'}
        - {regex: 'E', replace: '5'}
    - debug:
        var: my_var
Run Code Online (Sandbox Code Playgroud)

给出

    my_var: 1B3D5FGH
Run Code Online (Sandbox Code Playgroud)

您可以最小化代码。例如,下面的任务给出相同的结果

    - set_fact:
        my_var: "{{ my_var|regex_replace(item.0, item.1) }}"
      loop:
        - ['A', '1']
        - ['C', '3']
        - ['E', '5']
Run Code Online (Sandbox Code Playgroud)

问:“我们能否使其不将替换的值作为下一个循环项的输入?”

答:是的。我们可以。在这种情况下更好的结构是字典。例如,

    my_var: AB1
    regrep:
      'A': '1'
      '1': 'C'
Run Code Online (Sandbox Code Playgroud)

预期结果是“1BC”。我们不希望第一个字符替换为“C”。下面的 Jinja 表达式给出了你想要的

    - set_fact:
        my_var: |
          {% for x in  my_var %}
          {% if x in regrep %}
          {{ regrep[x] }}
          {%- else %}
          {{ x }}
          {%- endif %}
          {%- endfor %}
Run Code Online (Sandbox Code Playgroud)