Меню

Non zero return code ошибка

Stuck with Non-Zero return code: Ansible error? We can help you.

Ansible will fail if the exit status of a task is any non-zero value.

As part of our Server Management Services, we assist our customers with several Ansible queries.

Today, let us see how we can fix this error.

Non-Zero return code: Ansible

Generally, the error looks like this:

TASK [Non-Zero return] 
**********************************************************************************
fatal: [server1.lab.com]: FAILED! => {“changed”: true, “cmd”: “ls | grep wp-config.php”, “delta”: “0:00:00.021103”, “end”: “2021-06-29 12:53:49.222176”, “msg”: “non-zero return code”, “rc”: 1, “start”: “2021-06-29 12:53:49.201073”, “stderr”: “”, “stderr_lines”: [], “stdout”: “”, “stdout_lines”: []}
fatal: [server2.lab.com]: FAILED! => {“changed”: true, “cmd”: “ls | grep wp-config.php”, “delta”: “0:00:00.021412”, “end”: “2021-06-29 12:53:50.697567”, “msg”: “non-zero return code”, “rc”: 1, “start”: “2021-06-29 12:53:50.676155”, “stderr”: “”, “stderr_lines”: [], “stdout”: “”, “stdout_lines”: []}
fatal: [server3.lab.com]: FAILED! => {“changed”: true, “cmd”: “ls | grep wp-config.php”, “delta”: “0:00:00.015554”, “end”: “2021-06-29 12:53:50.075555”, “msg”: “non-zero return code”, “rc”: 1, “start”: “2021-06-29 12:53:50.060001”, “stderr”: “”, “stderr_lines”: [], “stdout”: “”, “stdout_lines”: []}

In common, if a command exits with a zero exit status it means it has run successfully.

On the other hand, any non-zero exit status of the command indicates an error.

For example,

$ date
Tuesday 29 June 2021 05:21:28 PM IST
$ echo $?
0

Here, we can see the successful execution of the shell command “date”. Hence, the exit status of the command is 0.

A non-zero exit status indicates failure. For example,

$ date yesterday
date: invalid date ‘yesterday’
$ echo $?
1

Here, the argument for the ‘date’ command, “yesterday”, is invalid. Hence, the exit status is 1, indicating the command ended in error.

However, though we execute properly, there are some commands which return a non-zero value.

$ ls | grep wp-config.php
$ echo $?
1

Here, the wp-config.php file doesn’t exist in that directory. Even though the command executes without error, the exit status is 1.

By default, Ansible will report it as failed.

How to resolve the problem?

The best practice in order to solve this is to avoid the usage of shell command in the playbook.

Instead of the shell command, there is a high chance for an ansible module that does the same operation.

So, we can use the ansible built-in module find which allows locating files easily through ansible.

Alternatively, we can define the condition for a failure at the task level with the help of failed_when.

For example,

—
– hosts: all
tasks:
– name: Non-Zero return
shell: “ls | grep wp-config.php”
register: wp
failed_when: “wp.rc not in [ 0, 1 ]”
TASK [Non-Zero return]
***********************************************************************************************************
changed: [server1.lab.com]
changed: [server2.lab.com]
changed: [server3.lab.com]

Though the exit status is not Zero, the task continues to execute on the server.

Here, the exit status registers to a variable and then pass through the condition. If the return value doesn’t match the condition, only then the task will report as a failure.

On the other hand, we can ignore the errors altogether.

For that, we use ignore_errors in the task to ignore any failure during the task.

—
– hosts: all
tasks:
– name: Non-Zero return
shell: “ls | grep wp-config.php”
ignore_errors: true
ASK [Non-Zero return]
***********************************************************************************************************
fatal: [server1.lab.com]: FAILED! => {“changed”: true, “cmd”: “ls | grep wp-config.php”, “delta”: “0:00:00.004055”, “end”: “2021-06-29 13:09:20.631570”, “msg”: “non-zero return code”, “rc”: 1, “start”: “2021-06-29 13:09:20.627515”, “stderr”: “”, “stderr_lines”: [], “stdout”: “”, “stdout_lines”: []}
…ignoring
fatal: [server2.lab.com]: FAILED! => {“changed”: true, “cmd”: “ls | grep wp-config.php”, “delta”: “0:00:00.006745”, “end”: “2021-06-29 13:09:22.110059”, “msg”: “non-zero return code”, “rc”: 1, “start”: “2021-06-29 13:09:22.103314”, “stderr”: “”, “stderr_lines”: [], “stdout”: “”, “stdout_lines”: []}
…ignoring
fatal: [server3.lab.com]: FAILED! => {“changed”: true, “cmd”: “ls | grep wp-config.php”, “delta”: “0:00:00.004957”, “end”: “2021-06-29 13:09:21.465326”, “msg”: “non-zero return code”, “rc”: 1, “start”: “2021-06-29 13:09:21.460369”, “stderr”: “”, “stderr_lines”: [], “stdout”: “”, “stdout_lines”: []}
…ignoring

By default, for ansible to recognize the task complition, the exit status must be Zero. Otherwise, it will fail.

We can manipulate the exit status of the task by registering the return value to a variable and then use conditional to determine if the task fails or succeeds.

To continue the playbook, in spite of the failure, we can use the ignore_errors option on the task.

[Confused with the procedure? We are here for you]

Conclusion

In short, we saw how our Support Techs fix the Ansible error for our customers.

PREVENT YOUR SERVER FROM CRASHING!

Never again lose customers to poor server speed! Let us help you.

Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.

GET STARTED

var google_conversion_label = «owonCMyG5nEQ0aD71QM»;


Ansible — Resolve «non-zero return code»


non-zero return code is displayed when using the shell module and the return code is something other than 0. For example, the following shell command will almost always have a return code of 1.

---
- hosts: all
  tasks:
    - name: ps command
      shell: ps | grep foo

Running this playbook will return the following.

PLAY [all]

TASK [Gathering Facts]
ok: [server1.example.com]

TASK [ps command]
fatal: [server1.example.com]: FAILED! => {"changed": true, "cmd": "ps | grep foo", "delta": "0:00:00.021343", "end": "2020-03-13 21:52:36.185781", "msg": "non-zero return code", "rc": 1, "start": "2020-03-13 21:52:36.164438", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

PLAY RECAP
server1.example.com : ok=1  changed=0  unreacable=0  failed=1

Since a return code of 0 and 1 are ok with the ps command, the failed_when parameter can be used to fail when the rc (return code) is not 0 or 1.

---
- hosts: all
  tasks:
    - name: ps command
      shell: ps | grep foo
      register: ps
      failed_when: ps.rc not in [ 0, 1 ]
...

Or the ignore_errors parameter can be used.

---
- hosts: all
  tasks:
    - name: ps command
      shell: ps | grep foo
      ignore_errors: true
...

Or the meta: clear_host_errors module can be used.

---
- hosts: all
  tasks:
    - name: ps command
      shell: ps | grep foo

    - meta: clear_host_error
...


Did you find this article helpful?

If so, consider buying me a coffee over at Buy Me A Coffee

Ansible doesn’t seem to be able to handle the result ‘0’ for shell commands. This

- name: Check if swap exists
  shell: "swapon -s | grep -ci dev"
  register: swap_exists

Returns an error

«msg»: «non-zero return code»

But when I replace «dev» with «type», which actually always occurs and gives a count of at least 1, then the command is successful and no error is thrown.

I also tried with command: instead of shell: — it doesn’t give an error, but then the command is also not executed.

asked May 21, 2018 at 0:15

user2066480's user avatar

since you want to run a sequence of commands that involve pipe, ansible states you should use shell and not command, as you are doing.

So, the problem is the fact that grep returns 1 (didnt find a match on the swapon output), and ansible considers this a failure. Since you are well sure there is no issue, just add a ignore_errors: true and be done with it.

- name: Check if swap exists
  shell: "swapon -s | grep -ci non_existent_string"
  register: swap_exists
  ignore_errors: true

OR:

if you want to narrow it down to return codes 0 and 1, instruct ansible to not consider failures those 2 rcs:

- name: Check if swap exists
  shell: "swapon -s | grep -ci non_existent_string"
  register: swap_exists
  # ignore_errors: true
  failed_when: swap_exists.rc != 1 and swap_exists.rc != 0

answered May 21, 2018 at 0:47

ilias-sp's user avatar

ilias-spilias-sp

5,7393 gold badges26 silver badges40 bronze badges

3

I found a better way. if you only need to know the record number this works:

- name: Check if swap exists
  shell: "swapon -s | grep -i dev|wc -l"
  register: swap_exists

Another way is to always use cat at the end of the pipe. See Ansible shell module returns error when grep results are empty

    - name: Check if swap exists
      shell: "swapon -s | grep -i dev|cat"
      register: swap_exists

Calum Halpin's user avatar

Calum Halpin

1,8041 gold badge10 silver badges19 bronze badges

answered Feb 23, 2020 at 9:20

robin's user avatar

robinrobin

212 bronze badges

You can also parse the grep count result in awk and return your custom output. This will avoid the ignore_errors module.

- name: Check if swap exists
  shell: "swapon -s | grep -ci dev" | awk '{ r = $0 == 0 ? "false":"true"; print r }'
  register: swap_exists

answered Jun 17, 2020 at 5:15

Aravinthan K's user avatar

Aravinthan KAravinthan K

1,6952 gold badges18 silver badges22 bronze badges

  • AnsibleFest
  • Products
  • Community
  • Webinars & Training
  • Blog

Ansible Logo

Documentation

When Ansible receives a non-zero return code from a command or a failure from a module, by default it stops executing on that host and continues on other hosts. However, in some circumstances you may want different behavior. Sometimes a non-zero return code indicates success. Sometimes you want a failure on one host to stop execution on all hosts. Ansible provides tools and settings to handle these situations and help you get the behavior, output, and reporting you want.

  • Ignoring failed commands

  • Ignoring unreachable host errors

  • Resetting unreachable hosts

  • Handlers and failure

  • Defining failure

  • Defining “changed”

  • Ensuring success for command and shell

  • Aborting a play on all hosts

    • Aborting on the first error: any_errors_fatal

    • Setting a maximum failure percentage

  • Controlling errors in blocks

Ignoring failed commands¶

By default Ansible stops executing tasks on a host when a task fails on that host. You can use ignore_errors to continue on in spite of the failure:

- name: Do not count this as a failure
  ansible.builtin.command: /bin/false
  ignore_errors: yes

The ignore_errors directive only works when the task is able to run and returns a value of ‘failed’. It does not make Ansible ignore undefined variable errors, connection failures, execution issues (for example, missing packages), or syntax errors.

Ignoring unreachable host errors¶

New in version 2.7.

You can ignore a task failure due to the host instance being ‘UNREACHABLE’ with the ignore_unreachable keyword. Ansible ignores the task errors, but continues to execute future tasks against the unreachable host. For example, at the task level:

- name: This executes, fails, and the failure is ignored
  ansible.builtin.command: /bin/true
  ignore_unreachable: yes

- name: This executes, fails, and ends the play for this host
  ansible.builtin.command: /bin/true

And at the playbook level:

- hosts: all
  ignore_unreachable: yes
  tasks:
  - name: This executes, fails, and the failure is ignored
    ansible.builtin.command: /bin/true

  - name: This executes, fails, and ends the play for this host
    ansible.builtin.command: /bin/true
    ignore_unreachable: no

Resetting unreachable hosts¶

If Ansible cannot connect to a host, it marks that host as ‘UNREACHABLE’ and removes it from the list of active hosts for the run. You can use meta: clear_host_errors to reactivate all hosts, so subsequent tasks can try to reach them again.

Handlers and failure¶

Ansible runs handlers at the end of each play. If a task notifies a handler but
another task fails later in the play, by default the handler does not run on that host,
which may leave the host in an unexpected state. For example, a task could update
a configuration file and notify a handler to restart some service. If a
task later in the same play fails, the configuration file might be changed but
the service will not be restarted.

You can change this behavior with the --force-handlers command-line option,
by including force_handlers: True in a play, or by adding force_handlers = True
to ansible.cfg. When handlers are forced, Ansible will run all notified handlers on
all hosts, even hosts with failed tasks. (Note that certain errors could still prevent
the handler from running, such as a host becoming unreachable.)

Defining failure¶

Ansible lets you define what “failure” means in each task using the failed_when conditional. As with all conditionals in Ansible, lists of multiple failed_when conditions are joined with an implicit and, meaning the task only fails when all conditions are met. If you want to trigger a failure when any of the conditions is met, you must define the conditions in a string with an explicit or operator.

You may check for failure by searching for a word or phrase in the output of a command:

- name: Fail task when the command error output prints FAILED
  ansible.builtin.command: /usr/bin/example-command -x -y -z
  register: command_result
  failed_when: "'FAILED' in command_result.stderr"

or based on the return code:

- name: Fail task when both files are identical
  ansible.builtin.raw: diff foo/file1 bar/file2
  register: diff_cmd
  failed_when: diff_cmd.rc == 0 or diff_cmd.rc >= 2

You can also combine multiple conditions for failure. This task will fail if both conditions are true:

- name: Check if a file exists in temp and fail task if it does
  ansible.builtin.command: ls /tmp/this_should_not_be_here
  register: result
  failed_when:
    - result.rc == 0
    - '"No such" not in result.stdout'

If you want the task to fail when only one condition is satisfied, change the failed_when definition to:

failed_when: result.rc == 0 or "No such" not in result.stdout

If you have too many conditions to fit neatly into one line, you can split it into a multi-line yaml value with >:

- name: example of many failed_when conditions with OR
  ansible.builtin.shell: "./myBinary"
  register: ret
  failed_when: >
    ("No such file or directory" in ret.stdout) or
    (ret.stderr != '') or
    (ret.rc == 10)

Defining “changed”¶

Ansible lets you define when a particular task has “changed” a remote node using the changed_when conditional. This lets you determine, based on return codes or output, whether a change should be reported in Ansible statistics and whether a handler should be triggered or not. As with all conditionals in Ansible, lists of multiple changed_when conditions are joined with an implicit and, meaning the task only reports a change when all conditions are met. If you want to report a change when any of the conditions is met, you must define the conditions in a string with an explicit or operator. For example:

tasks:

  - name: Report 'changed' when the return code is not equal to 2
    ansible.builtin.shell: /usr/bin/billybass --mode="take me to the river"
    register: bass_result
    changed_when: "bass_result.rc != 2"

  - name: This will never report 'changed' status
    ansible.builtin.shell: wall 'beep'
    changed_when: False

You can also combine multiple conditions to override “changed” result:

- name: Combine multiple conditions to override 'changed' result
  ansible.builtin.command: /bin/fake_command
  register: result
  ignore_errors: True
  changed_when:
    - '"ERROR" in result.stderr'
    - result.rc == 2

See Defining failure for more conditional syntax examples.

Ensuring success for command and shell¶

The command and shell modules care about return codes, so if you have a command whose successful exit code is not zero, you can do this:

tasks:
  - name: Run this command and ignore the result
    ansible.builtin.shell: /usr/bin/somecommand || /bin/true

Aborting a play on all hosts¶

Sometimes you want a failure on a single host, or failures on a certain percentage of hosts, to abort the entire play on all hosts. You can stop play execution after the first failure happens with any_errors_fatal. For finer-grained control, you can use max_fail_percentage to abort the run after a given percentage of hosts has failed.

Aborting on the first error: any_errors_fatal¶

If you set any_errors_fatal and a task returns an error, Ansible finishes the fatal task on all hosts in the current batch, then stops executing the play on all hosts. Subsequent tasks and plays are not executed. You can recover from fatal errors by adding a rescue section to the block. You can set any_errors_fatal at the play or block level:

- hosts: somehosts
  any_errors_fatal: true
  roles:
    - myrole

- hosts: somehosts
  tasks:
    - block:
        - include_tasks: mytasks.yml
      any_errors_fatal: true

You can use this feature when all tasks must be 100% successful to continue playbook execution. For example, if you run a service on machines in multiple data centers with load balancers to pass traffic from users to the service, you want all load balancers to be disabled before you stop the service for maintenance. To ensure that any failure in the task that disables the load balancers will stop all other tasks:

---
- hosts: load_balancers_dc_a
  any_errors_fatal: true

  tasks:
    - name: Shut down datacenter 'A'
      ansible.builtin.command: /usr/bin/disable-dc

- hosts: frontends_dc_a

  tasks:
    - name: Stop service
      ansible.builtin.command: /usr/bin/stop-software

    - name: Update software
      ansible.builtin.command: /usr/bin/upgrade-software

- hosts: load_balancers_dc_a

  tasks:
    - name: Start datacenter 'A'
      ansible.builtin.command: /usr/bin/enable-dc

In this example Ansible starts the software upgrade on the front ends only if all of the load balancers are successfully disabled.

Setting a maximum failure percentage¶

By default, Ansible continues to execute tasks as long as there are hosts that have not yet failed. In some situations, such as when executing a rolling update, you may want to abort the play when a certain threshold of failures has been reached. To achieve this, you can set a maximum failure percentage on a play:

---
- hosts: webservers
  max_fail_percentage: 30
  serial: 10

The max_fail_percentage setting applies to each batch when you use it with serial. In the example above, if more than 3 of the 10 servers in the first (or any) batch of servers failed, the rest of the play would be aborted.

Note

The percentage set must be exceeded, not equaled. For example, if serial were set to 4 and you wanted the task to abort the play when 2 of the systems failed, set the max_fail_percentage at 49 rather than 50.

Controlling errors in blocks¶

You can also use blocks to define responses to task errors. This approach is similar to exception handling in many programming languages. See Handling errors with blocks for details and examples.

When Ansible receives a non-zero return code from a command or a failure from a module, by default it stops executing on that host and continues on other hosts. However, in some circumstances you may want different behavior. Sometimes a non-zero return code indicates success. Sometimes you want a failure on one host to stop execution on all hosts. Ansible provides tools and settings to handle these situations and help you get the behavior, output, and reporting you want.

  • Ignoring failed commands
  • Ignoring unreachable host errors
  • Resetting unreachable hosts
  • Handlers and failure
  • Defining failure
  • Defining “changed”
  • Ensuring success for command and shell
  • Aborting a play on all hosts

    • Aborting on the first error: any_errors_fatal
    • Setting a maximum failure percentage
  • Controlling errors in blocks

Ignoring failed commands

By default Ansible stops executing tasks on a host when a task fails on that host. You can use ignore_errors to continue on in spite of the failure:

- name: Do not count this as a failure
  ansible.builtin.command: /bin/false
  ignore_errors: yes

The ignore_errors directive only works when the task is able to run and returns a value of ‘failed’. It does not make Ansible ignore undefined variable errors, connection failures, execution issues (for example, missing packages), or syntax errors.

Ignoring unreachable host errors

New in version 2.7.

You can ignore a task failure due to the host instance being ‘UNREACHABLE’ with the ignore_unreachable keyword. Ansible ignores the task errors, but continues to execute future tasks against the unreachable host. For example, at the task level:

- name: This executes, fails, and the failure is ignored
  ansible.builtin.command: /bin/true
  ignore_unreachable: yes

- name: This executes, fails, and ends the play for this host
  ansible.builtin.command: /bin/true

And at the playbook level:

- hosts: all
  ignore_unreachable: yes
  tasks:
  - name: This executes, fails, and the failure is ignored
    ansible.builtin.command: /bin/true

  - name: This executes, fails, and ends the play for this host
    ansible.builtin.command: /bin/true
    ignore_unreachable: no

Resetting unreachable hosts

If Ansible cannot connect to a host, it marks that host as ‘UNREACHABLE’ and removes it from the list of active hosts for the run. You can use meta: clear_host_errors to reactivate all hosts, so subsequent tasks can try to reach them again.

Handlers and failure

Ansible runs handlers at the end of each play. If a task notifies a handler but another task fails later in the play, by default the handler does not run on that host, which may leave the host in an unexpected state. For example, a task could update a configuration file and notify a handler to restart some service. If a task later in the same play fails, the configuration file might be changed but the service will not be restarted.

You can change this behavior with the --force-handlers command-line option, by including force_handlers: True in a play, or by adding force_handlers = True to ansible.cfg. When handlers are forced, Ansible will run all notified handlers on all hosts, even hosts with failed tasks. (Note that certain errors could still prevent the handler from running, such as a host becoming unreachable.)

Defining failure

Ansible lets you define what “failure” means in each task using the failed_when conditional. As with all conditionals in Ansible, lists of multiple failed_when conditions are joined with an implicit and, meaning the task only fails when all conditions are met. If you want to trigger a failure when any of the conditions is met, you must define the conditions in a string with an explicit or operator.

You may check for failure by searching for a word or phrase in the output of a command:

- name: Fail task when the command error output prints FAILED
  ansible.builtin.command: /usr/bin/example-command -x -y -z
  register: command_result
  failed_when: "'FAILED' in command_result.stderr"

or based on the return code:

- name: Fail task when both files are identical
  ansible.builtin.raw: diff foo/file1 bar/file2
  register: diff_cmd
  failed_when: diff_cmd.rc == 0 or diff_cmd.rc >= 2

You can also combine multiple conditions for failure. This task will fail if both conditions are true:

- name: Check if a file exists in temp and fail task if it does
  ansible.builtin.command: ls /tmp/this_should_not_be_here
  register: result
  failed_when:
    - result.rc == 0
    - '"No such" not in result.stdout'

If you want the task to fail when only one condition is satisfied, change the failed_when definition to:

failed_when: result.rc == 0 or "No such" not in result.stdout

If you have too many conditions to fit neatly into one line, you can split it into a multi-line yaml value with >:

- name: example of many failed_when conditions with OR
  ansible.builtin.shell: "./myBinary"
  register: ret
  failed_when: >
    ("No such file or directory" in ret.stdout) or
    (ret.stderr != '') or
    (ret.rc == 10)

Defining “changed”

Ansible lets you define when a particular task has “changed” a remote node using the changed_when conditional. This lets you determine, based on return codes or output, whether a change should be reported in Ansible statistics and whether a handler should be triggered or not. As with all conditionals in Ansible, lists of multiple changed_when conditions are joined with an implicit and, meaning the task only reports a change when all conditions are met. If you want to report a change when any of the conditions is met, you must define the conditions in a string with an explicit or operator. For example:

tasks:

  - name: Report 'changed' when the return code is not equal to 2
    ansible.builtin.shell: /usr/bin/billybass --mode="take me to the river"
    register: bass_result
    changed_when: "bass_result.rc != 2"

  - name: This will never report 'changed' status
    ansible.builtin.shell: wall 'beep'
    changed_when: False

You can also combine multiple conditions to override “changed” result:

- name: Combine multiple conditions to override 'changed' result
  ansible.builtin.command: /bin/fake_command
  register: result
  ignore_errors: True
  changed_when:
    - '"ERROR" in result.stderr'
    - result.rc == 2

See Defining failure for more conditional syntax examples.

Ensuring success for command and shell

The command and shell modules care about return codes, so if you have a command whose successful exit code is not zero, you can do this:

tasks:
  - name: Run this command and ignore the result
    ansible.builtin.shell: /usr/bin/somecommand || /bin/true

Aborting a play on all hosts

Sometimes you want a failure on a single host, or failures on a certain percentage of hosts, to abort the entire play on all hosts. You can stop play execution after the first failure happens with any_errors_fatal. For finer-grained control, you can use max_fail_percentage to abort the run after a given percentage of hosts has failed.

Aborting on the first error: any_errors_fatal

If you set any_errors_fatal and a task returns an error, Ansible finishes the fatal task on all hosts in the current batch, then stops executing the play on all hosts. Subsequent tasks and plays are not executed. You can recover from fatal errors by adding a rescue section to the block. You can set any_errors_fatal at the play or block level:

- hosts: somehosts
  any_errors_fatal: true
  roles:
    - myrole

- hosts: somehosts
  tasks:
    - block:
        - include_tasks: mytasks.yml
      any_errors_fatal: true

You can use this feature when all tasks must be 100% successful to continue playbook execution. For example, if you run a service on machines in multiple data centers with load balancers to pass traffic from users to the service, you want all load balancers to be disabled before you stop the service for maintenance. To ensure that any failure in the task that disables the load balancers will stop all other tasks:

---
- hosts: load_balancers_dc_a
  any_errors_fatal: true

  tasks:
    - name: Shut down datacenter 'A'
      ansible.builtin.command: /usr/bin/disable-dc

- hosts: frontends_dc_a

  tasks:
    - name: Stop service
      ansible.builtin.command: /usr/bin/stop-software

    - name: Update software
      ansible.builtin.command: /usr/bin/upgrade-software

- hosts: load_balancers_dc_a

  tasks:
    - name: Start datacenter 'A'
      ansible.builtin.command: /usr/bin/enable-dc

In this example Ansible starts the software upgrade on the front ends only if all of the load balancers are successfully disabled.

Setting a maximum failure percentage

By default, Ansible continues to execute tasks as long as there are hosts that have not yet failed. In some situations, such as when executing a rolling update, you may want to abort the play when a certain threshold of failures has been reached. To achieve this, you can set a maximum failure percentage on a play:

---
- hosts: webservers
  max_fail_percentage: 30
  serial: 10

The max_fail_percentage setting applies to each batch when you use it with serial. In the example above, if more than 3 of the 10 servers in the first (or any) batch of servers failed, the rest of the play would be aborted.

Note

The percentage set must be exceeded, not equaled. For example, if serial were set to 4 and you wanted the task to abort the play when 2 of the systems failed, set the max_fail_percentage at 49 rather than 50.

Controlling errors in blocks

You can also use blocks to define responses to task errors. This approach is similar to exception handling in many programming languages. See Handling errors with blocks for details and examples.

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

Перестал запускаться Битрикс 24 после того как перезагрузили виртуальный сервер. Имеем Битрикс 24 (коробка) виртуальный сервер на базе Centos. В десктоп приложении постоянно крутит «Идет загрузка» , а в браузере «Не удается получить доступ к сайту». Виртуальную машину перегружал. Куда смотреть? Где можно посмотреть логи?

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

 

Пользователь 279792

Эксперт

Сообщений: 295
Баллов: 58
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.09.2014

Место на диске закончилось

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

Места хватает. Свободно 357 Гб

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

Комманда sudo nginx -t выдала такое сообщение

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

Скинул ssl сертификат. Заработало десктопное приложение и в браузере. Мобильное приложение не работает (пишет Что-то пошло не так и не грузится). В довесок не ставится SSL сертификат lets encrypt. VM 7.5.0. Куда копать?
При установки выдает такое сообщение:

 

Пользователь 279792

Эксперт

Сообщений: 295
Баллов: 58
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.09.2014

#7

0

14.12.2021 22:07:54

Цитата
написал:
Скинул ssl сертификат. Заработало десктопное приложение и в браузере. Мобильное приложение не работает (пишет Что-то пошло не так и не грузится). В довесок не ставится SSL сертификат lets encrypt. VM 7.5.0. Куда копать?
При установки выдает такое сообщение

Сделайте все вот так:

https://dev.1c-bitrix.ru/community/forums/messages/forum23/topic144342/message6973­81/#message697381

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

Сделал как Вы сказали. При установки сертификата ошибка. («non-zero return code», «rc»: 1, «start»: «2021-12-15 13:07:29.996084», «stderr»: «», «stderr_lines»: [], «stdout»: «», «stdout_lines»: []}fatal: [bitrix.aaa.com.ua]: FAILED! => {«changed»: true, «cmd»: «/home/bitrix/dehydrated/dehydrated -c —force > /home/bitrix/dehydrated_update.log 2>&1», «delta»: «0:00:12.629085», «end»: «2021-12-15 13:07:42.625169», «msg»: «non-zero return code», «rc»: 1, «start»: «2021-12-15 13:07:29.996084», «stderr»: «», «stderr_lines»: [], «stdout»: «», «stdout_lines»: []})

 

