在编写和调试Ansible剧本时,典型的工作流程如下:
connector = new TransportConnector();
connector.setUri(new URI("mqtt://localhost:1883"));
connector.setName("MQTTConn");
broker.addConnector(connector);
connector = new TransportConnector();
connector.setUri(new URI("ws://localhost:1884"));
connector.setName("WSConn");
broker.addConnector(connector);
理想情况下,我希望在失败的任务上恢复执行,拥有库存以及之前任务收集的所有事实。它甚至可能吗?如何更快地进行剧本编写/调试?
答案 0 :(得分:39)
看看http://docs.ansible.com/playbooks_startnstep.html。
如果您想在特定任务中开始执行您的剧本,可以使用--start-at-task
选项执行此操作:
ansible-playbook playbook.yml --start-at-task="install packages"
以上内容将开始在名为“install packages”的任务中执行您的剧本。
或者,请查看以前的答案How to run only one task in ansible playbook?
最后,当一个游戏失败时,它通常会给你一些类似的东西:
PLAY RECAP ********************************************************************
to retry, use: --limit @/home/user/site.retry
使用--limit
命令,它应该从失败的任务中重试。
答案 1 :(得分:21)
未来的读者:
--limit @/home/user/site.retry
在这种情况下无济于事,.retry
仅存储发生故障的主机,因此只会针对发生故障的主机执行所有任务。
如果您使用的是最新版本(Ansible 2.x),则--start-at-task
不适用于roles
中定义的任务。
只需使用--step
标志就可以达到类似的效果,例如:ansible-playbook playbook.yml --step
。在执行每项任务之前,该步骤会询问您,您可以选择(N)o/(y)es/(c)ontinue
。
使用这种方法,您可以在需要时有选择地执行任务,并在修复后从故障点继续执行。
答案 2 :(得分:1)
未来的未来读者:
从Ansible 2.4.2.0开始,--start-at-task
适用于在我创建的角色中定义的任务。
愤怒的团队不愿意解决这个问题,他们建议您保持角色等幂并重演整个剧本,我没有时间这样做。在我的角色中,我并没有使用@JeremyWhiting之类的大量事实,因此对于我来说,我可以使用此--start-at-task
功能。
但是,这仍然是手动任务,因此我写了一些ansible rpm并添加了遵循以下基本步骤的“恢复”功能:
Ansible团队不愿意创建此基本(且非常有用)功能,因此唯一的选择是通过一些bash脚本将其合并在一起。