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"
Дальнейшие вопросы и ответы
Документация