1? 概述
模板文件是在puppet模塊下面templates目錄中以”.erb”結尾的文件,puppet模板主要用于文件,例如各種服務的配置文件,相同的服務,不同的配置就可以考慮使用模板文件。
模塊是Puppet自包含的代碼和數據集合。絕大多數的清單都可以放到模塊中,唯一的例外是manifests下的主清單site.pp,包含站點級和節點級的代碼。
本文將結合例子介紹如何使用模板和模塊
2? 模板
2.1 概念介紹
puppet模板是采用erb模板語言,embedded ruby來創建
puppet兼容的erb語法鏈接:https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html
定義模板文件放置的路徑
file{'title': ensure?=>?file, path?????=>? content????=>?template('/PATH/TO/ERB_FILE'), }
#注意,content要根據template來處理
文本文件/PATH/TO/ERB_FILE中內嵌變量替換機制:這個格式要注意,如下:
<%=?@VARIABLE_NAME?%>
2.2 例子?
例1??配置nginx模板
準備nginx配置模板,修改nginx配置的work_processes為變量
vim??nginx.conf.erb worker_processes?<%=?@processorcount?%>;
定義類
vim?nginx.pp class?nginx?{package{'nginx':ensure?=>?latest;}?->file{'/etc/nginx/nginx.conf':ensure?=>?file,content?=>?template('/root/nginx.conf.erb'),}?~>service{'nginx':ensure?=>?running,}??? } include?nginx
執行腳本
puppet?apply?nginx.pp
例2??配置redis從節點
修改從的redis配置文件為模板文件,注意,用class來傳遞變量,調用類
vim?redis_slave.pp class?redis?{package{'redis':ensure?=>?latest,}???service{'redis':ensure?=>?running,enable?=>?true,hasrestart?=>?true,restart?=>?'service?redis?restart',require?=>?Package['redis'],}??? } class?redis::slave($masterip,$masterport='6379')?inherits?redis?{file{'/etc/redis.conf':ensure?=>?file,content?=>?template('/root/puppet/redis.module/redis-slave.conf.erb'),owner?=>?redis,group?=>?root,require?=>?Package['redis'],}???Service['redis']?{restart?=>?'systemctl?restart?redis.service',subscribe?=>?File['/etc/redis.conf'],}??? } class{'redis::slave':masterip?=>?'172.18.50.73'; }
修改配置文件為模板
vim?redis-slave.conf.erb slaveof?<%=?@masterip?%>?<%=?@masterport?%>
執行該腳本
puppet?apply?redis_slave.pp
3? 模塊
3.1? 概念介紹
模塊就是一個按約定的、預定義的層級結構存放了多個文件或子目錄的目錄,目錄里的這些文件或子目錄必須遵循一定格式的命名規范;?
puppet會在配置的路徑下查找所需要的模塊;
MODULES_NAME:
manifests/
init.pp
files/
templates/
lib/
spec/
tests/
模塊名只能以小寫字母開頭,可以包含小寫字母、數字和下劃線;但不能使用”main"和"settings“;
manifests/
init.pp:必須一個類定義,類名稱必須與模塊名稱相同;
files/:靜態文件;
puppet URL:
puppet:///modules/MODULE_NAME/FILE_NAME #這里不需要指定絕對路徑,因為路徑是固定的
templates/:
tempate('MOD_NAME/TEMPLATE_FILE_NAME')
lib/:插件目錄,常用于存儲自定義的facts以及自定義類型;
spec/:類似于tests目錄,存儲lib/目錄下插件的使用幫助和范例;
tests/:當前模塊的使用幫助或使用范例文件;
注意:
1、puppet 3.8及以后的版本中,資源清單文件的文件名要與文件子類名保持一致,例如某子類名為“base_class::child_class”,其文件名應該為child_class.pp;
2、無需在資源清單文件中使用import語句;
3、manifests目錄下可存在多個清單文件,每個清單文件包含一個類,其文件名同類名;
puppet config命令:
獲取或設定puppet配置參數;
puppet config print [argument]
puppet查找模塊文件的路徑:modulepath
puppet config print modulepath
set更改參數的值,以下命令更改后直接保存在配置文件里
例子
puppet config set server master.sunny.com
查看配置文件/etc/puppet/puppet.conf ,[main]段多了如下一行
server = master.sunny.com
模塊放置路徑:/etc/puppet/modules
要共享自己編寫的模塊,可以放到puppet? forge上,這個網站:https://forgeapi.puppetlabs.com是用來存放模塊
如在Puppet Forge中搜索redis模塊
????puppet module search redis
3.2? 例子??開發redis模塊
參加模塊相關目錄,注意路徑結構
mkdir -pv /etc/puppet/modules/redis/{manifests,files,templates,lib,spec,tests}
建議先在其他路徑下,如/root下創建一個modules模塊,等模板都編輯完成后在拷貝到/etc/puppet/modules下。
mkdir -pv /root/modules/redis/{manifests,files,templates,lib,spec,tests}
把靜態文件放到files里,模板文件(erb格式)放到templates里
cp /root/puppet/redis.module/redis-master.conf /root/modules/redis/files/
cp /root/puppet/redis.module/redis-slave.conf.erb /root/modules/redis/templates/
在manifests下定義和模塊名同名的類,在init.pp里,同時定義master.pp和slave.pp的子類,模塊方式注意文件的路徑的定義有簡化的
格式 和絕對路徑兩種,因為在模塊下,文件放置的路徑是固定的,所以,用相對路徑就可以查找到配置文件模板的路徑
source 定義模板的路徑
source?=>?'puppet:///modules/MOD_NAME/FILE_NAME',
例子
source?=>?'puppet:///modules/redis/redis-master.conf',
等價于寫絕對路徑
source?=>?'/etc/puppet/modules/redis/files/redis-master.conf',
content定義模板的路徑
格式 content? =>? template('MOD_NAME/ERB_FILE')
例子
content?=>?template('redis/redis-slave.conf.erb'),
等價于寫絕對路徑
content?=>?template('/etc/puppet/modules/redis/templates/redis-slave.conf.erb'),
vim?/root/modules/redis/manifests/init.pp class?redis?{package{'redis':ensure?=>?latest,}???service?{'redis':ensure?=>?running,enable?=>?true,hasrestart?=>?true,restart?=>?'service?redis?restart',require?=>?Package['redis'],}??? }
vim?/root/modules/redis/manifests/master.pp class?redis::master?inherits?redis?{file{'/etc/redis.conf':ensure?=>?file,source?=>?'/etc/puppet/modules/redis/files/redis-master.conf',owner?=>?redis,group?=>?root,require?=>?Package['redis'],}???Service['redis']{restart?=>?'systemctl?restart?redis',subscribe?=>?File['/etc/redis.conf'],}??? }
#slave配置文件,這里利用變量來傳遞參數
vim?/root/modules/redis/manifests/slave.pp class?redis::slave($masterip,$masterport='6379')?inherits?redis?{file{'/etc/redis.conf':ensure?=>?file,content?=>?template('/etc/puppet/modules/redis/templates/redis-slave.conf.erb'),owner?=>?redis,group?=>?root,require?=>?Package['redis'],}???Service['redis']{restart?=>?'systemctl?restart?redis',subscribe?=>?File['/etc/redis.conf'],}??? }
#注意修改配置文件如下
vim??/root/modules/redis/templates/redis-slave.conf.erb slaveof?<%=?@masterip?%>?<%=?@masterport?%>
#目前目錄結構如下
[root@CentOS7C modules]#tree
.
└── redis
? ? ├── files
? ? │? ?└── redis-master.conf
? ? ├── lib
? ? ├── manifests
? ? │? ?├── init.pp
? ? │? ?├── master.pp
? ? │? ?└── slave.pp
? ? ├── spec
? ? ├── templates
? ? │? ?└── redis-slave.conf.erb
? ? └── tests
文件都準備完成后,把redis整個模塊放到對應的軟件指定的目錄/etc/puppet/modules/下
cp?-r?/root/modules/redis/?/etc/puppet/modules/
測試
查看模塊
[root@CentOS7C?~]#puppet?module?list /etc/puppet/modules └──?redis?(???) /usr/share/puppet/modules?(no?modules?installed)
redis模塊后面顯示為???,為redis的相關元數據信息,用來描述模塊的,但是顯示異常,忽略該情況
聲明類
為哪個主機調用這個類,這里演示為當前主機調用,沒有跨主機
注意,調用是指明類名,而不是指明模塊
測試調用基類
puppet?apply?-v?--noop?-d?--test?-e?"include?redis"
測試調用子類,注意slave子類有變量,需要傳遞值
puppet?apply?-v?--noop?-d?--test?-e?"include?redis::master" puppet?apply?-v?--noop?-d?--test?-e?"class?{'redis::slave':?masterip?=>?'172.18.50.73',?masterport?=>?'6379',}"
執行
puppet?apply??-e?"include?redis::master" puppet?apply??-e?"class?{'redis::slave':?masterip?=>?'172.18.50.73',?masterport?=>?'6379',}"
轉載于:https://blog.51cto.com/ghbsunny/2046212