Ansible中如何转义含等号的参数以避免k=v语法冲突?
问题原因
Ansible旧版本的参数预解析逻辑会扫描任务范围内所有的=字符,即便是YAML值内部的=也会被误判为同时使用了k=v简写语法和标准YAML语法,因此抛出冲突报错。你尝试的!unsafe标签作用是禁用目标值的Jinja2模板解析,和该预扫描逻辑无关,因此无法解决问题。
可行解决方案
方法1:Jinja字面量拆分等号(最通用)
将参数中的=替换为Jinja2字符串字面量表达式{{ '=' }},即可避开Ansible的预扫描检测,且最终传递给模块的参数值不会发生变化:
- name: install virtualenv pip: state: present name: mypackage virtualenv_python: /usr/bin/python3.6 virtualenv: "{{ perfdash_tools_venv_path }}" extra_args: "--extra-index-url{{ '=' }}https://myrepo"
方法2:变量中转
把带等号的参数提前定义为变量,Ansible不会对变量内部的内容做k=v语法扫描:
# 变量可定义在playbook vars、inventory、角色defaults等任意位置 pip_extra_args: "--extra-index-url=https://myrepo" # 任务中直接引用变量即可 - name: install virtualenv pip: state: present name: mypackage virtualenv_python: /usr/bin/python3.6 virtualenv: "{{ perfdash_tools_venv_path }}" extra_args: "{{ pip_extra_args }}"
方法3:升级Ansible版本
该解析逻辑缺陷在Ansible-core 2.12及之后的正式版本中已被修复,升级到对应版本后原写法无需任何转义即可正常运行。
内容的提问来源于stack exchange,提问作者rrauenza
相关产品推荐
相关产品推荐

