问题描述
我们需要使用 Ansible 在 Azure Linux VM 上托管的 Azure sql 数据库(不是托管实例数据库风格)上运行一系列 T-sql 语句(以创建数据库对象和惰性数据)。
我们成功测试了我们可以并从安装了 odbc 驱动程序的 Linux VM 运行 sql 命令。但是,当我们尝试使用 Ansible 从同一 Linux VM 运行 sql 脚本时,会出现连接超时错误。
Ansible 使用 ssh(端口 22)连接到远程主机。 sql 服务器在端口 1433 上进行通信。
我们正在尝试做的事情是否得到 Ansible 的支持? 如果支持,请有人向我们指出如何实现这一点。
谢谢
解决方法
默认情况下,Ansible 同步运行任务,保持与远程节点的连接打开,直到操作完成。这意味着在剧本中,每个任务默认阻止下一个任务,也就是后续任务在当前任务完成之前不会运行。这种行为会带来挑战。 例如,完成任务所需的时间可能比 SSH 会话允许的时间长,从而导致超时。或者您可能希望在并发执行其他任务时在后台执行长时间运行的进程。异步模式可让您控制长时间运行的任务的执行时间。
Async:async 用于显式设置您希望应用于此任务的超时。我们可以为特定任务设置自定义超时,而不是依赖于连接方法超时。 异步任务将根据其异步值运行直到完成、失败或超时。
Poll:poll 是一个值,playbook 将坚持任务直到它完成、失败或超时。对于长时间运行的异步任务,最好设置 poll=0,这样 Ansible 可以在启动当前任务后立即跳转到下一个任务,而无需等待结果。
重试次数:您想要重试检查作业状态直到超时或宣布失败的次数。例如,如果您设置了 retries=20,它将每 10 秒(如果 poll=10)尝试检查作业状态 20 次。简而言之,它总共会等待任务完成 200 秒。
这是一个例子。
---
-
hosts: dbhost
name: "Import MySQL database"
tasks:
-
async: 2100
name: "Start database import"
poll: 0
register: import_db
shell: "mysql {{ MYSQL_DATABASE }} < /backups/database_dump.sql"
您还可以参考 Asynchronous actions and polling 的 ansible 官方文档。