Пользователь 279792

Эксперт

Сообщений: 295
Баллов: 58
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.09.2014

#9

0

15.12.2021 22:15:27

Цитата
написал:
Сделал как Вы сказали. При установки сертификата ошибка. («non-zero return code», «rc»: 1, «start»: «2021-12-15 13:07:29.996084», «stderr»: «», «stderr_lines»: [], «stdout»: «», «stdout_lines»: []}fatal: [bitrix.aaa.com.ua]: FAILED! => {«changed»: true, «cmd»: «/home/bitrix/dehydrated/dehydrated -c —force > /home/bitrix/dehydrated_update.log 2>&1», «delta»: «0:00:12.629085», «end»: «2021-12-15 13:07:42.625169», «msg»: «non-zero return code», «rc»: 1, «start»: «2021-12-15 13:07:29.996084», «stderr»: «», «stderr_lines»: [], «stdout»: «», «stdout_lines»: []})

Обновили и систему и окружение?
У вас домен или поддомен или ваще ip?
443 и 80 порт открыты?
Есть ли прокси?
В Управление масштабированием — может у вас https отключен?

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

#10

0

16.12.2021 18:08:01

Цитата
написал:

Цитата
написал:
Сделал как Вы сказали. При установки сертификата ошибка. («non-zero return code», «rc»: 1, «start»: «2021-12-15 13:07:29.996084», «stderr»: «», «stderr_lines»: [], «stdout»: «», «stdout_lines»: []}fatal: [bitrix.aaa.com.ua]: FAILED! => {«changed»: true, «cmd»: «/home/bitrix/dehydrated/dehydrated -c —force > /home/bitrix/dehydrated_update.log 2>&1», «delta»: «0:00:12.629085», «end»: «2021-12-15 13:07:42.625169», «msg»: «non-zero return code», «rc»: 1, «start»: «2021-12-15 13:07:29.996084», «stderr»: «», «stderr_lines»: [], «stdout»: «», «stdout_lines»: []})

