Я новичок в марионетке. Таким образом, я пытаюсь найти лучший способ настроить свои манифесты, которые имеют смысл. Следуя принципу DRY (не повторяйтесь), я пытаюсь загрузить общие директивы в один шаблон, а затем загрузить директивы, специфичные для среды, из файла, соответствующего среде. В основном так:
# nodes.pp
node base_dev {
$service_env = 'dev'
}
node 'service1.ownij.lan' inherits base_dev {
include global_env_specific
}
class global_env_specific {
include shell::bash
}
# modules/shell/bash.pp
class shell::bash inherits shell {
notify{"Service env: ${service_env}": }
file { '/etc/profile.d/custom_test.sh':
content => template('_global/prefix.erb', 'shell/bash/global.erb', 'shell/bash/$service_env.erb'),
mode => 644
}
}
Но каждый раз, когда я бегу puppet agent --test
марионетка жалуется, что не может найти shell/bash/$service_env.erb
файл, но я дважды проверил, что он существует. Я знаю, что переменная доступна из-за того, что оператор notify выводит ожидаемое значение, поэтому подозреваю, что делаю то, что недопустимо.
Я знаю, что мог бы иметь сингл template.erb
и передать переменные в шаблон, который будет работать в этом случае, потому что файл custom.sh небольшой и не так много изменений в разных средах, но для более сложных конфигураций (httpd, solr и т.д.) я бы предпочел получить доступ к файлам, специфичным для среды. Я также знаю, что могу указать пути к модулям для конкретной среды, но я бы предпочел просто обрабатывать такое поведение на уровне шаблона, вместо того, чтобы иметь несколько каталогов с близкими именами.
Спасибо.
Вы используете одинарные кавычки для 'shell/bash/$service_env.erb'
что означает, что нет переменные будут интерполированы. Вы должны использовать двойные кавычки.