Ansible hosts文件ansible_ssh_pass参数#号转义方法
根因说明
Ansible 2.9.x 版本的INI格式主机清单解析规则和标准Shell的引号、转义逻辑不兼容:
- 双引号包裹的参数值内,
#仍会被识别为行注释起始符,后续内容会被直接截断,不会被读入参数值 - 双引号内部的反斜杠不会被解析为转义字符,反而会被当作密码的一部分存入参数
- 之前尝试的两种写法,最终解析到的密码值都不是完整的
airtel#121,必然触发认证失败 - 额外注意:
ansible.netcommon.network_cli连接插件对接网络设备时,优先识别ansible_password作为登录密码参数,旧版面向Linux SSH连接设计的ansible_ssh_pass在网络模块场景下存在适配问题,建议直接替换。
可用配置方案
以下方案均在Ansible 2.9.6环境下验证通过:
方案1:INI格式清单正确写法
不要用双引号包裹参数值,直接对#加反斜杠转义,同时替换为网络插件兼容的密码参数:[devices] 10.10.10.10 ansible_connection=ansible.netcommon.network_cli ansible_network_os=cisco.ios.ios ansible_user=abcd ansible_password=airtel\#121注意:反斜杠和
#之间不能有空格,该行末尾不要追加其他注释内容。方案2:改用YAML格式清单(最推荐,无转义成本)
YAML格式清单的解析逻辑更规范,不存在INI格式的注释截断bug,不需要对#做任何转义:all: children: devices: hosts: 10.10.10.10: ansible_connection: ansible.netcommon.network_cli ansible_network_os: cisco.ios.ios ansible_user: abcd ansible_password: "airtel#121"调用时和原有INI清单用法一致,通过
-i 清单文件名指定即可。方案3:将连接参数移到组变量文件
把密码等连接参数从INI清单中移出,放到YAML格式的组变量文件中,同样可以避开转义问题:- 在playbook同级目录创建
group_vars/devices.yml文件,写入配置:ansible_connection: ansible.netcommon.network_cli ansible_network_os: cisco.ios.ios ansible_user: abcd ansible_password: airtel#121 - 原INI清单只保留IP分组即可,不需要写任何连接参数:
[devices] 10.10.10.10
- 在playbook同级目录创建
连通性验证
配置完成后先通过ad-hoc命令快速验证,不需要直接运行完整playbook:
ansible devices -i hosts -m cisco.ios.ios_command -a "commands='show version'"
命令正常返回设备版本信息即代表配置正确。
内容的提问来源于stack exchange,提问作者vaibhav singhal
相关产品推荐
相关产品推荐

