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',}"