我的一項 Ansible 任務不斷失敗,我遇到了問題。但是,問題不在于任務失敗(我希望它失敗),而是我想要做的是即使失敗也將其顯示為成功。
我之所以要這樣做是因為該任務正在使用 WinRM 在 Windows 服務器上運行 Powershell 腳本,而 Powershell 腳本正在為 WinRM 啟用證書身份驗證。這會導致 WinRM 與服務器的連接在 Windows 服務器上重置 WinRM 服務時中止。因此,當應用對 WinRM 的這些更改時,任務將失敗。
任務失敗的事實很好,因為 playbook 中的下一個任務是檢查 WinRM 的更改是否已成功應用。因此,任務使用引數“ignore_errors: yes”運行。但是,我想將任務顯示為成功,即使它失敗了。我嘗試設定引數“failed_when:false”(任務應該總是成功)和“no_log:true”,但這似乎對任務沒有任何影響,它仍然給出以下輸出:
fatal: [X.X.X.X]: FAILED! => {"censored": "the output has been hidden due to the fact that 'no_log: true' was specified for this result"}
完整的任務如下所示:
- name: Activate certificate authentication for WinRM on server
ansible.windows.win_powershell:
script: |
{{ remote_working_dir }}\ConfigureWinRMCertificateAuthentication.ps1
ignore_errors: yes
failed_when: false
no_log: true
在執行此任務之前,將 Powershell 腳本“ConfigureWinRMCertificateAuthentication.ps1”上傳到 {{ remote_working_dir }} 中的服務器。Powershell 腳本簡單地配置 WinRM 服務使用的 CA 證書、用戶證書和服務器證書,使用新證書創建一個新的 WSMan 實體,然后為 WinRM 啟用基于證書的身份驗證。
在沒有“no_log: true”的情況下運行任務時的錯誤是:
requests.exceptions.ConnectionError: ('Connection aborted.', OSError("(104, 'ECONNRESET')"))
fatal: [172.27.25.37]: FAILED! => {
"msg": "Unexpected failure during module execution.",
"stdout": ""
TL; DR:我想問的問題是,有沒有辦法將任務執行期間連接中止的任務顯示為成功?
編輯:
添加任務注冊結果的輸出:
ok: [X.X.X.X] => {
"changed": false,
"msg": {
"exception": "Traceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 665, in urlopen\n httplib_response = self._make_request(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 421, in _make_request\n six.raise_from(e, None)\n File \"<string>\", line 3, in raise_from\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 416, in _make_request\n httplib_response = conn.getresponse()\n File \"/usr/lib/python3.8/http/client.py\", line 1348, in getresponse\n response.begin()\n File \"/usr/lib/python3.8/http/client.py\", line 316, in begin\n version, status, reason = self._read_status()\n File \"/usr/lib/python3.8/http/client.py\", line 277, in _read_status\n line = str(self.fp.readline(_MAXLINE 1), \"iso-8859-1\")\n File \"/usr/lib/python3.8/socket.py\", line 669, in readinto\n return self._sock.recv_into(b)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 328, in recv_into\n return self.recv_into(*args, **kwargs)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 318, in recv_into\n raise SocketError(str(e))\nOSError: (104, 'ECONNRESET')\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/requests/adapters.py\", line 439, in send\n resp = conn.urlopen(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 719, in urlopen\n retries = retries.increment(\n File \"/usr/lib/python3/dist-packages/urllib3/util/retry.py\", line 400, in increment\n raise six.reraise(type(error), error, _stacktrace)\n File \"/usr/lib/python3/dist-packages/six.py\", line 702, in reraise\n raise value.with_traceback(tb)\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 665, in urlopen\n httplib_response = self._make_request(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 421, in _make_request\n six.raise_from(e, None)\n File \"<string>\", line 3, in raise_from\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 416, in _make_request\n httplib_response = conn.getresponse()\n File \"/usr/lib/python3.8/http/client.py\", line 1348, in getresponse\n response.begin()\n File \"/usr/lib/python3.8/http/client.py\", line 316, in begin\n version, status, reason = self._read_status()\n File \"/usr/lib/python3.8/http/client.py\", line 277, in _read_status\n line = str(self.fp.readline(_MAXLINE 1), \"iso-8859-1\")\n File \"/usr/lib/python3.8/socket.py\", line 669, in readinto\n return self._sock.recv_into(b)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 328, in recv_into\n return self.recv_into(*args, **kwargs)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 318, in recv_into\n raise SocketError(str(e))\nurllib3.exceptions.ProtocolError: ('Connection aborted.', OSError(\"(104, 'ECONNRESET')\"))\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/ansible/executor/task_executor.py\", line 146, in run\n res = self._execute()\n File \"/usr/lib/python3/dist-packages/ansible/executor/task_executor.py\", line 645, in _execute\n result = self._handler.run(task_vars=variables)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/normal.py\", line 46, in run\n result = merge_hash(result, self._execute_module(task_vars=task_vars, wrap_async=wrap_async))\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/__init__.py\", line 923, in _execute_module\n res = self._low_level_execute_command(cmd, sudoable=sudoable, in_data=in_data)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/__init__.py\", line 1071, in _low_level_execute_command\n rc, stdout, stderr = self._connection.exec_command(cmd, in_data=in_data, sudoable=sudoable)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/connection/winrm.py\", line 548, in exec_command\n result = self._winrm_exec(cmd_parts[0], cmd_parts[1:], from_exec=True, stdin_iterator=stdin_iterator)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/connection/winrm.py\", line 475, in _winrm_exec\n resptuple = self.protocol.get_command_output(self.shell_id, command_id)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 449, in get_command_output\n self._raw_get_command_output(shell_id, command_id)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 468, in _raw_get_command_output\n res = self.send_message(xmltodict.unparse(req))\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 243, in send_message\n resp = self.transport.send_message(message)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/transport.py\", line 323, in send_message\n response = self._send_message_request(prepared_request, message)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/transport.py\", line 328, in _send_message_request\n response = self.session.send(prepared_request, timeout=self.read_timeout_sec)\n File \"/usr/lib/python3/dist-packages/requests/sessions.py\", line 646, in send\n r = adapter.send(request, **kwargs)\n File \"/usr/lib/python3/dist-packages/requests/adapters.py\", line 498, in send\n raise ConnectionError(err, request=request)\nrequests.exceptions.ConnectionError: ('Connection aborted.', OSError(\"(104, 'ECONNRESET')\"))\n",
"failed": true,
"msg": "Unexpected failure during module execution.",
"stdout": ""
}
}
編輯2:
使用以下配置運行任務:
- name: Activate certificate authentication for WinRM on server
ansible.windows.win_powershell:
script: |
{{ remote_working_dir }}\ConfigureWinRMCertificateAuthentication.ps1
register: test
ignore_errors: yes
failed_when: rc != 0
no_log: true
- name: Dump results
ansible.builtin.debug:
msg: "{{ test }}"
產生以下除錯輸出(和失敗的任務):
TASK [Dump results] *********************************************************************************************************************************************************************************************************************************************
ok: [172.27.25.37] => {
"changed": false,
"msg": {
"exception": "Traceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 665, in urlopen\n httplib_response = self._make_request(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 421, in _make_request\n six.raise_from(e, None)\n File \"<string>\", line 3, in raise_from\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 416, in _make_request\n httplib_response = conn.getresponse()\n File \"/usr/lib/python3.8/http/client.py\", line 1348, in getresponse\n response.begin()\n File \"/usr/lib/python3.8/http/client.py\", line 316, in begin\n version, status, reason = self._read_status()\n File \"/usr/lib/python3.8/http/client.py\", line 277, in _read_status\n line = str(self.fp.readline(_MAXLINE 1), \"iso-8859-1\")\n File \"/usr/lib/python3.8/socket.py\", line 669, in readinto\n return self._sock.recv_into(b)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 328, in recv_into\n return self.recv_into(*args, **kwargs)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 318, in recv_into\n raise SocketError(str(e))\nOSError: (104, 'ECONNRESET')\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/requests/adapters.py\", line 439, in send\n resp = conn.urlopen(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 719, in urlopen\n retries = retries.increment(\n File \"/usr/lib/python3/dist-packages/urllib3/util/retry.py\", line 400, in increment\n raise six.reraise(type(error), error, _stacktrace)\n File \"/usr/lib/python3/dist-packages/six.py\", line 702, in reraise\n raise value.with_traceback(tb)\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 665, in urlopen\n httplib_response = self._make_request(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 421, in _make_request\n six.raise_from(e, None)\n File \"<string>\", line 3, in raise_from\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 416, in _make_request\n httplib_response = conn.getresponse()\n File \"/usr/lib/python3.8/http/client.py\", line 1348, in getresponse\n response.begin()\n File \"/usr/lib/python3.8/http/client.py\", line 316, in begin\n version, status, reason = self._read_status()\n File \"/usr/lib/python3.8/http/client.py\", line 277, in _read_status\n line = str(self.fp.readline(_MAXLINE 1), \"iso-8859-1\")\n File \"/usr/lib/python3.8/socket.py\", line 669, in readinto\n return self._sock.recv_into(b)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 328, in recv_into\n return self.recv_into(*args, **kwargs)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 318, in recv_into\n raise SocketError(str(e))\nurllib3.exceptions.ProtocolError: ('Connection aborted.', OSError(\"(104, 'ECONNRESET')\"))\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/ansible/executor/task_executor.py\", line 146, in run\n res = self._execute()\n File \"/usr/lib/python3/dist-packages/ansible/executor/task_executor.py\", line 645, in _execute\n result = self._handler.run(task_vars=variables)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/normal.py\", line 46, in run\n result = merge_hash(result, self._execute_module(task_vars=task_vars, wrap_async=wrap_async))\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/__init__.py\", line 923, in _execute_module\n res = self._low_level_execute_command(cmd, sudoable=sudoable, in_data=in_data)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/__init__.py\", line 1071, in _low_level_execute_command\n rc, stdout, stderr = self._connection.exec_command(cmd, in_data=in_data, sudoable=sudoable)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/connection/winrm.py\", line 548, in exec_command\n result = self._winrm_exec(cmd_parts[0], cmd_parts[1:], from_exec=True, stdin_iterator=stdin_iterator)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/connection/winrm.py\", line 475, in _winrm_exec\n resptuple = self.protocol.get_command_output(self.shell_id, command_id)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 449, in get_command_output\n self._raw_get_command_output(shell_id, command_id)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 468, in _raw_get_command_output\n res = self.send_message(xmltodict.unparse(req))\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 243, in send_message\n resp = self.transport.send_message(message)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/transport.py\", line 323, in send_message\n response = self._send_message_request(prepared_request, message)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/transport.py\", line 328, in _send_message_request\n response = self.session.send(prepared_request, timeout=self.read_timeout_sec)\n File \"/usr/lib/python3/dist-packages/requests/sessions.py\", line 646, in send\n r = adapter.send(request, **kwargs)\n File \"/usr/lib/python3/dist-packages/requests/adapters.py\", line 498, in send\n raise ConnectionError(err, request=request)\nrequests.exceptions.ConnectionError: ('Connection aborted.', OSError(\"(104, 'ECONNRESET')\"))\n",
"failed": true,
"msg": "Unexpected failure during module execution.",
"stdout": ""
}
}
然后使用以下配置運行任務:
- name: Activate certificate authentication for WinRM on server
ansible.windows.win_powershell:
script: |
{{ remote_working_dir }}\ConfigureWinRMCertificateAuthentication.ps1
register: test
ignore_errors: yes
failed_when: rc == 0
no_log: true
- name: Dump results
ansible.builtin.debug:
msg: "{{ test }}"
產生以下除錯輸出(也是失敗的任務):
TASK [Dump results] *********************************************************************************************************************************************************************************************************************************************
ok: [172.27.25.37] => {
"changed": false,
"msg": {
"exception": "Traceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 665, in urlopen\n httplib_response = self._make_request(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 421, in _make_request\n six.raise_from(e, None)\n File \"<string>\", line 3, in raise_from\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 416, in _make_request\n httplib_response = conn.getresponse()\n File \"/usr/lib/python3.8/http/client.py\", line 1348, in getresponse\n response.begin()\n File \"/usr/lib/python3.8/http/client.py\", line 316, in begin\n version, status, reason = self._read_status()\n File \"/usr/lib/python3.8/http/client.py\", line 277, in _read_status\n line = str(self.fp.readline(_MAXLINE 1), \"iso-8859-1\")\n File \"/usr/lib/python3.8/socket.py\", line 669, in readinto\n return self._sock.recv_into(b)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 328, in recv_into\n return self.recv_into(*args, **kwargs)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 318, in recv_into\n raise SocketError(str(e))\nOSError: (104, 'ECONNRESET')\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/requests/adapters.py\", line 439, in send\n resp = conn.urlopen(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 719, in urlopen\n retries = retries.increment(\n File \"/usr/lib/python3/dist-packages/urllib3/util/retry.py\", line 400, in increment\n raise six.reraise(type(error), error, _stacktrace)\n File \"/usr/lib/python3/dist-packages/six.py\", line 702, in reraise\n raise value.with_traceback(tb)\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 665, in urlopen\n httplib_response = self._make_request(\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 421, in _make_request\n six.raise_from(e, None)\n File \"<string>\", line 3, in raise_from\n File \"/usr/lib/python3/dist-packages/urllib3/connectionpool.py\", line 416, in _make_request\n httplib_response = conn.getresponse()\n File \"/usr/lib/python3.8/http/client.py\", line 1348, in getresponse\n response.begin()\n File \"/usr/lib/python3.8/http/client.py\", line 316, in begin\n version, status, reason = self._read_status()\n File \"/usr/lib/python3.8/http/client.py\", line 277, in _read_status\n line = str(self.fp.readline(_MAXLINE 1), \"iso-8859-1\")\n File \"/usr/lib/python3.8/socket.py\", line 669, in readinto\n return self._sock.recv_into(b)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 328, in recv_into\n return self.recv_into(*args, **kwargs)\n File \"/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py\", line 318, in recv_into\n raise SocketError(str(e))\nurllib3.exceptions.ProtocolError: ('Connection aborted.', OSError(\"(104, 'ECONNRESET')\"))\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/ansible/executor/task_executor.py\", line 146, in run\n res = self._execute()\n File \"/usr/lib/python3/dist-packages/ansible/executor/task_executor.py\", line 645, in _execute\n result = self._handler.run(task_vars=variables)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/normal.py\", line 46, in run\n result = merge_hash(result, self._execute_module(task_vars=task_vars, wrap_async=wrap_async))\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/__init__.py\", line 923, in _execute_module\n res = self._low_level_execute_command(cmd, sudoable=sudoable, in_data=in_data)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/action/__init__.py\", line 1071, in _low_level_execute_command\n rc, stdout, stderr = self._connection.exec_command(cmd, in_data=in_data, sudoable=sudoable)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/connection/winrm.py\", line 548, in exec_command\n result = self._winrm_exec(cmd_parts[0], cmd_parts[1:], from_exec=True, stdin_iterator=stdin_iterator)\n File \"/usr/lib/python3/dist-packages/ansible/plugins/connection/winrm.py\", line 475, in _winrm_exec\n resptuple = self.protocol.get_command_output(self.shell_id, command_id)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 449, in get_command_output\n self._raw_get_command_output(shell_id, command_id)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 468, in _raw_get_command_output\n res = self.send_message(xmltodict.unparse(req))\n File \"/usr/local/lib/python3.8/dist-packages/winrm/protocol.py\", line 243, in send_message\n resp = self.transport.send_message(message)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/transport.py\", line 323, in send_message\n response = self._send_message_request(prepared_request, message)\n File \"/usr/local/lib/python3.8/dist-packages/winrm/transport.py\", line 328, in _send_message_request\n response = self.session.send(prepared_request, timeout=self.read_timeout_sec)\n File \"/usr/lib/python3/dist-packages/requests/sessions.py\", line 646, in send\n r = adapter.send(request, **kwargs)\n File \"/usr/lib/python3/dist-packages/requests/adapters.py\", line 498, in send\n raise ConnectionError(err, request=request)\nrequests.exceptions.ConnectionError: ('Connection aborted.', OSError(\"(104, 'ECONNRESET')\"))\n",
"failed": true,
"msg": "Unexpected failure during module execution.",
"stdout": ""
}
}
因此,更改failed_when引數(無論我將其設定為什么)似乎對任務的結果沒有影響。
uj5u.com熱心網友回復:
執行中斷連接的任務的正常解決方法是在即發即async棄模式下使用。reboot在執行該操作之前,此模式曾經大量用于服務器重新啟動。
- name: Activate certificate authentication for WinRM on server
ansible.windows.win_powershell:
script: |
Start-Sleep -s 2
{{ remote_working_dir }}\ConfigureWinRMCertificateAuthentication.ps1
async: 60
poll: 0
在腳本開頭添加的 sleep 確保在連接中斷之前有時間將初始異步狀態回傳給 Ansible 控制器;async: 60以 60 秒的超時時間異步運行任務,并poll: 0告訴 Ansible 立即繼續執行下一個任務。
這通常后面跟著類似的東西
- name: Wait for the server to come back
wait_for_connection:
delay: 30
timeout: 300
優雅地重試連接,直到服務器再次可訪問。
uj5u.com熱心網友回復:
使用暫存器和“ .failed”。這是我自己的一個案例,我正在測驗 Kubernetes 部署未能按預期部署:
- name: Test webhook rejects with no label
kubernetes.core.k8s:
state: present
namespace: "{{ webhook_namespace }}"
definition: "{{ lookup('template', 'roles/gke-setup-tasks/files/nginx-test-webhook-no-label.yaml') | from_yaml }}"
register: test
failed_when: not test.failed
所以我宣告如果任務沒有失敗,它就被認為是“失敗的” 。換句話說,如果任務成功(部署部署),那么我認為任務失敗。
要回復評論中的更多查詢,這是另一個示例,您可能會基于 rc 失敗(或回傳代碼——在 Windows 上,我相信這也稱為批處理腳本中的錯誤級別)
我們從一個會失敗的簡單任務開始:
- name: Do something that fails
shell:
cmd: /usr/bin/false
這給了我們預期的錯誤:
TASK [appinstalls : Do something that fails] ***********************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "/usr/bin/false", "delta": "0:00:00.012978", "end": "2022-01-20 14:45:51.400921", "msg": "non-zero return code", "rc": 1, "start": "2022-01-20 14:45:51.387943", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
現在讓我們添加一個暫存器并轉儲內容。我們必須添加ignore_errors以便執行繼續
- name: Do something that fails
shell:
cmd: /usr/bin/false
register: test
ignore_errors: true
- debug:
msg: "{{test}}"
TASK [appinstalls : Do something that fails] *************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "/usr/bin/false", "delta": "0:00:00.010801", "end": "2022-01-20 14:48:35.689258", "msg": "non-zero return code", "rc": 1, "start": "2022-01-20 14:48:35.678457", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring
TASK [appinstalls : debug] *******************************************************************************************************************************************
ok: [localhost] => {
"msg": {
"changed": true,
"cmd": "/usr/bin/false",
"delta": "0:00:00.010801",
"end": "2022-01-20 14:48:35.689258",
"failed": true,
"msg": "non-zero return code",
"rc": 1,
"start": "2022-01-20 14:48:35.678457",
"stderr": "",
"stderr_lines": [],
"stdout": "",
"stdout_lines": []
}
}
現在注意rc這里怎么樣1?讓我們更改任務,以便僅在rcis時才使任務失敗0(即,如果rc,或回傳碼為零,我們認為它是失敗的)。我們還洗掉了ignore_errors現在:
- name: Do something that fails
shell:
cmd: /usr/bin/false
register: test
failed_when: test.rc == 0
- debug:
msg: "{{test}}"
現在,當我們運行它時,它不會失敗,即使任務中的命令實際上失敗了。
TASK [appinstalls : Do something that fails] *************************************************************************************************************************
changed: [localhost]
TASK [appinstalls : debug] *******************************************************************************************************************************************
ok: [localhost] => {
"msg": {
"changed": true,
"cmd": "/usr/bin/false",
"delta": "0:00:00.006484",
"end": "2022-01-20 14:52:01.010044",
"failed": false,
"failed_when_result": false,
"msg": "non-zero return code",
"rc": 1,
"start": "2022-01-20 14:52:01.003560",
"stderr": "",
"stderr_lines": [],
"stdout": "",
"stdout_lines": []
}
}
那么如果我們做同樣的事情,但是使用一個實際成功的命令會發生什么:
- name: Do something that succeeds
shell:
cmd: echo "This is a success"
register: test
failed_when: test.rc == 0
- debug:
msg: "{{test}}"
TASK [appinstalls : Do something that succeeds] **********************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "echo \"This is a success\"", "delta": "0:00:00.005851", "end": "2022-01-20 14:54:46.082148", "failed_when_result": true, "msg": "", "rc": 0, "start": "2022-01-20 14:54:46.076297", "stderr": "", "stderr_lines": [], "stdout": "This is a success", "stdout_lines": ["This is a success"]}
因此,使用rcorfailed屬性可以讓您覆寫或更改 Ansible 評估任務結果的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/418471.html
標籤:
