当shell命令没有输出时,Ansible寄存器失败

当shell命令没有输出时,Ansible寄存器失败,ansible,ansible-playbook,Ansible,Ansible Playbook,我试图检查服务是否正在运行,然后将其输出注册到某个变量。如果服务未运行,则启动服务。下面是我的Ansible剧本片段 - 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 !

我试图检查服务是否正在运行,然后将其输出注册到某个变量。如果服务未运行,则启动服务。下面是我的Ansible剧本片段

- 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\u errors,我知道:true
将忽略错误并继续执行,但Ansible运行失败。有什么方法可以让我们优雅地处理这个问题吗?

您可以在
pgrep
的返回代码为2或3时将条件设置为失败

根据
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.
因此,Ansible任务应该如下所示:

- name: check if service is running
  shell: pgrep node
  register: pgrep
  failed_when: "pgrep.rc == 2 or pgrep.rc == 3"
当来自
pgrep
的返回代码为2或3时,您可以将条件设置为失败

根据
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.
因此,Ansible任务应该如下所示:

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

添加答案供将来参考。如果存在多个进程,如何杀死它们。仅在rc==0时指示更改。除非rc==2或rc==3,否则不显示失败

- name: "Kill any processes"
  become: True
  vars:
    processes_to_kill: ["p1", "p2", "p3", "p4"]
  shell: "pkill -f {{ item }}"
  with_items: "{{ processes_to_kill }}"
  register: pkill
  failed_when: "pkill.rc == 2 or pkill.rc == 3"
  changed_when: "pkill.rc == 0"

添加答案供将来参考。如果存在多个进程,如何杀死它们。仅在rc==0时指示更改。除非rc==2或rc==3,否则不显示失败

- name: "Kill any processes"
  become: True
  vars:
    processes_to_kill: ["p1", "p2", "p3", "p4"]
  shell: "pkill -f {{ item }}"
  with_items: "{{ processes_to_kill }}"
  register: pkill
  failed_when: "pkill.rc == 2 or pkill.rc == 3"
  changed_when: "pkill.rc == 0"

“…将忽略错误并继续,但ansible运行失败。”我不明白这是什么意思。我的意思是,检查服务是否正在运行的特定任务仍然失败,尽管执行继续执行其他任务“…将忽略错误并继续,但ansible运行失败。”我不明白这意味着什么。我的意思是,检查服务是否正在运行的特定任务仍然失败,尽管执行继续执行进一步的任务