Я пытаюсь использовать ansible, чтобы проверить, что для вывода конкретной программы установлено определенное значение. Это значение включает двоеточие, за которым следует пробел, и это, кажется, регистрируется как синтаксическая ошибка, как бы я ее ни цитировал.
пример:
---
- hosts: all
tasks:
- raw: echo "something: else"
register: progOutput
- debug:
msg: "something else happened!"
when: progOutput.stdout_lines[-1] != "something: else"
Когда я запускаю это, я получаю ошибку при первой «сырой» команде:
ERROR! Syntax Error while loading YAML.
The error appears to have been in '<snip>/test.yml': line 4, column 27, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
tasks:
- raw: echo "something: else"
^ here
(естественно, в моем реальном варианте использования использовалась реальная программа, в выводе которой было двоеточие, а не «raw: echo». Тем не менее, это была ошибка, которую я видел.)
Ясно, что цитирование рассматриваемой строки не решает проблемы. Я также попытался избежать: с помощью обратной косой черты (\
).
Играя с цитированием, я наконец получил полезное сообщение об ошибке. Видимо, вы запутаете парсер YAML, если не процитировать всю строку.
Вот рабочий пример:
---
- hosts: localhost
tasks:
- raw: "echo 'something: else'"
register: progOutput
- debug:
msg: "something else happened!"
when: 'progOutput.stdout_lines[-1] != "something: else"'
И вот полезное сообщение об ошибке:
ERROR! Syntax Error while loading YAML.
The error appears to have been in '<snip>/test.yml': line 4, column 28, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
tasks:
- raw: "echo 'something\: else'"
^ here
This one looks easy to fix. There seems to be an extra unquoted colon in the line
and this is confusing the parser. It was only expecting to find one free
colon. The solution is just add some quotes around the colon, or quote the
entire line after the first colon.
For instance, if the original line was:
copy: src=file.txt dest=/path/filename:with_colon.txt
It can be written as:
copy: src=file.txt dest='/path/filename:with_colon.txt'
Or:
copy: 'src=file.txt dest=/path/filename:with_colon.txt'
Это задокументировано в документации Ansible о этот.
Вы можете избежать двоеточия вот так -
- raw: echo "something {{':'}} else"
и вывод этого типа -
changed: [localhost] => {
"changed": true,
"rc": 0,
"stderr": "",
"stdout": "something : else\n",
"stdout_lines": [
"something : else"
]
}