我在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::params和version参数/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.pp和nodes/test1.pp 。 它从来没有看到nodes/test2.pp 。
解决这个问题的方法之一就是在将新文件添加到nodes目录后, touch site.pp 这将导致木偶大师重新读取site.pp ,这将导致它重新处理import语句,然后将看到新的文件。
然而,从长远来看,你最好遵循Shane的build议,从你的代码中分离出你的数据。 如果你可以把你的定义结构化,不需要import声明,你会更好。 它仍然有它的用途,但是从很多方面来说, import是旧的Puppet做法不再相关的遗留物。