我想编写一个puppet清单来在目标服务器上安装和configuration应用程序。
这个清单的一部分应该是可重用的。 因此我使用define来定义我的可重用function。 这样做,我一直存在这样的问题,即定义的一部分不可重用。
一个简单的例子是一堆要创build的configuration文件。 这些文件必须放在同一个目录下。 这个目录只能被创build一次。
例:
nodes.pp
node 'myNode.in.a.domain' { mymodule::addconfig {'configfile1.xml': param => 'somevalue', } mymodule::addconfig {'configfile2.xml': param => 'someothervalue', } }
mymodule.pp
define mymodule::addconfig ($param) { $config_dir = "/the/directory/" #ensure that directory exits: file { $config_dir: ensure => directory, } #create the configuration file: file { $name: path => "${config_dir}/${name}" content => template('a_template.erb'), require => File[$config_dir], } }
这个例子会失败 ,因为现在资源file {$config_dir:被定义了两次。
据我所知,需要将这些部分提取成一个class 。 然后它看起来像这样:
nodes.pp
node 'myNode.in.a.domain' { class { 'mymodule::createConfigurationDirectory': } mymodule::addconfig {'configfile1.xml': param => 'somevalue', require => Class ['mymodule::createConfigurationDirectory'], } mymodule::addconfig {'configfile2.xml': param => 'someothervalue', require => Class ['mymodule::createConfigurationDirectory'], } }
但是这使得我的界面很难使用。 我的模块的每个用户必须知道,有一个额外的需要的类。 对于这个简单的用例,额外的类可能是可以接受的。 但随着模块复杂性的增加(很多定义),我有点害怕混淆模块用户。
所以我想知道是否有更好的方法来处理这种依赖关系。 理想情况下,像createConfigurationDirectory这样的类对模块api的用户是隐藏的。
还是有其他一些“最佳实践”/模式处理这种依赖?
将所有function分解成模块中的单独文件 ,每个文件包含一个类或定义的types。 使用资源 sorting以正确的顺序pipe理资源。
在你的节点定义中:
class {'mymodule': conffile => 'file_name', }
在您的模块清单目录中:
init.pp:
# This class does basic setup, # and optionally allows you to define a config file class mymodule ( $conffile = undef ) { include mymodule::confdir if $conffile { mymodule::conffile { $conffile: } } }
params.pp:
# This class defines variables class mymodule::params { $confdir = '/path/to/dir' }
confdir.pp:
# This class creates a conf dir class mymodule::confdir { include mymodule::params file { $mymodule::params::confdir: ensure = directory, } }
conffile.pp:
# This define creates a config file define mymodule::conffile($file=$title) { include mymodule::params file { "${mymodule::params::confdir}/${file}": ensure => present, require => Class['mymodule::confdir'], } }
如果你可以从定义中取出config目录,最好。 这是一个例子
class def($config_dir) { file { $config_dir: ensure => directory } } define def::template($file_location) { file { $file_location: path => "${def::config_dir}/${file_location}", content => 'hi', require => Class['def'], } } if $fqdn == 'my_host' { class { 'def': config_dir => '/tmp/d1' } def::template { 'f1.txt': file_location => "f1.txt" } def::template { 'f2.txt': file_location => "f2.txt" } } ls /tmp/d1/ f1.txt f2.txt