查找模块无法使用regex_replace过滤器计算模板的值

时间:2017-07-04 12:56:25

标签: ansible

这似乎是一个错误。但是在向ansible的github项目发布问题之前,我在这里问。

Playbook:

- hosts: localhost
  tasks: 
    - template: >
        dest=/tmp/test.xml
        src=test.xml.j2
    - debug: msg="{{ lookup( 'template', 'test.xml.j2' ) }}"
  vars:
    - command: 'echo "word1 word2"'

test.xml.j2

<command>ssh {{ command| regex_replace('"(.*)"', '"\\"\1\\""') }} #1</command>
<command>ssh {{ command| regex_replace('"(.*)"', '"\\"\\1\\""') }} #2</command>

测试命令

ansible-playbook test.yml -D -C

预期结果:两项任务的结果相同

实际结果(ansible 2.3.1.0):

  • 当转义一次时,模板模块无法显示第一个参考
  • 当转义两次时,查找模块无法取消引用第二个引用

1 个答案:

答案 0 :(得分:1)

已知

template操作和template查找在几种情况下会产生不同的结果。

您可以随时提出问题。

作为解决方法,您可以在模板中使用set

{% set repl = '"\\"\\1\\""' %}
<command>ssh {{ command| regex_replace('"(.*)"', '"\\"\1\\""') }} #1</command>
<command>ssh {{ command| regex_replace('"(.*)"', '"\\"\\1\\""') }} #2</command>
<command>ssh {{ command| regex_replace('"(.*)"', repl) }} #3</command>

此处#3通过操作和查找提供相同的结果:

- template:
    dest: /tmp/test.xml
    src: test.xml.j2
- copy:
    content: "{{ lookup( 'template', 'test.xml.j2' ) }}"
    dest: /tmp/test2.xml

结果:

<command>ssh echo "\"\"" #1</command>
<command>ssh echo "\"word1 word2\"" #2</command>
<command>ssh echo "\"word1 word2\"" #3</command>

<command>ssh echo "\"word1 word2\"" #1</command>
<command>ssh echo "\"\1\"" #2</command>
<command>ssh echo "\"word1 word2\"" #3</command>