2017-01-11 5 views
2

Я создаю конфигурационный файл Puppet для службы. Я хотел бы добавить имя хоста в качестве переменной в строке. Однако он получил ошибку из-за вложенных кавычек (") в строке.Interpolate и concatenate Переменная Puppet внутри вложенных строковых котировок

$hostlocal = "${hostname}" 

file {'puppet_facts_example': 
    ensure => file, 
    path => '/tmp/test.txt', 
    content => "modparam("topology_hiding", "th_callid_prefix", "$hostlocal_")" 
} 

Если я просто напечатать $hostlocal, она показывает имя хоста правильно. Можно ли использовать переменную Puppet внутри вложенных строковых котировок (")?

Я также попытался использовать шаблон. В шаблоне

modparam("topology_hiding", "th_callid_prefix", "<$= @hostlocal %>_")" 

Но результат не было никакого значения.

modparam("topology_hiding", "th_callid_prefix", "_")" 

ответ

0

Основная проблема здесь заключается в том, что вам нужно, чтобы избежать вложенных строк кавычки, когда вы делаете интерполяцию строки/экранировать кавычки стиля ("). Кроме того, вы пытаетесь объединить _ на $hostlocal, но Puppet интерпретирует это как переменную $hostlocal_, поэтому вам нужны фигурные скобки, чтобы установить конкатенацию. Вы можете исправить свою проблему:

$hostlocal = "${hostname}" 

file {'puppet_facts_example': 
    ensure => file, 
    path => '/tmp/test.txt', 
    content => "modparam(\"topology_hiding\", \"th_callid_prefix\", \"${hostlocal}_\")" 
} 

Однако мы можем улучшить это дальше. Первые две вещи, которые мы можем сделать здесь, - это удалить котировки вокруг , поскольку он не интерполируется. То же самое относится к topology_hiding и th_callid_prefix, за исключением того, что мы должны изменить их на одиночные строковые кавычки, поскольку ничто не интерполируется или не экранируется. Кроме того, если вы делаете поиск в стиле Facter 2 по фактам, тогда лучше всего установить этот факт как глобальную переменную с $::.

$hostlocal = $::hostname 

file {'puppet_facts_example': 
    ensure => file, 
    path => '/tmp/test.txt', 
    content => "modparam('topology_hiding', 'th_callid_prefix', \"${hostlocal}_\")" 
} 

Наконец, следует отметить, что использование переменной $hostlocal избыточно с тем, чтобы он мог быть безопасно удален для ясности и эффективности. Это дает оптимальное решение ниже.

file {'puppet_facts_example': 
    ensure => file, 
    path => '/tmp/test.txt', 
    content => "modparam('topology_hiding', 'th_callid_prefix', \"${::hostname}_\")" 
} 
+0

Работает отлично! Спасибо за дополнительные предложения. – Mike

0

На мой взгляд, имя хоста - это переменная, поэтому вам не нужна двойная кавычка, потому что вы хотите получить значение переменной.

Попробуйте

$hostlocal = $hostname 
+0

Это хорошо работает с или без двойных кавычек. Проблема состоит в том, что часть содержимого содержит несколько двойных кавычек. Если я просто печатаю $ hostlocal, он показывает правильное имя хоста. – Mike

0

поскольку имя хоста является переменной-факсором. следует ссылаться как $ hostlocal = $ :: имя хоста

Благодаря vinodh