it-swarm.com.ru

Как избежать двойных и одинарных кавычек в YAML в пределах одной строки

Мне нужно правильно экранировать одинарные и двойные кавычки в ANSIBLE playbook, чтобы установить переменную окружения. Ничего из этого не работает:

  - name: Set environment variable
    command: >
      export EXTRA_CONFIG=“'”{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}“'”

  - name: Set environment variable
    command: >
      export EXTRA_CONFIG=''{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}''

  - name: Set environment variable
    command: >
      export EXTRA_CONFIG=''{\"client\": {\"subscriptions\": [\"DIND-Worker\"], \"cluster\": \"internal\"}}''

Посмотрел на это: 

http://yaml.org/spec/current.html#id2532720

https://github.com/dotmaster/toYaml/issues/1

Я получаю сообщение об ошибке:

fatal: [ip.address]: FAILED! => {"changed": false, "cmd": "export 'EXTRA_CONFIG={\"client\":' '{\"subscriptions\":' '[\"DIND-Worker\"],' '\"cluster\":' '\"internal\"}}'", "failed": true, "msg": "[Errno 2] No such file or directory", "rc": 2}
12
user3081519

> запускает скаляр блока, в котором вам вообще ничего не нужно экранировать (и обработанные последовательности не обрабатываются). Итак, если вы хотите, чтобы в вашем JSON-подобном значении были одинарные кавычки, просто сделайте:

  - name: Set environment variable
    command: >
      export EXTRA_CONFIG='{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}'

Правка: Также имейте в виду, что сложенный скаляр по умолчанию включает в себя завершающий символ новой строки. Если вы не хотите иметь это, просто используйте >- вместо >.

15
flyx

Вы используете сложенные скаляры стиля (представленные >) и в соответствии со спецификацией YAML 1.2 вы не можете экранировать символы:

Сложенные скаляры:

Сложенный стиль обозначается индикатором «>». Это похоже на буквальный стиль; однако сложенные скаляры могут быть сложены по линии. 

И соответствующий текст не будет в буквальных скалярных стилях.

Внутри литеральных скаляров все (с отступом) символы считаются содержимым, включая символы пробела. Обратите внимание, что все символы разрыва строки нормализованы. Кроме того, пустые строки не свернуты, хотя окончательные разрывы строк и конечные пустые строки разбиты. 

Из вашего примера неясно, что вы действительно хотите сделать. Вероятно, вам следует отказаться от стиля сворачивания в пользу стиля с двойными кавычками:

Стиль в двойных кавычках определяется окружающими индикаторами «». Это единственный стиль, способный выражать произвольные строки с помощью escape-последовательностей «\». Это происходит за счет необходимости экранировать символы «\» и «» ». персонажи. 

или один цитируемый стиль:

Стиль в одинарных кавычках определяется окружающими символами «». Поэтому в скаляре с одинарными кавычками такие символы необходимо повторять. Это единственная форма экранирования, выполняемая в скалярах с одинарными кавычками. В частности, символы «\» и «» »могут использоваться произвольно. Это ограничивает скаляры в одинарных кавычках печатными символами. Кроме того, можно разбить только длинную строку в одинарных кавычках, где символ пробела окружен не -пространствами.

Поэтому вы должны сначала решить, каким должен быть вывод, а затем, если вам нужно экранировать символы с обратной косой чертой. Если вы этого не сделаете, вы можете просто использовать свернутый стиль без экранирования или стиль с одинарными кавычками, экранируя ', или стиль с двойными кавычками, экранируя " и любой \. Если вам нужен \, то экранирование двойных кавычек - ваш единственный выбор.

3
Anthon

Я не думаю, что это как-то связано с побегом. Из документов для command :

Командный модуль принимает имя команды, за которым следует список разделенных пробелами аргументов. Данная команда будет выполнена на всех выбранных узлах. Он не будет обрабатываться через оболочку, поэтому такие переменные, как $HOME, и такие операции, как "<", ">", "|" и "&", работать не будут (используйте модуль Shell , если вам нужны эти функции).

Команда, которую вы пытаетесь запустить, export, не является исполняемой; это встроенная оболочка. Имеет смысл, что если Ansible не запускает команду через оболочку, встроенные в нее недоступны, то есть «Нет такого файла или каталога».

Как говорят в документации, вы можете использовать Shell вместо command, но я не уверен, что это решение, потому что Ansible, вероятно, не запускает последующие команды в той же оболочке, поэтому любые переменные среды, которые вы установили ранее, будут отсутствовать. Посмотрите ответы на этот вопрос для некоторых опций, которые с большей вероятностью будут работать: Как установить переменные среды Linux с ansible

0
Jordan Running