Как использовать отказоустойчивые модули Ansible для печати нескольких пользовательских сообщений - PullRequest
0 голосов
/ 19 октября 2019

Я хочу, чтобы мой playbook вышел из строя при двух условиях.

  1. Если результаты SQL-запроса не возвращены базой данных
  2. Если возвращенный результат SQL-запроса содержит строку "775"

Ниже работает Playbookхорошо и делает свою работу.

- name: "Play 1"
  hosts: localhost
   - name: "Search for Number"
     command: >
       mysql --user="{{ DBUSER }}" --password="{{ DBPASS }}" deployment
       --host=localhost --batch --skip-column-names
       --execute="SELECT num FROM deploy_tbl"     
     register: command_result 
     failed_when: command_result.stdout is search('775') or command_result.rc != 0
     when: Layer == 'APP'  

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

   - name: Make Sure the mandatory input values are passed 
     fail:
       msg: "This REQ is already Deployed. Hence retry with a Unique Number."
     when: command_result.stdout is search('775')

   - name: Make Sure the mandatory input values are passed 
     fail:
       msg: "Database is not reachable."
     when: command_result.rc != 0 

Это дает мне синтаксическую ошибку при запуске playbook.

Я пользуюсь последней версией Ansible.

Подскажите, пожалуйста, как можно обновить мой плакат для печати любого из пользовательских сообщений на основе проверки состояния?

1 Ответ

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

Вы, вероятно, должны опубликовать всю свою книгу сразу за один блок кода, потому что в вставленных вами битах нет абсолютно никаких синтаксических проблем.

Между тем, если вы хотите выполнить свое требование, вы сначала должнычтобы понять, что по умолчанию ваша книга воспроизведения остановится, как только возникнет ошибка в задании. Таким образом, в вашем случае задачи fail никогда не будут выполняться так, как они выполняются после невыполненной задачи.

Одним из способов решения этой проблемы является использование ignore_error на вашемtask.

В большинстве случаев я считаю, что блоки и их функция обработки ошибок лучше подходят для таких сценариев.

  • В приведенном ниже примере используется block. Я фальсифицировал вызов sql с помощью переменной playbook (которую можно изменить, чтобы поиграть) и задачи debug, используя те же условия when, что и у вас.
  • Я также изменил способ вызова failтак что вам нужно сделать это только один раз с фильтром ternary .
  • Если вы не знакомы с нотацией >- в yaml, взгляните на определение скалярных блоков . Я использовал это, чтобы ограничить длину строки и облегчить чтение.
---
- hosts: localhost
  gather_facts: false

  vars:
    command_result:
      stdout: "775"
      rc: "0"

  tasks:
    - block:
       - name: Fake task to mimic sql query
         debug:
           var: command_result
         failed_when: command_result.stdout is search('775') or command_result.rc != 0

      rescue:
        - name: Make Sure the mandatory input values are passed
          fail:
            msg: >-
              {{
                command_result.stdout is search('775') |
                ternary(
                  "This REQ is already Deployed. Hence retry with a Unique Number.",
                  "Database is not reachable."
                )
              }}

, что дает:

PLAY [localhost] *********************************************************************

TASK [Fake task to mimic sql query] **************************************************
fatal: [localhost]: FAILED! => {
    "command_result": {
        "rc": "0",
        "stdout": "775"
    },
    "failed_when_result": true
}

TASK [Make Sure the mandatory input values are passed] *******************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "This REQ is already Deployed. Hence retry with a Unique Number."}

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