puppet-intro
puppet命令詳解
使用puppet help
來查看命令幫助
puppet語法
Usage : puppet <subcommand> [options] <action> [optins]
子目錄的查看幫助語法是
'puppet help <subcommand> <action>' for help on a specific subcommand action
'puppet help <subcommand>'for help on a specific subcommand
查看所有可用的資源類型
puppet describe --list
manifest
puppet的程序文件叫做manifest,以.pp作爲文件後綴名
- puppet語言核心是’資源定義’ , 定義一個資源核心就在於描述目標狀態
- manifest實現了常見的程序邏輯,如條件語句,資源集合等
- manifest定義resource
“puppet apply”子命令能將一個manifest中描述的目標狀態強制實現
資源定義
syntax
every resource has a type , a title , and a set of attributes
type {'title':
attribute => value,
}
示例
user {'puppet':
ensure =>present,
gid =>'666',
uid =>'666',
shell =>'/bin/bash',
home =>'/home/puppet',
managehome =>true,
}
注意:
在定義資源類型時必須使用小寫字符,
資源名稱僅是一個字符串,但是要求在同一個類型中必須唯一
比如,可以用名字叫nginx的service資源和package資源,但是在package類型的資源中只能有一個名叫nginx
puppet resource
命令可以交互式查找和修改puppet資源
資源類型
group
manage group
使用puppet describe group
命令來獲取幫助
attribute:
name:組名,可以不寫,不寫的話就默認title是組名
gid:GID
system:是否是系統組
ensure:目標狀態 present/absent
members:成員用戶
user
manage users
使用puppet describe user
命令來獲取幫助
attribute:
name:用戶名,不寫則title默認就是用戶名
ensure:present/absent
uid
gid
groups:附加組,不能包含基本組
comment:註釋
expiry:過期時間
home:家目錄
package
manage packages
attribute:
ensure:installed , present , latest , absent
name:包名
source:程序包來源,一般是已經自己搞好的rpm或者dpkg
service
manage running services
attribute:
ensure:stopped(also called ‘false’) , running(also called ‘true’)
enable:true/false/manual
name:
path:
restart
file
manages files,including their content , ownership , and permissions
attribute:
ensure:present , absent , file , directory , link
file:普通文件,內容由content屬性生成或者複製source屬性文件路徑來創建
link:符號鏈接文件,必須由target屬性指明鏈接的目標文件
directory:目錄 , 同通過source指向的路徑複製生成,recurse屬性指明是否遞歸複製
path:路徑
source:源文件
content:文件內容
target:符號鏈接的目標文件
owner:屬主
group:屬組
mode:權限
atime/ctime/mtime:時間戳
示例:
file{'test.txt';
path =>'/tmp/test.txt',
ensure =>file,
content =>"hello world",
owner =>'nginx',
mode =>0664
source =>'/etc/fstab',
}
file{'test.symlink';
path =>'/tmp/test.symlink',
ensure =>link,
target =>'/tmp/test.txt',
require =>File['test.txt'],
}
exec
user/group:運行命令的用戶身份
path
onlyif:指定一個命令,此命令執行成功,當前命令才能運行
unless:指定一個命令,此命令運行失敗,當前命令纔會運行
refresh:重新執行當前command的替代命令
refreshonly:僅接收到訂閱的資源的通知纔會運行
cron
command:要執行的任務
ensure:present/absent
hour:
minute:
monthday
month
weekday:
user
target:添加爲哪個用戶的任務
name:cron job的名稱
notify
attribute:
message:信息內容
name:信息名稱
特殊資源命令
Name/Namevar
- most types have an attribute whith identifies a resource on the target system
- this is referred to as the ‘namevar’ , and is often simply called ‘name’
- namevar values must be unique per resource type , with only rare exceotions(such as exec)
ensure
- ensure =>file 存在且爲一個普通文件
- ensure =>directory 存在且爲一個目錄
- ensure =>present 存在,可通用於上述描述情況
- ensure=>absent 不存在
資源間的次序
puppet提供了before,require,notify,subscribe來定義資源間的相關性
資源的引用通過”Type[‘title’]”的方式進行,如User[‘nginx’]
比如
user{'redis':
ensure =>present,
gid =>800,
uid =>800,
system =>true,
}
group{'redis';
ensure =>present,
gid =>800,
system =>true,
before =>User['redis'],
}
puppet variable
$variable_name=value
puppet的變量名稱必須以$開頭,賦值操作符爲=
任何正常數據類型的值都可以賦值給puppet中的變量
puppet的每個變量都有兩個名稱:簡短名稱和長格式完全限定名稱(FQN),完全限定名稱的格式爲”$scope::variable”
scope是一個特定代碼區域,用於同程序中的其他代碼隔離開來
在puppet中scope可用於限定變量和資源默認屬性的作用範圍,但是不能用於限定資源名稱和資源引用的生效範圍
如果要訪問非當前scope中的變量,則需要通過完全限制名稱進行,如
vhostdir= apache::params::vhostdirtop scope的名稱爲空,因此如果要引用其變量,則需要使用類似”$::osfamily”的方式進行
數據類型
- 字符型:引號可有可無,單引號是強引用,雙引號是弱引用
- 數值型:默認均識別爲字符串,僅在數值上下文才以數值對待
- 數組:[]中以逗號分隔元素列表
- 布爾型值:true false,不加引號
- hash:{}中以逗號分隔k/v數據列表,鍵爲字符型,值爲任意puppet支持的類型,鍵值之間以”=>”分隔
- undef:未賦值型
正則表達式
(?:)
(?-:)
OPTIONS
i:忽略字符大小寫
m:把.當作換行符
x:忽略中的空白字符
operators
comparison operators
- ==(equality)
- !=(non-equality)
- <(less than)
- >(greater than)
- <=(less than or equal to)
- >=(greater than or equal to)
- =~(regex match)
- !~(regex non-match)
- in
boolean operators
- and
- or
- !(not)
arithmetic operators
- +(addition)
- -(subtraction)
- /(division)
- *(multiplication)
- >> (right shift)
- <<(left shift)
if語句
if CONDITIONS{
statement,
….
}
condition的給定方式
- 變量
- 比較表達式
- 有返回值的函數
比如
if $osfamily=~/(?-mx:debian)/{
$webserver='apache2'
}else{
$webserver='httpd'
}
case語句
case CONTROL_EXPRESSION{
case1:{….}
case2:{….}
….
default:{….}
}
control_expression
- 變量
- 表達式
- 有返回值的函數
各case的給定方式
- 直接字符串
- 變量
- 有返回值的函數
- 正則表達式模式
- default
比如
case $osfamily{
"RedHat":{$webserver='httpd'}
/(?i-mx:debian)/:{$webserver='apache2'}
default:{$webserver='httpd'}
}
selector語句
CONTROL_VARIABLE?{
case1 =>value1,
case2 =>value2,
…
default =>valueN,
}
control_variable的給定方法
- 變量
- 有返回值的函數
各case的給定方法
- 直接字串
- 變量
- 有返回值的函數
- 正則表達式模式
- default
比如
$pkgname=$opratingsystem?{
/(?i-mx:(ubuntu|debian))/ =>'apache2',
/(?i-mx:(redhat|fedora|centos))/ =>'httpd',
default =>'httpd',
}
puppet中的類
類:puppet中命名的代碼模塊,常用於定義一組通用的目標資源,可在puppet全局調用
類可以被繼承,也可以包含子類
語法格式
class NAME{
...puppet code...
}
class NAME(parameter1,parameter2){
....puppet code....
}
類代碼只有聲明之後纔會執行,調用方式
include CLASS_NAME1,CLASS_NAME2,…
class{‘CLASS_NAME’:
attribute =>value,
}
示例
class apache2{
$pkgname=$opratingsystem?{
/(?i-mx:(ubuntu|debian))/ =>'apache2',
/(?i-mx:(redhat|fedora|centos))/ =>'httpd',
default =>'httpd',
}
package{"$webpkg":
ensure =>installed,
}
file{'/etc/httpd/conf/httpd.conf':
ensure =>file,
owner =>root,
group =>root,
source =>'/tmp/httpd.conf',
require =>Package["$webpkg"],
notify =>Service['httpd'],
}
service{'httpd':
ensure =>running,
enable =>true,
}
}
include apache2
示例2
class web($webserver='httpd'){
package{"$webserver":
ensure =>installed,
before =>[File['httpd.conf'],Service['httpd']],
}
file{'httpd.conf':
path =>'/etc/httpd/conf/httpd.conf',
source =>'root/manifests/httpd.conf',
ensure =>file,
}
service{'httpd':
ensure =>running,
enable =>true,
restart =>'systemctl restart httpd.service',
subscribe =>File['httpd.conf'],
}
}
class{'web':
webserver =>'apache2',
}
類繼承的方式
class SUB_CLASS_NAME inherits PARENT_CLASS_NAME{
.....puppet code...
}
在子類中爲父類的資源新增屬性或者覆蓋指定的屬性的值
Type['title']{:
attribute =>value,
...
}
比如
class nginx::proxy inherits nginx {
Service['nginx']{
subscribe =>File['nginx-proxy.conf'],
}
puppet模板
erb 模板語言 embedded ruby
puppet的erb語法
https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html
文本文件中內嵌變量替換機制
<%= @VARIABLE_NAME %>
file{'title':
ensure =>file,
content =>template('/PATH/TO/ERB_FILE'),
}
示例
file{'nginx.conf':
path =>'/etc/nginx/nginx.conf',
ensure =>file,
content =>template('/root/manifests/nginx.conf.erb'),
require =>Package['nginx'],
}
模塊就是按照一個約定的預定義的結構存放了多個文件或子目錄的目錄,目錄裏的這些文件或者子目錄必須遵照一定的格式命名規範
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/
template(‘MOD_NAME/TEMPLATE_FILE_NAM’)
lib/:插件目錄,常用於存儲自定義的facts以及自定義類型
spec/ 類似於tests目錄,存儲lib/目錄下插件的使用幫助和範例
tests/ 當前模塊的使用幫助或使用範例文件
puppet config命令
獲取或設定puppet配置參數
puppet config print [argument]
puppet查找模塊文件的路徑:modulepath
puppet config print modulepath
,
可以指定自己要的路徑,比如:
puppet apply --modulepath=/root/dev/modules -e "include::server"
模塊更多的語法可以用puppet help module