我对Ansible比较新,我创建了一个可以在'裸'服务器上安装Tomcat配置的playbook。我想知道如何解决能够更新init.d脚本的问题,同时避免在剧本开始时停止服务,而脚本没有变化。这是基本的剧本:
- name: stop tomcat service
service: name=my_service state=stopped
- name: copy init.d script
template: src=script.j2 dest=/etc/init.d/my_service
- name: do other tasks here
- name: start tomcat service
service: name=my_service state=restarted
即使没有任何变化,此剧本也将始终停止并启动该服务。 我希望剧本做的只是在实际变化时停止并启动服务。
我知道我可以使用处理程序(需要查看更多),但我需要在复制NEW脚本之前使用OLD init.d脚本停止服务。 AFAIK处理程序在操作发生后响应任务的结果,这意味着新脚本已经复制到旧脚本上,可能会阻止服务停止和重新启动。
我该如何处理?
答案 0 :(得分:1)
任何设置为通知处理程序的任务都将在游戏结束时完成。
http://docs.ansible.com/playbooks_best_practices.html#task-and-handler-organization-for-a-role
- name: Copy init.d script
template: src=script.j2 dest=/etc/init.d/my_service
notify: start tomcat service
handlers:
- name: start tomcat service
service: name=my_service state=restarted
您可能希望使用旧脚本来处理旧脚本,使用旧脚本停止服务,以及使用处理程序复制新脚本的其他游戏。
答案 1 :(得分:1)
根据我从上述评论中学到的内容,我猜这个剧本的最佳配置应该类似于下面的内容。我仍然无法及时停止服务,以便 copy init script 任务运行,但只有在任务运行时才会停止。
- tasks:
- name: do various tasks here
notify: restart tomcat service
- name: stop tomcat service
service: name=tomcat state=stopped
when: {{ indicator_init_script_task_will_fire }}
- name: copy init.d script
notify: restart tomcat service
handlers:
- name: restart tomcat service
service: name=my_service state=restarted
我还没找到指标应该是什么。所以随时更新。