web-dev-qa-db-fra.com

Comment obtenir le statut de service par Ansible?

Je souhaite un service tel que redis-server en cours d’exécution par Ansible.

Je sais comment utiliser le module de service Ansible pour arrêter ou démarrer le service système. Mais comment puis-je obtenir l'état actuel du service?

8
Moxmi

Utilisez le module command avec service redis-server status et analysez stdout.
Ou utilisez patché module de service.

2
Konstantin Suvorov

Vous pouvez également utiliser le module service_facts .

Exemple d'utilisation:

- name: collect facts about system services
  service_facts:
  register: services_state

- name: Debug
  debug:
    var: services_state

Exemple de sortie:

...

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"
                },
                ...
            }
        }
    }
}
11
Jay Taylor

Personnellement, j'aime avoir une sorte de Playbooks de support pour connaître l'état de mes services dans mes environnements et pouvoir les redémarrer, etc.

J'utiliserai donc d'un côté le module de commande recommandé par Konstantin Suvorov mais je vérifierai également le ou les ports prévus pour m'assurer que tous les ports requis sont activés et que mon service fonctionne comme prévu. Cela ressemblerait à ce qui suit dans votre cas:

- 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

Hangile_when est simplement utilisé car le module de commande définira toujours le paramètre changé sur true, bien qu'il ne s'agisse que d'une commande en lecture seule.

1
Lorex

Il suffit d’exécuter la tâche service: name=httpd state=started avec l’option --check. Cela vous indique si le service doit être démarré, ce qui signifie qu'il est en panne. Si la tâche n'indique aucun changement, c'est déjà le cas.

Exemple de service en panne, changed est vrai, car il doit être démarré:

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

Exemple de service est en place, change est false, car rien n'est à faire:

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

vous pouvez le faire par commande AD-HOC ansible:

$ansible all -m Shell -a "service redis-server status"
1
dushyant

Vous ne feriez généralement pas cela avec Ansible. Ansible devrait être pour définir de manière déclarative comment vous voulez un serveur.

En tant que tel, vous feriez typiquement quelque chose comme:

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

Vous pourriez faire des choses conditionnellement comme ceci:

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

Redémarrer Redis lorsque la configuration a changé, mais il serait rare de devoir vérifier si un service est en cours d'exécution.

Dans le cas absolu où vous devez vérifier si un service est en cours d'exécution (et je vous suggère fortement de repenser à votre rôle/livre de jeu Ansible), vous pouvez toujours utiliser Shell:

- name: check redis status
  Shell: service redis-service status
1
ydaetskcoR