简体   繁体   中英

Apache Graceful restart with Ansible

What is ideal ansible way to do a apache graceful restart?

   - name: Restart Apache gracefully 
      command: apachectl -k graceful

Ansible systemd module does the same? If not, what is the difference? Thanks !

- name: Restart apache service.
  systemd:
    name: apache2
    daemon_reload: yes
    state: restarted

What you can do with Ansible is to ensure that all established connections to Apache are closed ( drained in Ansible lingo).

Use the wait_for module with the condition to wait for drained connections on the particular host and port, with the state set to drained . See below:

- name: wait until apache2 connections are drained.
  wait_for:
   host: 0.0.0.0
   port: 80
   state: drained

Note: You can use this for all your Linux network services, which becomes very handy if you want to shutdown services in a particular order in your Ansible playbook.

The wait_for directive is useful to ensuring that Ansible does not run your playbook until specific steps are completed.

There is not support of graceful state at this moment in service or systemd modules because this is quite specific to certain services, status is limited to started , stopped , restarted reloaded and running . So now you need to use a command module as you wrote in the question to perform a graceful restart, this is the only proper solution.

However there is an issue to support custom status , perhaps someone will implement that soon.

The documentation for the Ansible service module is not clearly stating what "reloaded" state does but, I found that for standard Red Hat 7 install using service module "reloaded" state results in a graceful restart.

I was led to this solution by this Server Fault QA

You can verify by getting process list of the httpd processes prior running your playbook which triggers your handler.

ps -ef | grep httpd | grep -v grep

After your playbook runs and handler reloaded state for httpd service shows "changed", re-examine the process list again.

You should see the start times for all the child httpd (non-root) processes have updated while the root owned parent process's start time has stayed the same.

If you also look in the error log you should see an entry containing: "... configured -- resuming normal operations... "

And, finally, you can see this by examining the output of systemctl status for the httpd.service and see the apachectl graceful option was called:

sudo systemctl status httpd.service

My handler now looks like:

- name: "{{ service_name }} restart handler"
  become: yes
  ansible.builtin.service:
    service: "{{ service_name }}"
    # state: restarted
    state: reloaded

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM