Поднять ошибку на основе результатов другой задачи - PullRequest
1 голос
/ 07 октября 2019

Я использую модуль postgresql_db , который является частью Ansible. Например, с чем-то вроде

- name: Database
  postgresql_db:
    name: "{{ vars[item + '_database_name_version']  }}"
    login_host: "{{ vars[item + '_database_host'] }}"
    login_password: "{{ vars[item + '_database_admin_password'] }}"
    login_user: "{{ vars[item + '_database_admin_username'] }}"
    port: "{{ vars[item + '_database_port'] }}"
    state: restore
    target: "{{ backup_restore[item]['db_tar'] }}"
  when: backup_restore[item]['db_tar'] is defined
  with_items: '{{ backup_restore }}'
  register: db_restore

Когда я отлаживаю вывод db_restore Я вижу

TASK [backup : db_restore] *****************************************************
ok: [myapp] => {
    "db_restore": {
        "changed": true,
        "msg": "All items completed",
        "results": [
            {
                "ansible_loop_var": "item",
                "changed": true,
                "cmd": "cmd: ****",
                "failed": false,
                "invocation": {
                    "module_args": {
                        "ca_cert": null,
                        "conn_limit": "",
                        "db": "myapp_0_1_0",
                        "encoding": "",
                        "lc_collate": "",
                        "lc_ctype": "",
                        "login_host": "1.1.1.2",
                        "login_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
                        "login_unix_socket": "",
                        "login_user": "ansible",
                        "maintenance_db": "postgres",
                        "name": "myapp_0_1_0",
                        "owner": "",
                        "port": 5432,
                        "session_role": null,
                        "ssl_mode": "prefer",
                        "state": "restore",
                        "target": "/backup/tmp/myapp-myapp/myapp_daily/databases/PostgreSQL.sql.gz",
                        "target_opts": "",
                        "template": ""
                    }
                },
                "item": "myapp",
                "msg": "",
                "rc": 0,
                "stderr": "ERROR:  relation \"myapp_table\" already exists\n",
                "stderr_lines": [
                    "ERROR:  relation \"myapp_table\" already exists"
                ]
            }
        ]
    }
}

Хотя во время выполнения этого модуля возникает ошибка, видимая в stderr , модуль Ansible postgresql_db также возвращает «ошибка»: false . Похоже, что он игнорирует любые ошибки, которые могут возникнуть при выполнении команд для восстановления базы данных.

Теперь я хочу добавить задачу, чтобы проверить db_restore для stderr атрибута и, если имеется, выдайте ошибку, чтобы пользователь узнал о проблемах.

Как я могу вызвать ошибку? Есть ли модуль ошибки?

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Да, есть модуль для выдачи ошибок, который называется сбой (https://docs.ansible.com/ansible/latest/modules/fail_module.html)

# Example playbook using fail and when together
- fail:
    msg: The system may not be provisioned according to the CMDB status.
  when: cmdb_status != "to-be-staged"

Еще один возможный способ - это fail_when.

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

Я бы порекомендовал вампрочитать ответную страницу по обработке ошибок (https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html)

0 голосов
/ 07 октября 2019

Я полностью согласен с ответом @Stefan Wegener, но хочу добавить еще одну возможность. Мне любопытно, если ваша проблема возникает только из-за цикла, который вы обернули вокруг своей задачи.

Еще одно возможное решение - добавить условие any_errors_fatal: true на уровне воспроизведения, как описано вТребуемая документация:

- hosts: somehosts
  any_errors_fatal: true
  roles:
    - myrole

См. https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html#aborting-the-play для справки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...