Ansible调用mssql_script查询SQL Server执行报错排查
问题根因
报错核心原因是模块使用场景不匹配。community.general.mssql_script 是依赖Python运行环境、pymssql驱动的模块,仅支持在有标准Python环境的节点(Ansible控制节点、Linux目标节点)上执行,不支持直接下发到Windows目标主机运行。
你将任务下发到Windows主机组执行时,Ansible对Windows主机会默认使用PowerShell作为远程执行解释器,直接把模块的Python代码交给PowerShell解析,才会出现你看到的一系列语法报错:Python的函数定义、异常捕获、比较运算符语法全部不符合PowerShell语法规则,和WINRM连通性、SQL账号权限、SQL服务运行状态没有关系。
修复方案
你可以二选一调整配置:
- 方案1:将SQL查询任务放在Ansible控制节点本地执行,不下发到Windows目标机。修改后的playbook参考如下:
- hosts: localhost gather_facts: no connection: local collections: - community.general tasks: - name: Check DB connection community.general.mssql_script: login_user: "testadmin" login_password: "test@12345" login_host: "xxxxxxxx\SQLEXPRESS" login_port: "1433" db: master script: "SELECT 1"
执行前先在Ansible控制节点安装依赖:pip install pymssql
- 方案2:如果必须在Windows目标侧发起SQL查询,不要使用
community.general.mssql_script模块,换成Windows原生适配的模块实现:比如用community.windows.win_powershell调用.NET SQL客户端执行查询,或者用ansible.windows.win_shell调用系统自带的sqlcmd命令行工具执行语句。
额外注意事项
- SQL Server Express命名实例默认不监听1433固定端口,会使用动态端口分配策略。你配置里
login_host带了\SQLEXPRESS实例名,如果后续出现连接超时问题,可以先去掉login_port参数让驱动自动解析实例对应端口,或者提前确认实例实际监听的端口号再填写。 - 不要尝试给Windows主机强行指定Python解释器运行该模块,Windows侧Python环境的依赖适配、权限坑较多,稳定性远不如本地执行或者使用Windows原生模块。
内容的提问来源于stack exchange,提问作者ssethi
相关产品推荐
相关产品推荐

