Arky
Arky

Reputation: 380

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

Upvotes: 3

Views: 3818

Answers (3)

user3183018
user3183018

Reputation: 364

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

Upvotes: 0

Paul-Beyond
Paul-Beyond

Reputation: 1737

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.

Upvotes: 3

Baptiste Mille-Mathias
Baptiste Mille-Mathias

Reputation: 2169

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.

Upvotes: 1

Related Questions