一般狀況把manifest文件分解成易於理解得結構,例如類文件,配置文件分類存放,並經過某種機制整合使用,這種機制就是模塊,有助於結構化、層次化的方式使用puppet,puppet則基於模塊自動裝載器html
從另外一個角度來講,模塊實際就是按約定的預定定的結構存放了多個我呢見或子目錄,目錄裏的這些文件或子目錄必須遵循命令規範web
[root@web1 redis]# tree . ├── files │ ├── redis-master.conf │ └── redis-sentinel.conf ├── lib ├── manifests │ ├── init.pp │ ├── master.pp │ └── slave.pp ├── spec ├── templates │ └── redis-slave.conf.erb └── test
MODULE NAMEredis
manifests/:必須存在vim
init.pp 必須一個類定義,類名稱必須與模塊名稱相同app
files/:靜態文件運維
每一個文件的訪問路徑遵循:puppet:///modules/MODULE_NAME/FILE_NAME;工具
templatesoop
每一個文件的訪問路徑遵循:tempate('MOD_NAME/TEMPLATE_FILE_NAME');post
lib/:插件目錄,經常使用於存儲自定義的facts以及自定義類型;學習
spec/:相似於tests目錄,存儲lib/目錄下插件的使用幫助和範例;
tests/:當前模塊的使用幫助或使用範例;
cd /etc/puppet/modoules
mkdir -pv redis/{manifests,files,templates,tests,lib,spec}
父類文件
[root@web1 manifests]# pwd /etc/puppet/modules/redis/manifests [root@web1 manifests]# cat init.pp class redis { package{'redis': ensure => installed, } -> service{'redis': ensure => running, enable => true, hasrestart => true, hasstatus => true, require => Package['redis'], } } [root@web1 manifests]#
建立子類master.pp/slave.pp
[root@web1 manifests]# cat master.pp class redis::master inherits redis { file {'/etc/redis.conf': ensure => file, source => 'puppet:///modules/redis/redis-master.conf', owner => 'redis', group => 'root', mode => '0640', } Package['redis'] -> File['/etc/redis.conf'] ~> Service['redis'] } [root@web1 manifests]# cat slave.pp class redis::slave($master_ip,$master_port='6379') inherits redis { file {'/etc/redis.conf': ensure => file, content => template('redis/redis-slave.conf.erb'), owner => 'redis', group => 'root', mode => '0640', } Package['redis'] -> File['/etc/redis.conf'] ~> Service['redis'] } [root@web1 manifests]#
模板文件(模板文件就是redis.conf文件加個後綴名,裏面能夠寫一些erb變量)
erb方法請參考官方
cp redis-slave.conf.erb /etc/puppet/modules/redis/templates/redis-slave.conf.erb
這裏只修改了一行,redis主從的ip及端口
slaveof <%= @master_ip %> <%= @master_port %>
靜態文件
cp redis.conf /etc/puppet/modules/redis/files/redis-master.conf
這裏只註銷了
#bind 127.0.0.1
[root@web1 modules]# tree . └── redis ├── files │ ├── redis-master.conf │ └── redis-sentinel.conf ├── lib ├── manifests │ ├── init.pp │ ├── master.pp │ └── slave.pp ├── spec ├── templates │ └── redis-slave.conf.erb └── test
第一種,puppet apply -v --noop -e "class{'redis::slave': master_ip => '192.168.216.52'}" #多個參數使用逗號隔開
第二種 ,vim redis-test.pp
class {'redis::slave':
master_ip => '192.168.216.52' ,
}
puppet apply -e --noop redis-test.pp
參考學習:自動化運維工具——puppet詳解(二)