puppet简介
Puppet是一个IT基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期:供应(provisioning)、配置(configuration)、联动(orchestration)、及报告(reporting)。
基于puppet,可实现目标管理的幂等性、自动化重复任务、快速部署关键性应用以及在本地或云端完成主动管理变更和快速扩展架构规模等。
基于ruby语言开发,在版本(2.7.0)以后遵循(Apache2.0 license)。
基本工作模型
Master端会检索给被管理的节点定义好的类,然后到模块中把需要执行的类给抽取出来编译成catalog发送给agent,agent再到本地应用一遍。
资源组成类,类封装起来形成模块。
资源定义(resource declaration)
Resources are the fundamental unit formodeling system configurations 资源是系统模块配置的基础单位。
常用的资源类型:
group, user
package
file
service
notify
yumrepo
exec
cron
mount
puppet describe�Clist 列出所有资源类型;
puppet describe -s<TYPE>:列出指定资源的简要说明;
puppet describe<TYPE>:显示指定资源的详细说明;
语法(synax)
Every resource has a type ,a title and a set of attributes.每一个资源有一个类型,一个标题和一些属性。
type { 'title':
Attribute => value,
}
我们来根据上面语法定义一个简单的资源,创建一个notify.pp文件,写入以下内容,然后保存。
notify {'notice':
message => 'hello world',
}
可以使用 puppet apply 命令执行清单文件。
定义一个资源,安装httpd程序。vim test2.pp
package {'httpd':
ensure => 'installed',
}
如果我们还需要它启动起来,则再定义一个service资源,继续修改test2.pp。
package {'httpd':
ensure => 'installed',
}
service {'httpd':
ensure => 'running',
}
资源引用:
类型['资源名称']
引用时,类型的首字母要大写;
before:当前资源先执行完成以后,再执行before的资源。
require:需要的资源执行以后,当前资源才能执行。
Example(一):
package {'httpd':
ensure=> 'installed',
before=> Service['httpd'],
}
service {'httpd':
ensure=> 'running',
}
说明:这表示当前资源执行完成以后,才能运行Service['httpd']资源。也就是必须先安装了httpd才能启动httpd。
Example(二):
package {'httpd':
ensure => 'installed',
}
service {'httpd':
ensure => 'running',
require => Package[httpd],
}
说明:需要Package[httpd]资源执行完成后,才能运行当前资源。两个例子达到的效果相同,但是表诉方法可以不同。
定义资源创建用户组。
user { 'tuchao':
ensure => present,
uid => '600',
gid => '600',
home => '/home/tuchao',
shell => "/bin/bash",
managehome => true,
password => '$1$6a2222e7$LyK7xelqGU.QwUDOX44oW.',
require => Group['tuchao'],
}
group {'tuchao':
ensure => present,
gid => 600,
}
定义file资源,实现文件替换。
file{'/etc/httpd/conf/httpd.conf': //定义的文件路径,在资源属性中,所以标记为namevar,默认值为title。
ensure => file, //定义为普通文件
source =>'/backup/httpd/httpd.conf', //源文件路径
mode => '0644', //权限
owner => 'root',
group => 'tuchao',
}
定义命令资源exec用于启动httpd服务。
exec {'command1':
path =>'/bin:/sbin:/usr/bin:/usr/sbin',
command => 'service httpd start ',
user => root,
group => root,
}
资源相关性,一般用于当配置文件修改,需要通知服务重启的场景。
Notify(通知):定义在前资源中,当资源执行时可以通知某个资源。
Subscribe(订阅),定义在后资源中,当订阅的某个资源执行时,重启当前服务资源。
file{'/etc/httpd/conf/httpd.conf':
ensure => file,
source =>'/backup/httpd/httpd.conf',
mode => '0644',
owner => 'root',
group => 'tuchao',
notify => Service['httpd'],
}
service {'httpd':
ensure => running,
# subscribe =>File['/etc/httpd/conf/httpd.conf'],
}
资源间的应用次序链
“―>”用于定义次序链,而”~>”用于定义通知链,它们既可以用于资源引用间,也可以用于资源申报之间。
Package[‘ntp’] ―> File[‘/etc/ntp.conf’] ~> Service[‘ntpd’]
Puppet 变量:
1、使用$开头,无论是定义还是引用:
2、变量有其作用域,不在同一个作用域需要用FQN(长格式完全限定名称)引用。
facter -p //用于显示puppet顶级作用域所有变量。
Puppet 需要注意的数据类型:
Undef 从未被声明的变量的值类型
$abc=’hello world’ //声明变量赋值
$abc=undef //撤销变量
hash
即为外键值数据类型,键和值之间使用”=>”分隔,键值对儿定义在”{}”中,彼此间以逗号分隔;
其键为字符型数据,而值可以为puppet支持的任意数据类型;
访问hash类型的数据元素要使用”键”当作索引进行;
正则表达式
使用格式:(?选项:模式)
Example:
/(?i-mx:Redhat|Centos)/
选项i(忽略字符大小写),但不使用m(把.当作换行符)和x(忽略模式中的空白字符和注释)。
写一个实例,判断操作系统类型,选择安装Web服务器的程序包,使用notify输出到屏幕。
$a =$operatingsystem ? {
/(?i-mx:^(redhat|centos))/ => 'httpd',
/(?i-mx:^(debian|ubuntu))/ => 'apache2',
}
notify {'notice':
message => "Install $a",
}
条件判断
条件里面可以是表达式、变量、多个表达式做逻辑运算and,or,not、有返回值的函数。
Example:
$tuchao=20
if $tuchao > 30{
notice ('Old man')
}
else {
notice ('young man')
}
判断当前操作系统,选择安装合适的web程序包。
if $operatingsystem =~ /(?i-mx:^(Redhat|Centos))/ {
$webserver='httpd'
}
elsif $operatingsystem =~ /(?i-mx:^(debain|ubuntu))/ {
$webserver='apache2'
}
else {
notice ('Unknow OS')
}
package{"$webserver":
ensure => installed,
}
case 语句:
case $operatingsystem {
'Solaris': { notice ("Welcome to Solaris")}
'RedHat','Centos': { notice("Welcome to Redhat OSFamily")}
/(?i-mx:^(Debian|Ubuntu))/: { notice("Welcome to $1 linux")}
default: { notice ("Unknow OS")}
}
Selector
selector只能用于期望出现直接值的地方,这包括变量赋值、资源属性、函数参数、资源标题、其他selector的值及表达式
但是不能用于一个已经嵌套于selector的case中,也不能用于一个已经嵌套于case的case语句中。
使用要点:
1、整个selector语句会被当作一个单独的值。
2、如果没有任何一个case与控制变量匹配时,puppet在编译时将会返回一个错误,因此,实践中,其必须提供default case。
3、Selector的控制变量只能是变量或有返回值的函数,不能使用表达式。
4、其各case可以是直接值(需要加引号)、变量、能调用返回值的函数,正则表达式模式或default。
5、与case语句不同的是,selector的各case不能使用列表。
6、Selector的各case的值可以是一个除了hash以为的直接值、变量、能调用返回值的函数或其它的selector。
Example:
$a =$operatingsystem ? {
/(?i-mx:^(redhat|centos))/ => 'httpd',
/(?i-mx:^(debian|ubuntu))/ => 'apache2',
}
notify {'notice':
message => "Install $a",
}