I want to get service like redis-server running status by Ansible.

I know how to use Ansible service module to stop or start system service. But how can I get the current service status?

2

10 Answers

You can also use the service_facts module.

Example usage:

- name: collect facts about system services service_facts: register: services_state - name: Debug debug: var: services_state 

Example output:

... TASK [Debug] *************************************************************************************************************************************************************************************************************** ok: [local] => { "services_state": { "ansible_facts": { "services": { "cloud-init-local.service": { "name": "cloud-init-local.service", "source": "systemd", "state": "stopped" }, "firewalld.service": { "name": "firewalld.service", "source": "systemd", "state": "stopped" }, ... } } } } 
8

Just run the task service: name=httpd state=started with the option --check. This tells you, if the service needs to be started, which means that it is down. If the task shows no change, it is up already.

Example service is down, changed is true, because it needs to be started:

$ ansible -m service -a 'name=rpc/bind state=started' --check host host | SUCCESS => { "changed": true, "msg": "service state changed" } 

Example service is up, changed is false, because nothings need to be done:

$ ansible -m service -a 'name=system-log state=started' --check host host | SUCCESS => { "changed": false, "name": "system-log", "state": "started" } 

A very short program for checking services using ansible -

- name: checking service status hosts: tasks: - name: checking service status command: systemctl status "{{ item }}" with_items: - firewalld - httpd - vsftpd - sshd - postfix register: result ignore_errors: yes - name: showing report debug: var: result 
0

Here is a clean sample with ansible.builtin.systemd module.

- name: Get Service Status ansible.builtin.systemd: name: "postgresql@13-main" register: pg_service_status - debug: var: pg_service_status.status.ActiveState 

output will be like the one below;

ok: [db01] => { "pg_service_status.status.ActiveState": "inactive" } 

Use command module with service redis-server status and parse stdout.
Or use patched service module.

2

You wouldn't typically do this with Ansible. Ansible should be for declaratively defining how you want a server to look like.

As such you would typically just do something like:

- name: start redis service: name=redis-server state=started enabled=yes 

You might do things conditionally like this:

- name: restart redis service: name=redis-server state=restarted enabled=yes when: redis_config.changed 

To restart Redis when the configuration has changed but it would be rare to need to check whether a service is running.

In the absolute case that you do need to check whether a service is running (and I would strongly suggest that you think again about your Ansible role/playbook) then you could always shell out:

- name: check redis status shell: service redis-service status 
4

You can say the following:

ansible all -m shell -a "if ! systemctl is-active firewalld; then echo 'inactive' ; fi" -i inventory

If you want to use it in a plyabook, you can try the following:

- name: my playbook example hosts: all gather_facts: no tasks: - name: test_task shell: "if ! systemctl is-active firewalld; then echo 'inactive' ; fi" register: firewalld_active failed_when: False changed_when: False - debug: var=firewalld_active - name: check_value_firewalld debug: msg: "'firewalld is inactive' if firewalld_active.stdout=='inactive' else 'service is active' " 

Hope it helps!

3

you can do this by ansible AD-HOC command:

$ansible all -m shell -a "service redis-server status" 

Personally, I like to have some kind of support Playbooks for getting the status of my services across my environments and to be able to restart them etc.

I'll therefore use on the one side the command module as recommended by Konstantin Suvorov but additionally i'll also check the expected port(s) to ensure that all required ports are up and my service is working as expected. This would look like the following in your case:

- name: verify redis-server service command: /usr/sbin/sservice redis-server status changed_when: false - name: verify redis-server is listening on 6379 wait_for: port=6379 timeout=1 

The changed_when is just used because the command module will always set changed to true, although it is just a read-only command.

If systemctl /service systemd script is not enabled for your service. In my case I was starting zookeeper service manually by executing this command /opt/zookeeper/bin/zkServer.sh start

To make this into ansible

- name: Start Zookeeper service command: /opt/zookeeper/bin/zkServer.sh start tags: - start_zookeeper - name: Validate whether zookeeper service is running or not shell: netstat -plnt | grep $(ps -ef | grep zookeeper.server.quorum.QuorumPeerMain | grep -v "grep" | awk '{print $2}') args: executable: /bin/bash register: zookeeper_port_status retries: 5 delay: 3 until: zookeeper_port_status.stdout.find('{{zookeeper_port}}') != -1 tags: - validate_zookeeeper_service 

I am checking zookeeper service status by using netstat and ps -ef linux commands

If zookeeper service is not acquiring port 2181 , then the second ansible module(- name: Validate whether zookeeper service is running or not) will fail, after trying to attempt 5 times(retries: 5)

Zookeeper-Port {{zookeeper_port}}Variable I have defined in my inventory file

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy