You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式的组变量文件中,同样可以避开转义问题:

    1. 在playbook同级目录创建group_vars/devices.yml文件,写入配置:
      ansible_connection: ansible.netcommon.network_cli
      ansible_network_os: cisco.ios.ios
      ansible_user: abcd
      ansible_password: airtel#121
      
    2. 原INI清单只保留IP分组即可,不需要写任何连接参数:
      [devices]
      10.10.10.10
      
连通性验证

配置完成后先通过ad-hoc命令快速验证,不需要直接运行完整playbook:

ansible devices -i hosts -m cisco.ios.ios_command -a "commands='show version'"

命令正常返回设备版本信息即代表配置正确。

内容的提问来源于stack exchange,提问作者vaibhav singhal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:12:30