Обновили и систему и окружение?
У вас домен или поддомен или ваще ip?
443 и 80 порт открыты?
Есть ли прокси?
В Управление масштабированием — может у вас https отключен?

Обновил и систему и окружение.
Поддомен (субдомен)
https — включен (точнее там такого пункта нет, есть только включить http и отключить http)
Прокси -нет
порты открыты

 

Пользователь 279792

Эксперт

Сообщений: 295
Баллов: 58
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.09.2014

#11

0

16.12.2021 18:35:08

Поддомен (субдомен) — дело в этом…
Все DNS записи домена и поддомена должны быть на сервере регистраторе
Сделайте отдельный домен

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

#12

0

16.12.2021 18:42:10

Цитата
написал:
Поддомен (субдомен) — дело в этом…
Все DNS записи домена и поддомена должны быть на сервере регистраторе
Сделайте отдельный домен

Интересно то что до перезагрузки сервера все работало. И сертификат обновлялся сам. Не совсем понял что значит сделать отдельный домен? Сейчас у нас субдомен класса А — и указанный IP адрес vps сурвера на котором стоит Битрикс.

 

Пользователь 279792

Эксперт

Сообщений: 295
Баллов: 58
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 03.09.2014

#13

0

16.12.2021 21:02:27

Цитата
написал:

