Похоже, я не понимаю, как изменить содержимое файлового ресурса в разных точках применения манифестов Puppet. Я использую это с Бродяга для настройки среды разработки.
Я хочу установить о-о-о-шелл, который обеспечивает шаблон для файла .zshrc. oh-myzshell имеет концепцию плагинов, поэтому я выбираю, какие плагины мне нужны, добавляю их в шаблон и делаю его шаблоном для манифеста марионетки:
class oh_my_zshell {
include git
include zsh
$oh_my_zshell_dir = "${vagrant_home_dir}/.oh-my-zsh"
$plugins = "command-not-found common-aliases sudo"
$theme = "ys"
$zshrc = "${vagrant_home_dir}/.zshrc"
$backup = "${zshrc}.orig"
@file { "zshrc":
path => $zshrc,
ensure => file,
content => template("oh_my_zshell/zshrc.erb"),
}
realize( File["zshrc"],Package["zsh"] )
отрезать!
и в шаблоне:
# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
plugins=(<%= @plugins %>)
Это нормально работает.
Позже решаю, что хочу установить грубый. Для chruby существует плагин oh-my-zshell, поэтому я хочу повторно применить шаблон с новыми значениями для плагина:
class chruby {
include apt_update
include oh_my_zshell
include stdlib
$plugins = "${oh_my_zshell::plugins} chruby"
$theme = $oh_my_zshell::theme
отрезать!
realize(File["zshrc"])
file_line {"chruby set default ruby":
path => $oh_my_zshell::zshrc,
line => 'chruby ruby-2.1.2',
require => File["zshrc"],
}
Это, однако, не меняет файл вообще - нет chruby
в операторе plugins, и нет строки для установки ruby по умолчанию.
Для меня имеет смысл то, что по мере установки различных вещей они изменяют файл в соответствии с его требованиями, и что на каждом этапе процесса установки файл остается в рабочем состоянии. В oh_my_zshell
классу не нужно знать о chruby
класс или что-то еще, что может будет установлен позже.
Есть ли что-то, что мне нужно сделать, чтобы эта работа работала, или я работаю против того, как следует использовать Puppet? Альтернатива, которую я вижу, - это взять запись файла из классов и завершить его в основном манифесте, ожидая, пока все переменные не будут заполнены.
Я новичок в Puppet, поэтому буду благодарен за любую помощь или понимание.
Вы не должны использовать виртуальный ресурс (@file
и realize
) для этого. Переменные для шаблона будут из исходной области, в которой он определен (где @file
) есть, а не там, где это реализовано.
Вы хотите определить.
define thingy(
$path,
$plugins) {
file { '$path':
content => template("oh_my_zshell/zshrc.erb"),
}
}
И если вы хотите добавить строки, вы должны добавить необязательный параметр в определение и использовать его условно в шаблоне. Определение файла с содержимым или источником и последующая попытка редактировать содержимое этого файла на другом ресурсе не приведет к желаемому результату.
В качестве альтернативы, вместо этого может иметь смысл, чтобы oh_my_zshell был классом, который принимает параметры и передать переменную "additional_plugins" ...
# declare class with param
class oh_my_zshell($additional_plugins = '') {
# put it into the other variable or use in the template or whatever
}
# instead of the include/require
class { 'oh_my_zshell':
additional_plugins = 'chruby',
}