Ansible: как выполнить условную задачу, если найдена строка?

По сути, я пытаюсь использовать условие when, чтобы решить, следует ли продолжать выполнение команды на основе наличия строки. Кажется, здесь нужно преодолеть всевозможные проблемы, в том числе наличие двоеточия, от которого я не могу избавиться."{{:}}"как обычно, потому что тогда условное выражение жалуется.

Если я усекаю все с точки двоеточия и после, вместо этого я получаю целочисленную ошибку оценки. Я просмотрел 200 сообщений в stackoverflow, и ни одно из решений, похоже, не может сделать то, что я ищу.

Соответствующая часть содержимого sync_status.stderr_lines, которую я ищу, если она появится:

      ERROR 1227 (42000) at line 1: Access denied

Код в задаче, которая пытается запустить команду, если присутствует строка с двоеточием:

           - name: Can we proceed?
       command: uptime
       when: ( 'ERROR 1227 (42000) at line 1"{{:}}" Access denied' in sync_status.stderr_lines )

Ошибка этой задачи во время выполнения:

      fatal: [server1]: FAILED! => {"msg": "The conditional check '( 'ERROR 1227 (42000) at line 1\"{{:}}\" Access denied' in sync_status.stderr_lines )' failed. The error was: template error while templating string: unexpected ':'. String: ( 'ERROR 1227 (42000) at line 1\"{{:}}\" Access denied' in sync_status.stderr_lines )\n\nThe error appears to be in '/home/ansible/ssn-project/playbooks/i_mux-sql-upgrade.yml': line 54, column 8, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n     - name: Can we proceed?\n       ^ here\n"}

Теперь "то же самое" усечено:

           - name: Can we proceed?
       command: uptime
       when: ( 'ERROR 1227 (42000) at line 1' in sync_status.stderr_lines )

И это также сбой во время выполнения:

      fatal: [mux-ds1]: FAILED! => {"msg": "The conditional check '( 'ERROR 1227 (42000) at line 1' in sync_status.stderr_lines )' failed. The error was: error while evaluating conditional (( 'ERROR 1227 (42000) at line 1' in sync_status.stderr_lines )): Unable to look up a name or access an attribute in template string ({% if ( 'ERROR 1227 (42000) at line 1' in sync_status.stderr_lines ) %} True {% else %} False {% endif %}).\nMake sure your variable name does not contain invalid characters like '-': argument of type 'AnsibleUndefined' is not iterable\n\nThe error appears to be in '/home/ansible/ssn-project/playbooks/i_mux-sql-upgrade.yml': line 54, column 8, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n     - name: Can we proceed?\n       ^ here\n"}

Есть ли способ сделать эту работу, как я ожидаю? Возможно, я думал о каком-то фильтре регулярных выражений, но, возможно, это неправильный путь. Мы будем признательны за понимание. Обратите внимание, у меня есть доступная версия 2.9.

1 ответ

Я понимаю, что тебе нравится

" выполнить... команду на основе наличия строки "

на дополнительно не указанномSTDERRвыход

ERROR 1227 (42000) at line 1: Access denied

Касательно

Соответствующая часть sync_status.stderr_linesсодержимое, которое я ищу, если оно появится

мне кажется, что Самой Значимой Информации меньше всей строки и толькоERROR 1227и/илиAccess deniedпоскольку информация/сообщение являетсяERROR 1227 42000 Access denied.

Поэтому вы можете упростить свой случай, как показано в следующем примере.

      ---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    sync_status:
      stderr_lines:
        - 'line 1: Line 1'
        - 'ERROR 1227 (42000) at line 1: Access denied'
        - 'line 2: Line 2'

  tasks:

  # Show all STDERR lines joined into one line

  - name: Show vars
    debug:
      msg: "{{ sync_status.stderr_lines | join(' ') }}"

  # Looking for most significant information only

  - name: Can we proceed?
    debug:
      msg: "No!"
    when: "sync_status.stderr_lines | join(' ') is search('ERROR 1227|Access denied')"

в результате получается

      TASK [Show vars] *****************************************************************
ok: [localhost] =>
  msg: 'line 1: Line 1 ERROR 1227 (42000) at line 1: Access denied line 2: Line 2'

TASK [Can we proceed?] ***********************************************************
ok: [localhost] =>
  msg: No!

Как уже упоминалось в комментарии к β.εηοιτ.βε, вы также можете просто найти всю строку.

        - name: Can we proceed?
    debug:
      msg: "No!"
    when: "'ERROR 1227 (42000) at line 1: Access denied' in sync_status.stderr_lines"

Дальнейшие вопросы и ответы

Документация

Другие вопросы по тегам