在我的木偶戏中,我想使用dirtree
函数,如
#don't know which syntax is right, but seems like both of them have no effect
include AlexCline/dirtree
include AlexCline_dirtree
class sw_mage_deploy {
$deploy_folder = '/var/www/html'
file { dirtree($deploy_folder):
ensure => directory,
owner => 'root',
group => 'root',
mode => 755,
}
}
在我的Modulefile中我有
dependency 'AlexCline/dirtree', '>= 0.2.1'
但是我收到了错误:
==> default: Error: Unknown function dirtree at /tmp/vagrant-puppet/modules-bcfd
1f8b7eed950360c8143b9e421347/sw_mage_deploy/manifests/init.pp:15 on node vagrant
-vm
试过this文章,但似乎无关紧要。因为它涵盖了类包含,我需要方法包含。
作为一个附带问题,我非常感谢非常初学者的木偶教程链接,因为谷歌搜索并没有真正帮助,所有文档似乎都承认了一些我似乎错过的明显知识。
答案 0 :(得分:2)
注意我当然不是一个傀儡大师,已经学习了几个月,因此无法真正解决教程,也可能没有使用最佳实践。
问题的第一部分:如何在Puppet中处理依赖关系
我知道两种方式:
使用http://librarian-puppet.com(我实际上并没有使用它,所以我可能需要更正),它将管理Modulefile中的依赖项,有点像你似乎描述的那样。将它与Vagrant一起使用,你需要安装和配置它(使用shell脚本) - a plugin存在管理这个部分,所以这肯定是一个很好的选择
目前,我通过正常的`puppet module install'来管理依赖关系。在shell脚本中。从Vagrant运行一个shell脚本,它将安装所有模块,puppet负责处理从单个模块声明的所有模块依赖项(如果有的话)。这种脚本的一个例子是
#!/bin/bash
mkdir -p /etc/puppet/modules;
if [ ! -d /etc/puppet/modules/example42-perl ]; then
puppet module install example42-perl --version 2.0.20
fi
if [ ! -d /etc/puppet/modules/puppetlabs-apache ]; then
puppet module install puppetlabs-apache --version 1.5.0
fi
if [ ! -d /etc/puppet/modules/puppetlabs-java ]; then
puppet module install puppetlabs-java --version 1.4.1
fi
关于问题的第二部分:使用更脏的功能
的问题puppet module install AlexCline-dirtree
(如果您的主机上没有木偶,请使用您的VM并将/home/vagrant/.puppet/modules复制到您的共享文件夹/ vagrant / modules) 在Vagrantfile
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "base.pp"
puppet.module_path = "puppet/modules"
puppet.options = "--verbose --trace"
end
并确保您已使用已安装的模块创建了puppet/manifests/base.pp
文件和puppet/modules
目录
定义你的木偶文件
class sw_mage_deploy {
$deploy_folder = "/var/www/html"
$dirtree = dirtree($deploy_folder)
# file { ["$dirtree"] :
# ensure => directory,
# owner => "root",
# group => "root",
# mode => 755;
# }
ensure_resource('file', $dirtree, {
'ensure' => 'directory',
owner => "root",
group => "root",
mode => 755
})
}
include sw_mage_deploy
当$dirtree
返回一个数组时,你不能直接在你的文件块中使用它(它会尝试将你的数组中的所有值连接成一个值)但是使用可以应用它的ensure_resource function对于资源数组
确实,如果您不应用变量,则以下工作
file { [ '/var/www',
'/var/www/html',]:
ensure => directory,
...
可能有办法绑定要像这样使用的变量(这是一个数组),但我不知道如何。
答案 1 :(得分:1)
include()
函数没有按照您的想法执行。它用于使Puppet 类包含在目标节点的目录中。它与清单中的自定义函数的可用性无关,尽管这些函数是在Puppet模块中分发的。
此外,对于它的价值,你所呈现的表格中的看起来都不应该起作用。 Puppet也不应该接受,因为具有任何指定名称的类是否可以包括在内是值得怀疑的。
您的清单中不需要任何特殊代码即可使用自定义功能。你只需要打电话。但是,该函数必须首先安装到Puppet中,这与安装它所在的模块是一个单独的步骤(或者无论如何它都在某些版本的Puppet中)。对于在模块中分发的函数,这通常通过pluginsync来完成,但这取决于在puppetmaster服务器上运行Puppet代理。您可能需要在之后重新启动主服务器。