如何处理Ansible中init脚本的更改?

时间:2014-06-22 11:47:29

标签: init ansible ansible-playbook

我对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处理程序在操作发生后响应任务的结果,这意味着新脚本已经复制到旧脚本上,可能会阻止服务停止和重新启动。

我该如何处理?

2 个答案:

答案 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

我还没找到指标应该是什么。所以随时更新。