Цитата
написал:
Поддомен (субдомен) — дело в этом…
Все DNS записи домена и поддомена должны быть на сервере регистраторе
Сделайте отдельный домен

Интересно то что до перезагрузки сервера все работало. И сертификат обновлялся сам. Не совсем понял что значит сделать отдельный домен? Сейчас у нас субдомен класса А — и указанный IP адрес vps сурвера на котором стоит Битрикс.

Напишите ваш поддомен Б24, я проверю записи

 

Пользователь 3289321

Заглянувший

Сообщений: 14
Баллов: 1
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 18.06.2019

#14

0

22.12.2021 18:08:18

Проблему решил. Сертификат установил. Добавил запись на стороне хостера. (был bitrix.xxxx.xx.xx тип А ip добавил еще одну запись

www.bitrix.xxxx.xx.xx

тип А ip). Установка сертификата прошла успешно. Мобильное приложение работает. Тему можно закрыть. Всем спасибо за помощь.

Image

Exit codes

When you execute a command in Linux, it generates a numeric return code. This happens whether you’re running the command directly from the shell, from a script, or even from an Ansible playbook. You can use those return codes to handle the result of that command properly.

What the return codes mean

When running commands at a shell prompt, the special variable $? contains a number that indicates the result of the last command executed.

[ Download now: A sysadmin’s guide to Bash scripting. ]

