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安装。

 

posted @ 2025-02-25 17:19  不会跳舞的胖子  阅读(27)  评论(0)    收藏  举报