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

How to use a class from a module immediately after installing it with Puppet?

我正在使用 Vagrant 试验 Puppet。我是 Puppet 的新手。

我正在使用建议的方法在我的 Puppet 清单中安装模块:Can I install puppet modules through puppet manifest?

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

我该如何解决?

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

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

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

如果您在 Vagrant 中使用 apply provisioner,那么您需要走另一条路。最简单的解决方案是在 Puppet 安装后使用 shell provisioner 通过 module install 安装 Puppet 模块(除非你使用的是带有 Puppet 的 Vagrant box,在这种情况下你可能不会在上面安装 Puppet它)。或者,您可以与安装模块的主机共享一个目录,或者将 librarian-puppetr10k gem 安装到 Vagrant box 上,然后使用它们安装到适当的路径中。我可以根据要求详细介绍这些内容。