我正在使用Vagrant试验Puppet。我是Puppet的新手。
我正在使用Can I install puppet modules through puppet manifest?
中建议的方法在我的Puppet清单中安装模块我的default.pp包含类似的内容:
$dsesterojava = 'dsestero-java'
exec { 'dsestero-java':
command => "puppet module install ${dsesterojava}",
unless => "puppet module list | grep ${dsesterojava}",
path => ['/usr/bin', '/bin']
}
include java::java_7
我正在尝试导入模块,然后立即使用其中定义的类。
目前,我得到:
Error: Could not find class java::java_7
如果我注释掉包含行并重新运行它。该模块安装。如果我随后删除了评论并再次运行配置,那么它就可以了。
这里有某种“鸡肉和鸡蛋”的情况。我可以在安装它的同一个Puppet清单中使用模块吗?
我该如何解决?
答案 0 :(得分:3)
不,你不能这样做。编译目录时,Puppet将在适当的目录中搜索所有必需的代码和数据。由于java
模块在目录应用程序之前不存在,因此根据它编译目录(在应用程序之前发生)将失败。你绝对是在处理“鸡蛋和鸡蛋”的情况。我强烈建议不要使用Puppet代码来安装Puppet代码。
或者,建议的安装和管理Puppet模块的方法是使用以下解决方案之一:
如果您使用agent
配置程序并将Vagrant实例订阅到Puppet Master,这些也将在Vagrant中为您解决问题。
如果您在Vagrant中使用apply
配置器,那么您将需要采用不同的路线。最简单的解决方案是在安装Puppet之后使用shell
配置程序通过module install
安装Puppet模块(除非你使用的是带有Puppet的Vagrant盒子,在这种情况下你可能没有安装Puppet)它)。或者,您可以与安装模块的主机共享目录,或者将librarian-puppet
或r10k
gems安装到Vagrant框中,然后使用它们安装到相应的路径中。我可以根据要求详细介绍这些内容。