ansible ignore_errors
在某些场景下,在任务执行报错时,需要忽略错误而继续执行,但是ansible在遇到报错后,就会停止运行。
比如,在安装jdk时,需要检测jdk是否安装,如果没找到java命令,则进行安装,但是which java如果没找到命令,ansible直接抛出错误,停止运行。
在使用ignore_errors: yes后,ansible会忽略错误,继续执行下一个任务。
如果使用register收集返回输出,那么就会产生一个疑问,ignore_errors会改变命令执行返回的returncode吗?
解答:在 Ansible 的 shell
模块中,如果你使用了 ignore_errors: yes
,即使命令失败(rc != 0
),Ansible 仍会继续执行后续任务,但 rc
仍然会保持失败状态(rc = 1
或其他非零值)。
举例
- name: search java command ansible.builtin.shell: which java register: java_status ignore_errors: yes - name: unarchive java ansible.builtin.unarchive: src: jdk-8u341-linux-x64.tar.gz dest: /opt/ when: java_status.rc != 0 # 可以看到依然可以使用rc状态进行判断,这里rc返回状态是1 - name: Configure Java environment variables ansible.builtin.blockinfile: path: /etc/profile block: | export JAVA_HOME={{ JAVA_HOME }} export CLASSPATH=.:{{ JAVA_HOME }}/jre/lib/rt.jar:{{ JAVA_HOME }}/lib/dt.jar:{{ JAVA_HOME }}/lib/tools.jar export PATH={{ JAVA_HOME }}/bin:$PATH marker: "# {mark} ANSIBLE MANAGED BLOCK - JAVA" when: java_status.rc != 0
执行效果
TASK [es_cluster : search java command] *************************************************************************************************************************************** fatal: [es-node2]: FAILED! => {"changed": true, "cmd": "which java", "delta": "0:00:00.015623", "end": "2025-02-25 16:40:29.869761", "msg": "non-zero return code", "rc": 1, "start": "2025-02-25 16:40:29.854138", "stderr": "which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)", "stderr_lines": ["which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)"], "stdout": "", "stdout_lines": []} ...ignoring fatal: [es-node3]: FAILED! => {"changed": true, "cmd": "which java", "delta": "0:00:00.015531", "end": "2025-02-25 16:40:29.869835", "msg": "non-zero return code", "rc": 1, "start": "2025-02-25 16:40:29.854304", "stderr": "which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)", "stderr_lines": ["which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)"], "stdout": "", "stdout_lines": []} ...ignoring fatal: [es-node1]: FAILED! => {"changed": true, "cmd": "which java", "delta": "0:00:00.015946", "end": "2025-02-25 16:40:29.888443", "msg": "non-zero return code", "rc": 1, "start": "2025-02-25 16:40:29.872497", "stderr": "which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)", "stderr_lines": ["which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)"], "stdout": "", "stdout_lines": []} ...ignoring TASK [es_cluster : unarchive java] ******************************************************************************************************************************************** ^[aok: [es-node1] ok: [es-node3] ok: [es-node2] TASK [es_cluster : Configure Java environment variables] ********************************************************************************************************************** ok: [es-node2] ok: [es-node3] ok: [es-node1]
可以看到在which java时,报错,但是rc返回是1,所以下面when条件成立,进行jdk安装。
本文来自博客园,作者:不会跳舞的胖子,转载请注明原文链接:https://www.cnblogs.com/rtnb/p/18736798