2016-12-19 8 views
0

Я пытаюсь проверить, запущена ли служба, затем зарегистрируйте свой вывод на какую-либо переменную, если она не запущена, а затем запустите службу. Ниже приведен фрагмент моей Ansible playbook.Несоответствующий регистр сбой, когда нет вывода из команды оболочки

- hosts: localhost 
    tasks: 
    - name: check if service is running 
    shell: pgrep node 
    register: pgrep 
    - name: stop running service 
    shell: pkill node 
    when: pgrep.stdout_lines != '' 
    tags: 
    - stop 
    - name: start running service 
    shell: pkill node 
    when: pgrep.stdout_lines == '' 
    tags: 
    - start 

Теперь в описанном выше случае, если процесс не запущен, то pgrep node команда возвращает код выхода статус 1, который выходит из строя «проверьте, если служба запущена» задачи и прекращает дальнейшее выполнение задач. Я знаю, установив ignore_errors: true, проигнорирует ошибку и продолжит движение вперед, но не сможет выполнить Ansible. Есть ли способ, которым мы можем справиться с этим изящно?

+0

«* ... проигнорирует ошибку и продолжит движение вперед, но это не сработает. *« Я не понимаю, что это значит. – techraf

+0

Что я имел в виду, так это то, что конкретная задача проверить, работает ли служба, все еще не выполняется, хотя выполнение продолжается с выполнением дополнительных задач. –

ответ

2

Вы можете control what defines failure и установить условие потерпеть неудачу, если код возврата из pgrep является 2 или 3.

Per man pgrep:

The pgrep and pkill utilities return one of the following values upon exit: 

0  One or more processes were matched. 
1  No processes were matched. 
2  Invalid options were specified on the command line. 
3  An internal error occurred. 

Таким образом, задача анзибль должна выглядеть следующим образом:

- name: check if service is running 
    shell: pgrep node 
    register: pgrep 
    failed_when: "pgrep.rc == 2 or pgrep.rc == 3" 
+0

вы спасли человека дня. Спасибо большое :) –