木偶:无法find默认节点或节点test2的名称

我在Ubuntu服务器上安装了Puppet 3.1.1。

我的清单文件夹看起来像这样:

├── nodes │  └── test1.pp └── site.pp 

site.pp的内容是:

 # site.pp import "nodes/*.pp" 

节点test1工作正常。

然后我创build了一个名为test2.pp的新文件。 内容与test1.pp相同,除了节点名称,我将它添加到节点文件夹中。

所以清单文件夹变成这样:

 ├── nodes │  ├── test1.pp │  └── test2.pp └── site.pp 

然后我运行puppet agent --test在节点test2上testing。

代理可以与puppet master交换SSL密钥,但是我收到了错误消息:

 Could not find default node or by name with test2 

如果我不创build一个新的test2.pp文件,只是将内容添加到test1.pp文件中,则不会显示任何错误。

所以我认为木偶大师开始后,Puppet不会dynamic地导入一个新的pp文件。

是可以定义个人pp文件中的节点,并dynamic地导入它们?

很高兴的任何build议。


两个pp文件的内容:

 node 'test1' { include tmp::params tmp::gtp { 'node1': name => 'node1', version => '6.0.0.0', ip => '168.1.193.97', port => '1255', } } node 'test2' { include tmp::params tmp::gtp { 'node2': name => 'node2', version => '6.0.0.0', ip => '168.1.193.98', port => '1255', } } 

我build议远离清单节点定义到Hiera。 您需要稍微调整一下,以避免直接从您的节点调用定义的types,但是看起来好像在目录中不会多次使用,所以转换为类应该可以正常工作。

所以像这样的hiera.yaml ..

 --- :backends: - yaml :hierarchy: - '%{::clientcert}' - 'os-%{::osfamily}' - common :yaml: :datadir: /etc/puppet/hieradata 

和一个site.pp只是:

 hiera_include(classes) 

您的节点将从/etc/puppet/hieradata YAML文件中读取。 举例来说,我们会说你想在每一个报告给Puppet的节点上都使用tmp::params ,但是也许你只想在某些节点上使用tmp::gtp 。 并且您想要集中定义version参数,但保留其他参数以设置每个节点。 所以我们把tmp::paramsversion参数/etc/puppet/hieradata/common.yaml

 classes: - tmp::params tmp::gtp::version: 6.0.0.0 

那么你将有一个文件的每个节点。

/etc/puppet/hieradata/test1.yaml

 classes: - tmp::gtp tmp::gtp::name : node1 tmp::gtp::ip : 168.1.193.97 tmp::gtp::port : 1255 

/etc/puppet/hieradata/test2.yaml

 classes: - tmp::gtp tmp::gtp::name : node2 tmp::gtp::ip : 168.1.193.98 tmp::gtp::port : 1255 

是的,它会在没有服务重启的情况下,对Hiera文件进行更改。 看起来像你需要什么?

编辑 :要使用Hiera来设置一个定义types的多个实例,你会想要做这样的事情:

/etc/puppet/hieradata/test1.yaml

 classes: - gtpsetup gtp_instances: - node1_instance1 - node1_instance2 gtp_instanceconfig: node1_instance1: ip : 168.1.193.97 port : 1255 version : 5.3.2.1 node1_instance2: ip : 168.1.193.97 port : 1268 version : 6.0.0.0 

/etc/puppet/modules/gtpsetup/manifests/init.pp

 class gtpsetup { gtp_instances = hiera('gtp_instances') gtp_instanceconfig = hiera('gtp_instanceconfig') define gtp_instance { # this is using your existing defined type, but you can just move the stuff it's doing to here. tmp::gtp { $title: name => $title, version => gtp_instanceconfig[$title]['version'], ip => gtp_instanceconfig[$title]['ip'], port => gtp_instanceconfig[$title]['port'], } } gtp_instance { $gtp_instances: } } 

Shane给出了一个更好的方法来处理你的问题,但我想解决一个很好的答案,所以我想Puppet不会在puppet master启动后dynamic地导入一个新的pp文件。

这是真的。 当Puppet启动时,它读取所有的configuration文件,然后开始观察它们的变化。 当其中一个文件的内容被更新时,Puppet将重新读取文件。 Puppet还有一组标准的文件位置,当它需要的时候它将会查询文件,所以如果你添加一个新的类foo::bar到一个被监控的文件中的一个节点,它会查找一个名为foo/manifests/bar.pp的文件foo/manifests/bar.rb foo/manifests/bar.pp (或foo/manifests/bar.rb )在$modulepath ,即使在启动时不需要该文件。

重要的是, import指令只有在parsing文件时才被评估。 当puppet master启动时,它读取它的site.pp文件,看到了import语句,并且只find了nodes/test1.pp ,所以它监视的更改的唯一文件是site.ppnodes/test1.pp 。 它从来没有看到nodes/test2.pp

解决这个问题的方法之一就是在将新文​​件添加到nodes目录后, touch site.pp 这将导致木偶大师重新读取site.pp ,这将导致它重新处理import语句,然后将看到新的文件。

然而,从长远来看,你最好遵循Shane的build议,从你的代码中分离出你的数据。 如果你可以把你的定义结构化,不需要import声明,你会更好。 它仍然有它的用途,但是从很多方面来说, import是旧的Puppet做法不再相关的遗留物。