6

我对 Ansible 比较陌生,我创建了一个可以在“裸”服务器上安装 Tomcat 配置的剧本。我想知道如何解决能够更新 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

即使没有任何更改,此 playbook 也将始终停止并启动服务。我希望剧本做的只是在有实际变化时停止和启动服务。

我知道我可以使用处理程序(需要进一步研究),但我需要在复制 NEW 脚本之前使用 OLD init.d 脚本停止服务。AFAIK 处理程序在操作发生后响应任务的结果,这意味着新脚本已经复制到旧脚本上,并且可能会阻止服务停止和重新启动。

我该如何处理?

4

2 回答 2

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

您可能希望通过处理程序使用旧脚本来使用旧脚本,该处理程序使用旧脚本停止服务,并使用不同的方式使用处理程序复制新脚本。

于 2014-06-22T15:46:51.593 回答
1

根据我从上面的评论中了解到的情况,我猜这个剧本的最佳配置应该类似于下面的配置。我仍然不知道如何及时停止服务以运行复制初始化脚本任务,但只有当任务运行时。

- 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

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

于 2014-06-26T21:48:48.527 回答