gpt4 book ai didi

带有多个引号的 Ansible 多行字符串

转载 作者:行者123 更新时间:2023-12-04 10:07:25 24 4
gpt4 key购买 nike

我正在尝试使用 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 "{{ 这样的序列时,引号就消失了......

我的问题是:

  1. 谁能告诉我为什么会这样?
  2. 有人可以告诉我如何避免这个问题吗?我尝试了多行字符串(使用双引号、单引号、> 折叠等)- 结果相同...

[ 编辑:在查看可能导致此问题的所有最新更改时,我记得启用了 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"
}

]

最佳答案

我能够在 github 上得到答案- 非常感谢 sivel!

我也贴在这里,供引用。

“[re] 是上游 jinja2 的问题,已在 jinja2 2.11 中解决。”

更多与该问题相关的链接:参见 herehere .

关于带有多个引号的 Ansible 多行字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com