Ansible 带多引号的可转换多行字符串

Ansible 带多引号的可转换多行字符串,ansible,yaml,jinja2,multiline,multilinestring,Ansible,Yaml,Jinja2,Multiline,Multilinestring,我正在尝试使用Ansible配置Mikrotik路由器-作为该任务的一部分,我需要生成发送到路由器的实际命令。不知怎的,有些引语只是。。。Ansible解析后从我的字符串中消失 [编辑-这似乎与jinja2_native有关。有关详细信息,请参阅问题末尾] 我所能构建的展示问题的最小示例如下: - hosts: localhost gather_facts: false tasks: - vars: port: 20200 cmd: >

我正在尝试使用Ansible配置Mikrotik路由器-作为该任务的一部分,我需要生成发送到路由器的实际命令。不知怎的,有些引语只是。。。Ansible解析后从我的字符串中消失

[编辑-这似乎与
jinja2_native
有关。有关详细信息,请参阅问题末尾]

我所能构建的展示问题的最小示例如下:

- hosts: localhost
  gather_facts: false
  tasks:
  - vars:
      port: 20200
      cmd: >
        add chain=dstnat && dst-port="{{port}}"
        comment="%TR% - {{ansible_host}} - SSH for {{inventory_hostname}}" 
        dst-port="{{ port }}" protocol=tcp 
        }'
    debug:
      msg: "{{cmd}}"
运行此剧本时,结果如下:

# ansible-playbook test.yml 
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [localhost] *****************************************************************************************************************

TASK [debug] *********************************************************************************************************************
Wednesday 29 April 2020  23:07:52 +0300 (0:00:00.052)       0:00:00.052 ******* 
ok: [localhost] => {
    "msg": "add chain=dstnat && dst-port=\"20200\" comment=\"%TR% - 127.0.0.1 - SSH for localhost  dst-port=20200\" protocol=tcp  }'\n"
}
注意一些引号是如何消失的,因此命令中的参数数量完全改变了。(当然,我是在花了几个小时排除故障并想知道为什么命令失败后才注意到这一点的…)

有趣的是,如果我稍微修改一下文本,其他引号就会消失:

- hosts: localhost
  gather_facts: false
  tasks:
  - vars:
      port: 20200
      cmd: >
        add chain=dstnat && dst-port="{{port}}"
        comment="{{ansible_host}} - SSH for {{inventory_hostname}}" 
        dst-port="{{ port }}" protocol=tcp 
        }'
    debug:
      msg: "{{cmd}}"
    tags: 
    - networking

# ansible-playbook test.yml 
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [localhost] *****************************************************************************************************************

TASK [debug] *********************************************************************************************************************
Wednesday 29 April 2020  23:12:12 +0300 (0:00:00.031)       0:00:00.031 ******* 
ok: [localhost] => {
    "msg": "add chain=dstnat && dst-port=\"20200 comment=127.0.0.1 - SSH for localhost  dst-port=20200\" protocol=tcp  }'\n"
}
似乎每当我有一个像
}“text_here”{{{
这样的序列时,引号就不见了

我的问题是:

  • 谁能告诉我为什么会这样
  • 有人能告诉我如何避免这个问题吗?我尝试过多行字符串(双引号,单引号,>折叠等)-同样的结果
  • [编辑:在查看可能导致此问题的所有最新更改时,我记得启用了
    jinja2_native
    。如果正确,在
    ansible.cfg
    中将
    jinja2_native
    设置回False后,问题就消失了

    # ansible-playbook test.yml 
    [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
    
    PLAY [localhost] *****************************************************************************************************************
    
    TASK [debug] *********************************************************************************************************************
    Wednesday 29 April 2020  23:55:29 +0300 (0:00:00.029)       0:00:00.029 ******* 
    ok: [localhost] => {
        "msg": "add chain=dstnat && dst-port=\"20200\" comment=\"127.0.0.1 - SSH for localhost \"  dst-port=\"20200\" protocol=tcp  }'\n"
    }
    

    ]

    我得到了一个答案——非常感谢西维尔

    我也张贴在这里,供参考

    “该【re】是与上游jinja2的一个问题,该问题在jinja2.11中得到解决。”


    与此问题相关的更多链接:请参阅和。

    ansible v2.9.5/python 3.6.9=>我无法重现您的问题。字符串的输出与预期完全一致。@Zeitounator-我还有一个可能相关的配置更改。请参阅我稍后关于
    jinja2_native
    的编辑,谢谢,因为我要发布:“我仍然无法重现这个问题":)@Zeitounator-我应该在问题中提到这一点,但我使用的是在Ubuntu 18.04上通过apt安装的ansible。而Ubuntu repos中的jinja2似乎仍在1.10版上。你能分享一些关于你的环境的信息吗?也许是我切换的时候了…:)我总是通过pip安装ansible,从不通过系统包,等等r发行版。这更方便,通过VirtualNVS和用户安装,您可以为系统上的任何用户管理任意多个版本和库依赖项布局。这是我角色的CI的一个版本,看起来我绝对应该考虑更改我的环境:)。非常感谢您提供的所有详细信息ls!