【问题标题】:How to handle changes to init scripts in Ansible?如何处理 Ansible 中初始化脚本的更改?
【发布时间】:2014-06-27 05:48:48
【问题描述】:

我对 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 也会始终停止和启动服务。 我希望剧本做的只是在有实际变化时停止和启动服务。

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

我该如何处理?

【问题讨论】:

    标签: init ansible ansible-playbook


    【解决方案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
    

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

    【讨论】:

    • 您忘记定义处理程序start tomcat service。这应该添加到您的示例中。如果没有处理程序,notify 语句将不起作用。
    • 好的,我知道这种方法在没有变化的情况下会阻止重启,但是如果新的init脚本无法停止旧脚本启动的服务怎么办?为了论证的缘故,假设新脚本在与旧文件不同的位置查找 pid 文件。按照我的理解,新脚本将被复制到旧脚本上,并且处理程序将使用新脚本重新启动由旧脚本启动的服务,然后该服务将失败。
    • @ChristianBerendt 我在此处进行了编辑以包括缺少的处理程序任务。
    • @hepabolu 你可以在你的所有任务中notify:,这样如果"stop tomcat service"成功,通知就会触发。如果"copy init.d script"成功,就会触发notify。
    • @Mxx,感谢 cmets。我试图用一些额外的问题创建一个摘要,但它出现在这个答案之上,不知道为什么。如果您可以详细说明其他答案,请执行。
    【解决方案2】:

    根据我从上面的 cmets 中学到的东西,我猜这个 playbook 的最佳配置应该类似于下面的配置。我仍然不知道如何及时停止服务以运行 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-29
      • 2021-01-26
      • 2014-10-05
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      相关资源
      最近更新 更多