Использование тильды в отчетливых операторах «когда» для построения имен файлов из переменных - PullRequest
0 голосов
/ 04 апреля 2019

Поведение ~ в ансибильных операторах «когда» вызывает недоумение.Например, если LIB является фактом, установленным set_fact со значением «lib64», я бы ожидал, что следующее утверждение будет истинным, если существует / usr / lib64 / cernlib / 2006, и ложным в противном случае:

  when: '"/usr/" ~ LIB ~ "/cernlib/2006" is exists'

Однако я обнаружил, что условное выражение всегда истинно.

Условное поведение работает так, как ожидалось, если я опущу ссылку на LIB и просто напишу:

  when: '"/usr/lib64/cernlib/2006" is exists'

Я могу легкопредставьте себе опечатку, которая заставит «когда» дать мне «ложный» результат, но я озадачен тем фактом, что это всегда дает мне «истину».

Я просто что-то делаю не так?

1 Ответ

0 голосов
/ 05 апреля 2019

Синтаксис теста говорит:

Синтаксис для использования теста дзиндзя следующий:

переменная test_name

- set_fact:
    my_path: "/scratch/{{ LIB }}/cernlib/2006"
- debug:
    msg: "{{ mypath }} exists"
  when: my_path is exists

1) Использование строки вместо переменной приводит к ошибке.

- debug:
    msg: "/scratch/test-83.yml exists"
  when: /scratch/test-83.yml is exists

показывает:

fatal: [localhost]: FAILED!=> {"msg": "Ошибка условной проверки" /scratch/test-83.yml есть ". Ошибка: ошибка шаблона при шаблонной строке: неожиданная" /'.

2) Цитирование строки не помогает

- debug:
    msg: "/scratch/test-83.yml exists"
  when: "/scratch/test-83.yml" is exists

показывает:

ERROR! Syntax Error while loading YAML.
  did not find expected key
...
The offending line appears to be:

    msg: "/scratch/test-83.yml exists"
  when: "/scratch/test-83.yml" is exists
                               ^ 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"

3) Только эта конкретная комбинация одинарных и двойныхцитата работает

- debug:
    msg: "/scratch/test-83.yml exists"
  when: "'/scratch/test-83.yml' is exists"

Протестировано с

> ansible --version
ansible 2.7.9
python version = 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0]
...