при условии в соответствии с именем хоста в задаче ansible конвейера azure DevOps - PullRequest
1 голос
/ 16 июня 2020

Имя хоста обычно выглядит как vcs-200-01. Поэтому, когда имя хоста имеет vcs или vhs, должна быть запущена задача. Я пробовал выполнить задачу ниже, но она работает на всех виртуальных машинах, а не на определенных c Vms

- name:Exceute shell script
  become:yes
  become_user:root
  become_method:sudo
  command: sh /usr/..../example.sh
  when:("'vcs' in inventory_hostname_short") or ("'vhs' in inventory_hostname_short")

1 Ответ

1 голос
/ 16 июня 2020

Проблема заключается в цитировании логических выражений внутри скобок. Эти выражения не оцениваются, а принимаются как строки. Непустая строка оценивается как 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)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...