A zero (0) means everything went fine. Anything else means there is a problem.

A value of 1 generically indicates that some error has happened.

$ who
admin2   :1           2022-03-15 10:14 (:1)

$ echo $?
0

$ who | grep thisstringdoesnotexist

$ echo $?
1

In the example above, I executed the who command, which showed that I am admin2.

Immediately after that, I executed echo $?, and it returned zero because the previous command was executed successfully.

Then I executed the same who command (which I know is working fine) and piped that to grep with the non-existing argument. This time the $? variable contains a 1.

Why? It’s because the last command executed was grep, which returns 1 when it cannot find the argument in its input.

[ Free eBook: Manage your Linux environment for success ]

Here is another example:

$ls myfile.cfg
ls: cannot access 'myfile.cfg': No such file or directory

$echo $?
2

Here I tried to list a file that doesn’t exist. Then when I entered echo $? I got 2, which is how the ls command indicates that the argument is not a file or directory name.

Customize the return code

You can also use the exit command from a shell script to customize the return code to the caller script.

The following script illustrates this:

#!/bin/bash

if [ ! -f myfile.cfg ];
then
  echo The file does not exist and we display an error
  exit 64
fi

echo The file exists and we will do something
echo "(Not really doing anything, but this is where we could do it)"

exit 0
$./myscrypt.sh 
The file does not exist and we display an error

$echo $?
64

$touch myfile.cfg

$./myscrypt.sh 
The file exists and we will do something
(Not really doing anything, but this is where we could do it)

$echo $?
0

In this script, I explicitly provide the exit code for the failed and for the successful cases. Some observations:

  1. If I do not explicitly use exit 0, the return code from myscript.sh will be the return code from the last command executed inside it. This could be what I want, but here I wanted to state the return code pretty clearly inside the script.
  2. I used 64 as an arbitrary return code for the error condition. The Advanced Bash-Scripting Guide offers some guidelines about exit code values.

Test the return code with a shell script

If you need to test the return code of a command you invoked on your shell script, you just need to test the $? variable immediately after the command executes.

#!/bin/bash

# A snipet from a shell script ...
# Next we will invoke a command or another shell script

./myscript.sh

RETURN=$?

if [ $RETURN -eq 0 ];
then
  echo "The script myscript.sh was executed successfuly"
  exit 0
else
  echo "The script myscript.sh was NOT executed successfuly and returned the code $RETURN"
  exit $RETURN
fi 

In this example, after invoking my command or script, I saved the exit code from $? on a variable for further utilization. (Again, $? returns the status of the last command, so you need to be careful if you run more commands—even a simple echo.).

Test the return code with an Ansible playbook

It is recommended to avoid running shell commands from an Ansible playbook if there is an Ansible module that performs the same action. This is especially because with a module you have better odds of being idempotent.

[ Ready to start automating? Check out this Ansible quick start series. ]

To illustrate how to handle return codes from a shell command, check this simple playbook:

---
- name: Executes a shell script
  hosts: localhost
  gather_facts: no
  tasks:
  - name: Execute the shell script
    shell: ./myscript.sh
    ignore_errors: true
    register: result

  - name: Shows the result of executing the script
    debug:
      msg: 
      - "Return code...: {{ result.rc }}"
      - "{{ result.stdout_lines }}"

This is the Ansible playbook executed when a script returns an error:

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match
'all'

PLAY [Executes a shell script] *****************************************************************************************

TASK [Execute the shell script] ****************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "./myscript.sh", "delta": "0:00:00.003315", "end": "2022-06-13 15:35:06.123759", "msg": "non-zero return code", "rc": 64, "start": "2022-06-13 15:35:06.120444", "stderr": "", "stderr_lines": [], "stdout": "The file does not exist and we display an error", "stdout_lines": ["The file does not exist and we display an error"]}
...ignoring

TASK [Shows the result of executing the script] ************************************************************************
ok: [localhost] => {
    "msg": [
        "Return code...: 64",
        [
            "The file does not exist and we display an error"
        ]
    ]
}

PLAY RECAP *************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   

I defined the task to ignore the error, so in the next task, I can simply display the return code and message from the script. I could also have handled the return code in my Ansible playbook by using the result.rc variable with some combination of the assert module or adding the when condition to another task.

Wrapping up

Now you have some knowledge about the return codes from commands and scripts invoked by your shell scripts and Ansible playbooks. I hope this helps you handle your scripts more easily.

When Ansible receives a non-zero return code from a command or a failure from a module, by default it stops executing on that host and continues on other hosts. However, in some circumstances you may want different behavior. Sometimes a non-zero return code indicates success. Sometimes you want a failure on one host to stop execution on all hosts. Ansible provides tools and settings to handle these situations and help you get the behavior, output, and reporting you want.

