引入模块,结构化代码,便于分享和管理。在管理大量服务器中,起到巨大的作用,模块文件会在site.pp都引用。

模块目录/etc/puppet/modules需要手动创建,modules目录下就是每个模块的目录

[root@master modules]# pwd

/etc/puppet/modules

[root@master modules]# ls

nginx  test


一个模块目录结构,通常包括以下目录:

[root@server modules]# ls

files  manifests  templates


manifests里面必须要包括一个模块初始文件init.pp,导入一个模块的时候,会从init.pp开始执行。可以把所有的代码都写在init.pp里面,也可以分成多个pp文件,init再去包含其他文件。

files模块的文件发布目录。

templates目录包含erb模型文件,这个和file资源的template属性有关。


简单的模块

a.建立目录结构

[root@server ~]# mkdir -p /etc/puppet/modules/test/{manifests,files,templates}


b.建立init.pp文件

cd /etc/puppet/modules/test/

[root@server test]# vim manifests/init.pp

class test::test1 {

file { "/tmp/0802.txt":

        content => "0802\n",

       ensure => present,

       owner => "root",

       group => "root",

       mode => 644,

       }

}

###此处在test模块内定义了一个test1类


d.在/etc/puppet/manifests中配置site.pp

[root@server manifests]# vim site.pp

node "default" {

       include test::test1

}

或者

##当然了,也可以这样,在site.pp里添加 import “nodes.pp”,然后在nodes.pp里添加

node "default" {

       include test::test1

}

同时模块下的init.pp里内容也应该不变,class test::test1,而不能为class test

更建议这样操作


【客户端测试】

puppet 模块管理_puppet模块


【多个模块】


[root@master modules]# ls

nginx  test


[root@master manifests]# cat /etc/puppet/modules/nginx/manifests/init.pp

class nginx::test {

file { "/tmp/nginx.txt":

        content => "nginx \n",

       ensure => present,

       owner => "root",

       group => "root",

       mode => 644,

       }

}

接着修改服务器上的site.pp和nodes.pp,此时在修改下test模块内容,客户端同步的时候,看看会不会2个模块同时同步

puppet 模块管理_puppet模块_02


【客户端测试】

puppet 模块管理_puppet模块_03


【同步某个模块】

让客户端只同步某一个模块,而不是服务端的所有模块

修改/etc/puppet/manifests/nodes.pp

node default {

       include nginx::ssh

}

只写一行,那么客户端只会去同步nginx下的ssh类了



【不同主机同步不同内容】

[root@master manifests]# pwd

/etc/puppet/manifests


[root@master manifests]# ls

69.pp  9.pp  site.pp


[root@master manifests]# cat site.pp

import "9.pp"

import "69.pp"


[root@master manifests]# ls /etc/puppet/files

11.sh  1.sh  2.sh  3.sh  4.sh  sysctl.conf


[root@master manifests]# cat 69.pp

node slave69 {

       file {"/home/1.sh":

               source=>"puppet:///share/1.sh",

               mode=>755,

}


其中node 后的slave69为其中一台客户端的主机名字,这个pp就是相当于只更新slave69这台机器,其余的客户端都不更新



[root@master manifests]# cat 9.pp

node slave9 {

       file {"/home/1.sh":

               source=>"puppet:///share/1.sh",

               mode=>755,

}

如果node后面跟的不是客户端的主机名,则会报错

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find default node or by name with

说找不到节点