Строки в одинарных кавычках не подлежат переменной интерполяции. Вместо этого используйте строки в двойных кавычках, если вы хотите интерполяцию, например:
exec { "generate ${name}":
command => "postmap ${name}",
path => $::path,
subscribe => File[$name],
refreshonly => true
}
Это также предполагает, что переменная $::path
действительно содержит путь, подходящий для поиска исполняемого файла postmap
. Это возможно, но я склонен сомневаться, что это действительно так. Существует ли такая неопределенность относительно того, где установлен этот исполняемый файл (и где установлены внешние программы, которые он выполняет), что вы не можете указать буквальный путь, которого будет достаточно?
Кроме того, существуют отдельные проблемы с file
представленное объявление:
file {"${name}":
ensure => $ensure,
require => [File[$name], Exec["generate ${name}"]], }
объявленный ресурс File
выражает зависимость от самого себя. Это создает зависимость l oop, которая приведет к сбою построения каталога.
объявленный ресурс File
выражает зависимость от Exec["generate ${name}"]
, причем этот ресурс также выражает зависимость от него (subscribe
имеет это среди своих эффектов). Это составляет еще одну отдельную зависимость l oop, которая приведет к сбою построения каталога. Между этим и предыдущим вы, вероятно, просто хотите полностью удалить атрибут require
.
вы обеспечиваете состояние файла, указанное в переменной $ensure
. Хотя это по своей сути не является ошибкой, вы должны быть уверены, что эффекты являются правильными для всех случаев. В частности, если вы гарантируете, что файл absent
, то, вероятно, неправильно запускать Exec
, когда файл переходит в это состояние. Если возможно гарантировать, что файл будет directory
, то это, вероятно, также не будет хорошо воспроизводиться с эффектом Exec
.
Кроме того, вы не непосредственное управление содержимым файла, его владельцем или режимом. Это может быть хорошо, а может быть, даже и желательно, но я рекомендую подумать, возможно ли, чтобы Puppet полностью контролировал файл.