手动应用傀儡类

Jef*_*rey 4 windows puppet

我正在测试一个 puppet init.pp 文件(在 Windows 上),它看起来像:

class myclass {    
 package { 'java':
    ensure => installed,
    provider => 'msi',
    source => 'S:\puppet-repo\jdk1.6.0_31.msi',
    install_options => { 'INSTALLDIR' => 'C:\tools\java' },
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我的 site.pp 文件看起来像:

node default {
  include myclass
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个只调用 myclass 模块的 tests/init.pp 文件:

class { 'myclass': }
Run Code Online (Sandbox Code Playgroud)

我可以运行 tests/init.pp 文件,它确实正确安装了 java。我想知道是否有一种方法可以从命令行运行 myclass 模块而无需创建单独的 tests/init.pp 文件。或者,也许我可以将packagemyclass 中的语句移动到它自己的 .pp 文件中,并将其包含在 init.pp 中,然后如果我愿意,我可以运行该单独的 .pp 文件。什么是更正确的方法来做到这一点?

Kyl*_*ith 6

首先,如果您还不知道验证语法的技巧:

puppet parser validate my_file.pp
Run Code Online (Sandbox Code Playgroud)

现在,您如何对新类进行现场测试会因您的部署而异,但我可以告诉您我是如何做的,也许这对您的情况有意义。或者也许 ServerFault 上的每个人都会告诉我我错了。

在任何给定的环境中,我都有一组使用继承的节点声明:

node base_production_environment {
  include ssh
  include ntp
  include whatever_else
}

node /prod-app\d+\.mycompany\.com/ inherits base_production_environment { }
Run Code Online (Sandbox Code Playgroud)

现在,当我编写一个新类时,我想在推出之前先在特定系统上测试它,所以我添加了一个更具体的(通过主机名)节点声明,以便它会覆盖不太具体的(通过正则表达式)声明,像这样:

node 'prod-app7.mycompany.com' inherits base_production_environment {
  include my_new_class
}
Run Code Online (Sandbox Code Playgroud)

我简化了很多,以突出使用特定的节点声明来抽查新类。我们还使用环境将更改推出到不太重要的环境,然后再将它们推出到生产环境等。


所以我只是重新阅读了您的问题,我突然想到您可能正在使用推送模块目录方法,而不是使用 puppetmaster。如果这是真的,您可以包含一个用于测试目的的类,例如:

puppet apply --modulepath=C:\puppet-modules\ -e "include my_class"
Run Code Online (Sandbox Code Playgroud)

不过,我不知道这是否是 Windows 下 puppet 的正确目录语法。