如何在使用Puppet安装模块后立即使用模块中的类?

时间:2017-11-22 11:30:40

标签: vagrant puppet vagrantfile

我正在使用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清单中使用模块吗?

我该如何解决?

1 个答案:

答案 0 :(得分:3)

不,你不能这样做。编译目录时,Puppet将在适当的目录中搜索所有必需的代码和数据。由于java模块在​​目录应用程序之前不存在,因此根据它编译目录(在应用程序之前发生)将失败。你绝对是在处理“鸡蛋和鸡蛋”的情况。我强烈建议不要使用Puppet代码来安装Puppet代码。

或者,建议的安装和管理Puppet模块的方法是使用以下解决方案之一:

如果您使用agent配置程序并将Vagrant实例订阅到Puppet Master,这些也将在Vagrant中为您解决问题。

如果您在Vagrant中使用apply配置器,那么您将需要采用不同的路线。最简单的解决方案是在安装Puppet之后使用shell配置程序通过module install安装Puppet模块(除非你使用的是带有Puppet的Vagrant盒子,在这种情况下你可能没有安装Puppet)它)。或者,您可以与安装模块的主机共享目录,或者将librarian-puppetr10k gems安装到Vagrant框中,然后使用它们安装到相应的路径中。我可以根据要求详细介绍这些内容。