Ignoring failed commands


By default Ansible stops executing tasks on a host when a task fails on that host. You can use ignore_errors to continue on in spite of the failure:

— name: Do not count this as a failure
  ansible.builtin.command: /bin/false
  ignore_errors: yes

The ignore_errors directive only works when the task is able to run and returns a value of ‘failed’. It does not make Ansible ignore undefined variable errors, connection failures, execution issues (for example, missing packages), or syntax errors.

Ignoring unreachable host errors

You can ignore a task failure due to the host instance being ‘UNREACHABLE’ with the ignore_unreachable keyword. Ansible ignores the task errors, but continues to execute future tasks against the unreachable host. For example, at the task level:

— name: This executes, fails, and the failure is ignored
  ansible.builtin.command: /bin/true
  ignore_unreachable: yes

— name: This executes, fails, and ends the play for this host
  ansible.builtin.command: /bin/true

And at the playbook level:

— hosts: all
  ignore_unreachable: yes
  tasks:
  — name: This executes, fails, and the failure is ignored
    ansible.builtin.command: /bin/true

  — name: This executes, fails, and ends the play for this host
    ansible.builtin.command: /bin/true
    ignore_unreachable: no

Resetting unreachable hosts


If Ansible cannot connect to a host, it marks that host as ‘UNREACHABLE’ and removes it from the list of active hosts for the run. You can use meta: clear_host_errors to reactivate all hosts, so subsequent tasks can try to reach them again.


Ansible runs handlers at the end of each play. If a task notifies a handler but another task fails later in the play, by default the handler does not run on that host, which may leave the host in an unexpected state. For example, a task could update a configuration file and notify a handler to restart some service. If a task later in the same play fails, the configuration file might be changed but the service will not be restarted.
You can change this behavior with the —force-handlers command-line option, by including force_handlers: True in a play, or by adding force_handlers = True to ansible.cfg. When handlers are forced, Ansible will run all notified handlers on all hosts, even hosts with failed tasks. (Note that certain errors could still prevent the handler from running, such as a host becoming unreachable.)


Ansible lets you define what “failure” means in each task using the failed_when conditional. As with all conditionals in Ansible, lists of multiple failed_when conditions are joined with an implicit and, meaning the task only fails when all conditions are met. If you want to trigger a failure when any of the conditions is met, you must define the conditions in a string with an explicit or operator.

You may check for failure by searching for a word or phrase in the output of a command:

— name: Fail task when the command error output prints FAILED
  ansible.builtin.command: /usr/bin/example-command -x -y -z
  register: command_result
  failed_when: «‘FAILED’ in command_result.stderr»

or based on the return code:

— name: Fail task when both files are identical
  ansible.builtin.raw: diff foo/file1 bar/file2
  register: diff_cmd
  failed_when: diff_cmd.rc == 0 or diff_cmd.rc >= 2

You can also combine multiple conditions for failure. This task will fail if both conditions are true:

— name: Check if a file exists in temp and fail task if it does
  ansible.builtin.command: ls /tmp/this_should_not_be_here
  register: result
  failed_when:
    — result.rc == 0
    — ‘»No such» not in result.stdout’

If you want the task to fail when only one condition is satisfied, change the failed_when definition to:
failed_when: result.rc == 0 or «No such» not in result.stdout

If you have too many conditions to fit neatly into one line, you can split it into a multi-line yaml value with >:

— name: example of many failed_when conditions with OR
  ansible.builtin.shell: «./myBinary»
  register: ret
  failed_when: >
    («No such file or directory» in ret.stdout) or
    (ret.stderr != ») or
    (ret.rc == 10)


Ansible lets you define when a particular task has “changed” a remote node using the changed_when conditional. This lets you determine, based on return codes or output, whether a change should be reported in Ansible statistics and whether a handler should be triggered or not. As with all conditionals in Ansible, lists of multiple changed_when conditions are joined with an implicit and, meaning the task only reports a change when all conditions are met. If you want to report a change when any of the conditions is met, you must define the conditions in a string with an explicit or operator. For example:

  — name: Report ‘changed’ when the return code is not equal to 2
    ansible.builtin.shell: /usr/bin/billybass —mode=»take me to the river»
    register: bass_result
    changed_when: «bass_result.rc != 2»

  — name: This will never report ‘changed’ status
    ansible.builtin.shell: wall ‘beep’
    changed_when: False

You can also combine multiple conditions to override “changed” result:

— name: Combine multiple conditions to override ‘changed’ result
  ansible.builtin.command: /bin/fake_command
  register: result
  ignore_errors: True
  changed_when:
    — ‘»ERROR» in result.stderr’
    — result.rc == 2

Ensuring success for command and shell


The command and shell modules care about return codes, so if you have a command whose successful exit code is not zero, you can do this:

tasks:
  — name: Run this command and ignore the result
    ansible.builtin.shell: /usr/bin/somecommand || /bin/true

Aborting a play on all hosts

Sometimes you want a failure on a single host, or failures on a certain percentage of hosts, to abort the entire play on all hosts. You can stop play execution after the first failure happens with any_errors_fatal. For finer-grained control, you can use max_fail_percentage to abort the run after a given percentage of hosts has failed.

Aborting on the first error: any_errors_fatal


If you set any_errors_fatal and a task returns an error, Ansible finishes the fatal task on all hosts in the current batch, then stops executing the play on all hosts. Subsequent tasks and plays are not executed. You can recover from fatal errors by adding a rescue section to the block. You can set any_errors_fatal at the play or block level:

— hosts: somehosts
  any_errors_fatal: true
  roles:
    — myrole
— hosts: somehosts
  tasks:
    — block:
        — include_tasks: mytasks.yml
      any_errors_fatal: true

You can use this feature when all tasks must be 100% successful to continue playbook execution. For example, if you run a service on machines in multiple data centers with load balancers to pass traffic from users to the service, you want all load balancers to be disabled before you stop the service for maintenance. To ensure that any failure in the task that disables the load balancers will stop all other tasks:


— hosts: load_balancers_dc_a
  any_errors_fatal: true
  tasks:
    — name: Shut down datacenter ‘A’
      ansible.builtin.command: /usr/bin/disable-dc
