当shell命令没有输出时,Ansible寄存器失败
我试图检查服务是否正在运行,然后将其输出注册到某个变量。如果服务未运行,则启动服务。下面是我的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 !
- 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运行失败。”我不明白这意味着什么。我的意思是,检查服务是否正在运行的特定任务仍然失败,尽管执行继续执行进一步的任务