上一节中的模块其实只是同步了一个文件而已,那么要想同步一个目录如何做?我们可以通过实现同步一个目录来做一个包发布系统。 比如在一台机器上编译安装好了apache,那么就可以通过这样的模块把这个apache目录整个分发到其他机器上。

vim /etc/puppet/modules/testm/manifests/init.pp  #编辑配置文件

模块配置文件如下:

class testm{

file {"/tmp/2.txt":    #送往客户端的文件名,属性和内容来源

owner => "root",

group => "root",

mode => 0400,

source => "puppet://$puppetserver/modules/testm/1.txt"

}

}

#新定义的类

class apache{

file {"/usr/local/apache2":   #同步到客户端后的文件路径

owner => "root",

group => "root",

source => "puppet://$puppetserver/modules/testm/apache2",

recurse => true,

purge => true

}}

其中recurse=>true 这个参数很关键,它表示递归的意思,没有这个不能同步目录。purge参数可以保证当服务端删除或修改某个文件,客户端可以跟着删除或修改。


然后在testm目录下,创建apache2目录。在这个目录下,创建conf、bin、logs三个目录。然后创建3个文件touch logs/1.log  touch bin/apachectl   touch conf/httpd.conf


最后编辑puppet主配置文件,加入新的类

vim  /etc/puppet/manifests/site.pp   //内容如下

$puppetserver = 'master.wyp.com'   #定义模块配置文件中的变量

node 'client.wyp.com'{

    include testm

    include apache

}


配置完成后,在客户端执行命令:

puppet agent --test  --server=master.wyp.com   //如果客户端上启动了puppet服务,不用执行这命令,它也会自动同步的


课后答疑:

问:source => "puppet://$puppetserver/modules/testm/apache2",实际文件在testm/files目录下,而配置文件中直接在testm目录下

答:这个就是省略掉files目录的,它的特性。

问:类名至少要有一个与模块名一致吗?实验的时候,不一致就报错:

答:必须要一致。