— hosts: frontends_dc_a
  tasks:
    — name: Stop service
      ansible.builtin.command: /usr/bin/stop-software
    — name: Update software
      ansible.builtin.command: /usr/bin/upgrade-software
— hosts: load_balancers_dc_a
  tasks:
    — name: Start datacenter ‘A’
      ansible.builtin.command: /usr/bin/enable-dc

In this example Ansible starts the software upgrade on the front ends only if all of the load balancers are successfully disabled.

Setting a maximum failure percentage


By default, Ansible continues to execute tasks as long as there are hosts that have not yet failed. In some situations, such as when executing a rolling update, you may want to abort the play when a certain threshold of failures has been reached. To achieve this, you can set a maximum failure percentage on a play:


— hosts: webservers
  max_fail_percentage: 30
  serial: 10

The max_fail_percentage setting applies to each batch when you use it with serial. In the example above, if more than 3 of the 10 servers in the first (or any) batch of servers failed, the rest of the play would be aborted.

Note
The percentage set must be exceeded, not equaled. For example, if serial were set to 4 and you wanted the task to abort the play when 2 of the systems failed, set the max_fail_percentage at 49 rather than 50.

Controlling errors in blocks

You can also use blocks to define responses to task errors. This approach is similar to exception handling in many programming languages.

Blocks create logical groups of tasks. Blocks also offer ways to handle task errors, similar to exception handling in many programming languages.

  • Grouping tasks with blocks
  • Handling errors with blocks

Grouping tasks with blocks

All tasks in a block inherit directives applied at the block level. Most of what you can apply to a single task (with the exception of loops) can be applied at the block level, so blocks make it much easier to set data or directives common to the tasks. The directive does not affect the block itself, it is only inherited by the tasks enclosed by a block. For example, a when statement is applied to the tasks within a block, not to the block itself.

Block example with named tasks inside the block

 tasks:

   — name: Install, configure, and start Apache

     block:

       — name: Install httpd and memcached

         ansible.builtin.yum:

           name:

           — httpd

           — memcached

           state: present

       — name: Apply the foo config template

         ansible.builtin.template:

           src: templates/src.j2

           dest: /etc/foo.conf

       — name: Start service bar and enable it

         ansible.builtin.service:

           name: bar

           state: started

           enabled: True

     when: ansible_facts[‘distribution’] == ‘CentOS’

     become: true

     become_user: root

     ignore_errors: yes

In the example above, the ‘when’ condition will be evaluated before Ansible runs each of the three tasks in the block. All three tasks also inherit the privilege escalation directives, running as the root user. Finally, ignore_errors: yes ensures that Ansible continues to execute the playbook even if some of the tasks fail.

Names for blocks have been available since Ansible 2.3. We recommend using names in all tasks, within blocks or elsewhere, for better visibility into the tasks being executed when you run the playbook.

Handling errors with blocks

You can control how Ansible responds to task errors using blocks with rescue and always sections.

Rescue blocks specify tasks to run when an earlier task in a block fails. This approach is similar to exception handling in many programming languages. Ansible only runs rescue blocks after a task returns a ‘failed’ state. Bad task definitions and unreachable hosts will not trigger the rescue block.

Block error handling example

 tasks:

 — name: Handle the error

   block:

     — name: Print a message

       ansible.builtin.debug:

         msg: ‘I execute normally’

     — name: Force a failure

       ansible.builtin.command: /bin/false

     — name: Never print this

       ansible.builtin.debug:

         msg: ‘I never execute, due to the above task failing, :-(‘

   rescue:

     — name: Print when errors

       ansible.builtin.debug:

         msg: ‘I caught an error, can do stuff here to fix it, :-)’

You can also add an always section to a block. Tasks in the always section run no matter what the task status of the previous block is.

Block with always section

 — name: Always do X

   block:

     — name: Print a message

       ansible.builtin.debug:

         msg: ‘I execute normally’

     — name: Force a failure

       ansible.builtin.command: /bin/false

     — name: Never print this

       ansible.builtin.debug:

         msg: ‘I never execute :-(‘

   always:

     — name: Always do this

       ansible.builtin.debug:

         msg: «This always executes, :-)»

Together, these elements offer complex error handling.

Block with all sections

— name: Attempt and graceful roll back demo

  block:

    — name: Print a message

      ansible.builtin.debug:

        msg: ‘I execute normally’

    — name: Force a failure

      ansible.builtin.command: /bin/false

    — name: Never print this

      ansible.builtin.debug:

        msg: ‘I never execute, due to the above task failing, :-(‘

  rescue:

    — name: Print when errors

      ansible.builtin.debug:

        msg: ‘I caught an error’

    — name: Force a failure in middle of recovery! >:-)

      ansible.builtin.command: /bin/false

    — name: Never print this

      ansible.builtin.debug:

        msg: ‘I also never execute :-(‘

  always:

    — name: Always do this

      ansible.builtin.debug:

        msg: «This always executes»

The tasks in the block execute normally. If any tasks in the block return failed, the rescue section executes tasks to recover from the error. The always section runs regardless of the results of the block and rescue sections.

If an error occurs in the block and the rescue task succeeds, Ansible reverts the failed status of the original task for the run and continues to run the play as if the original task had succeeded. The rescued task is considered successful, and does not trigger max_fail_percentage or any_errors_fatal configurations. However, Ansible still reports a failure in the playbook statistics.

You can use blocks with flush_handlers in a rescue task to ensure that all handlers run even if an error occurs:

Block run handlers in error handling

 tasks:

   — name: Attempt and graceful roll back demo

     block:

       — name: Print a message

         ansible.builtin.debug:

           msg: ‘I execute normally’

         changed_when: yes

         notify: run me even after an error

       — name: Force a failure

         ansible.builtin.command: /bin/false

     rescue:

       — name: Make sure all handlers run

         meta: flush_handlers

 handlers:

    — name: Run me even after an error

      ansible.builtin.debug:

        msg: ‘This handler runs even on error’

Ansible provides a couple of variables for tasks in the rescue portion of a block:

ansible_failed_task

The task that returned ‘failed’ and triggered the rescue. For example, to get the name use ansible_failed_task.name.

ansible_failed_result

The captured return result of the failed task that triggered the rescue. This would equate to having used this var in the register keyword.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Nox brawl stars произошла ошибка
  • Novex стиральная машина ошибка е21