Puppet 之 模板和模塊
模板文件是在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',}"
Puppet 之 模板和模塊