Назад | Перейти на главную страницу

Преобразовать \ n в новую строку, хотя входная переменная заключена в одинарные кавычки в Puppet

Если переменная заключена в двойные кавычки и содержит \n

$test="hello\nworld"

file { '/tmp/hello':
        content => $test
}

затем создается новая строка:

/tmp/hello
hello
world

Проблема

Что делать, если ввод не заключен в двойные кавычки из-за ввода hiera или результата regsubst:

$test2=hiera("hiera::input")

file { '/tmp/hello':
        content => $test2
}

приводит к:

hello\nworld

Попытка решить проблему

Предполагалось, что двойное цитирование переменной содержимого решит проблему. Ни то, ни другое:

file { '/tmp/hello':
        content => "$test2"
}

ни:

file { '/tmp/hello':
        content => "\"$test2\""
}

решает вопрос. Последнее приводит к:

"hello\nworld"

Вторая попытка

После прочтения была предпринята еще одна попытка этот ответ на StackOverflow.

hiera.yaml

---
bla: haha\nblabla

файл манифеста

$test=hiera('bla')

$quoted = regsubst($test, '(.*)', '"\1"')

file { '/tmp/hello':
        content => $quoted
}

приводит к:

"haha\nblabla"

Мы используем бэкэнд YAML от Hiera, но я уверен, что то же самое возможно для JSON и других.

Вы можете просто отформатировать строку в YAML так, как хотите, и Puppet с радостью ее примет.

Например:

---
hiera::input: |
  my string
  with newlines
  preserved

Обратите внимание на | после hiera::input ключевое имя. Он сообщает синтаксическому анализатору YAML, что следующее значение следует рассматривать как блок, сохраняя символы новой строки и любые другие отступы.

См. Разделы 2.3 и 8.1.2 спецификации YAML для получения подробной информации.