我似乎不明白如何在 Puppet 清单应用程序中将文件资源的内容更改为不同的点。我正在使用它流浪汉设置开发环境。
我想安装哦我的-zshell,它提供了.zshrc 文件的模板。oh-myzshell 有插件的概念,所以我选择我喜欢的插件,将它们添加到模板中并使其成为 puppet 清单的模板:
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
插件语句,也没有设置默认 ruby 的行。
对我来说,当安装不同的东西时,它们会更改文件以满足其要求,并且在安装过程的每个阶段,文件都处于可工作的状态,这是有道理的。类oh_my_zshell
不需要知道chruby
类或任何其他东西可能稍后安装。
我应该做些什么才能使它工作,还是我违背了使用 Puppet 的方式?我能看到的另一个方法是将文件的写入从类中取出并在主清单中完成它,等待所有变量都已填充。
我是 Puppet 的新手,因此非常感谢任何帮助或见解。
答案1
您不应为此使用虚拟资源(@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',
}