Проблема заключается в цитировании логических выражений внутри скобок. Эти выражения не оцениваются, а принимаются как строки. Непустая строка оценивается как True . По этой причине условие всегда True .
when: ("'vcs' in inventory_hostname_short") or
("'vhs' in inventory_hostname_short")
Решение простое. Удалить цитату. Например, задача
- debug:
var: inventory_hostname_short
when: ('vcs' in inventory_hostname_short) or
('vhs' in inventory_hostname_short)
и инвентарь
shell> cat hosts
vcs-200-01
vhs-200-01
vxs-200-01
дают
ok: [vcs-200-01] =>
inventory_hostname_short: vcs-200-01
ok: [vhs-200-01] =>
inventory_hostname_short: vhs-200-01
skipping: [vxs-200-01]
Причиной этой ошибки может быть синтаксический анализатор YAML, запрашивающий цитата. Например,
when: 'vcs' in inventory_hostname_short
ERROR! Syntax Error while loading YAML.
did not find expected key
The error appears to be in '/export/scratch/tmp/test-42.yml': line 10, column 19, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
msg: vcs
when: 'vcs' in inventory_hostname_short
^ here
This one looks easy to fix. It seems that there is a value started
with a quote, and the YAML parser is expecting to see the line ended
with the same kind of quote. For instance:
when: "ok" in result.stdout
Could be written as:
when: '"ok" in result.stdout'
Or equivalently:
when: "'ok' in result.stdout"
Рекомендуемая цитата устраняет проблему
when: "'vcs' in inventory_hostname_short" # OK
, так же как и закрытие в круглых скобках
when: ('vcs' in inventory_hostname_short) # OK
, но не обе скобки и цитата
when: ("'vcs' in inventory_hostname_short") # WRONG
Выражение или
when: 'vcs' in inventory_hostname_short or
'vhs' in inventory_hostname_short
приведет к аналогичной ошибке и той же рекомендации
The offending line appears to be:
var: inventory_hostname_short
when: 'vcs' in inventory_hostname_short or
^ here
Could be written as:
when: '"ok" in result.stdout'
Or equivalently:
when: "'ok' in result.stdout"
Но здесь рекомендуемое решение не будет работать и приведет к той же ошибке и той же рекомендации
when: "'vcs' in inventory_hostname_short" or
"'vhs' in inventory_hostname_short"
Логические выражения в или должны быть заключены в круглые скобки
when: ('vcs' in inventory_hostname_short) or
('vhs' in inventory_hostname_short)
Тогда условие может быть дополнительно указано
when: "('vcs' in inventory_hostname_short) or
('vhs' in inventory_hostname_short)"