以下是问题陈述:
假设我在EC2实例A上,并运行Ansible脚本执行以下任务:
1. Create an EC2 instance B
2. SSH into it
3. Trigger an Ansible script which is on B, with the simple `ansible-playbook <pb_on_B>.yml` [B is being provisioned from an AMI]
那么,如果在任务3开始后实例A被终止会发生什么?
在B中触发的Ansible脚本是否会完成?
答案 0 :(得分:3)
如果在任务3开始后实例A被终止,那么会发生什么?
在B中触发的Ansible脚本是否会完成?
你无法确定100%确定会发生什么。
这取决于shell配置(例如bash中的APIResults< T >
),SSH守护程序配置(TMOUT
,TCPKeepAlive
参数),时间,网络条件以及A是否会关闭会话with(ClientAliveInterval
)或drop而不通知A。
最有可能的是,剧本执行会被打断。
如果B上的SSH守护程序无法联系A上的SSH客户端(例如打印出Ansible执行日志)并且它获取了TCP FIN
数据包,它将丢弃会话以终止SSH会话&#39; s子进程,包括shell和RST
。但是,会话可能会在超时之前保持活动状态,并且剧本可能会在发生之前完成。
如果通过nohup
command(或ansible-playbook
或ansible-playbook
会话)调用screen
可执行文件,则不会被中断SSH会话断开(和shell会话关闭)。
注意:使用tmux
时,标准输出将重定向到文件nohup
。请参阅this question下的答案以了解相关选项。
同时检查Unix.SE上的this answer,其中描述了命令背后的技术细节。
答案 1 :(得分:2)
Ansible提供的Ansible任务是否可以在没有SSH的远程主机上运行?
是的,ansible-pull:
如果您想要反转Ansible的体系结构,以便节点检入中心位置,而不是将配置推送到它们,您可以。
ansible-pull是一个小脚本,它将从git中检出配置指令的repo,然后针对该内容运行ansible-playbook。
答案 2 :(得分:1)
如果想要保留实例B中的SSH会话,而不必担心实例A的生命/死亡,您可以尝试在实例B的tmux中运行您的ansible播放。您的工作流将像这样修改
apt-get install tmux
tmux new -s ansible
ansible-playbook <pb_on_B>.yml