如何用Ansible Shell模块编写Playbook执行Linux版SQL Server命令
Ansible通过Shell模块操作Linux环境SQL Server操作指引
前置检查
首先确保两个前提条件满足:
- 部署SQL Server的Linux被控端已安装
mssql-tools组件,可正常调用sqlcmd命令行工具 - Ansible控制端与被控端SSH连通正常,使用的数据库账号拥有对应库的操作权限
可用Playbook示例
以下是可直接复用的Playbook代码,默认实现查询SQL Server版本,你可以修改对应变量适配自己的业务需求:
--- - name: 执行Linux SQL Server SQL命令 hosts: mssql_hosts # 替换为你的Inventory中对应主机/主机组名称 gather_facts: false vars: # 数据库连接配置,生产环境密码建议用Ansible Vault加密存储 mssql_login_user: "sa" mssql_login_pwd: "YourStrongPassword2024!" mssql_db: "master" # 要执行的SQL语句,多语句用分号分隔即可 target_sql: "SELECT name, database_id FROM sys.databases;" tasks: - name: 调用sqlcmd执行SQL ansible.builtin.shell: | /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U {{ mssql_login_user }} -P '{{ mssql_login_pwd }}' -d {{ mssql_db }} -Q "{{ target_sql }}" register: sql_result # 可添加no_log: true避免密码输出到执行日志 - name: 输出SQL执行结果 ansible.builtin.debug: var: sql_result.stdout_lines
常见调整说明
- 若使用系统集成身份认证登录SQL Server,将
sqlcmd命令中的-U {{ mssql_login_user }} -P '{{ mssql_login_pwd }}'参数替换为-E即可,无需传入账号密码 - 若被控端
sqlcmd路径不一致,可在被控端执行which sqlcmd获取实际路径后替换命令中的路径 - 执行数据变更类SQL前,建议先在测试环境验证逻辑正确性,避免误操作
- 禁止将数据库密码等敏感信息明文写在Playbook中,推荐使用Ansible Vault加密敏感变量
内容的提问来源于stack exchange,提问作者lilouzi
相关产品推荐
相关产品推荐

