一、puppet是什么
puppet是使用ruby开发的一款资源自动化配置管理工具。它使用一种简单易读的通用语言,来定义你想要你的应用或服务成为什么样子。
通过它,你可以共享、测试和强制改变你的数据。它的每一步操作对于你来说都是透明的,并且它会通知你做出决定及验证是否相符。
它能帮助管理员方便的进行升级软件包、管理配置文件、系统服务、cron任务、添加新的配置和修复错误等重复工作。
二、puppet是如何工作的
puppet采用c/s架构。有一个master及多个agent。master与agent之间采用ssl加密认证,保证安全。master存放了所有agent的配置代码,
agent从master下载对服务器进行配置。
1、客户端puppetd调用facter,facter会探测出这台主机的一些变量如主机名、内存大小、IP地址等。然后puppetd把这些信息发送到服务器端。
2、服务器端的puppetmaster检测到客户端的主机名,然后会到manifest里面对应的node配置,然后对这段内容进行解析,facter送过来的信息可以
作为变量进行处理的,node牵涉到的代码才解析,其它的代码不不解析,解析分几个过程:语法检查、然后会生成一个中间的伪代码,然后再把伪代码发给客户机。
3、客户端接收到伪代码之后就会执行,客户端再把执行结果发送给服务器。
4、服务器再把客户端的执行结果写入日志。
三、puppet描述语言
命名规范:只能是数字、字母和下划线,大小写敏感。
变量:$varname = value,使用变量${varname}
类中变量引用:$类::子类::变量
数组:有两种方式获得数组1).["v1","v2"...];2).split(${varname},分隔符)
资源:file、service、package、node、filebucket、cron、user、group、exec、notify
3.1 filebucket:用于文件的备份与恢复
filebucket{
"资源标题":
参数 => 值,
}
参数:
name => 资源名,
path => 备份文件存放路径,
port => 备份服务器的端口,
server => 备份服务器的域名,
3.2 file:管理本地文件系统的文件
file{
"路径":
参数 => 值,
}
参数:
backup
指定文件是否备份。值可以是filebucket标题、或者false(表示不备份)。
checksum
指定检查文件是否被修改的方式。可以选择MD5、mtime。默认是MD5。
content
指定文件内容,值是字符串。可以使用template("模板路径")加载模板。
ensure
如果文件不存在是否要创建文件。值可以是present、absent(删除)、file、directory、link。还可以是路径,表示创建一个连接。
force
把文件变成连接。值可以是true、false。
group
指定文件所属组。
ignore
指定文件目录复制时的过滤条件,符合条件的不被复制。
links
指定文件复制时复制连接文件策略。可以为follow、manage。follow表示不只是复制连接,也包括连接指向的文件。
manage表示只复制连接本身。
mode
设置文件权限。
owner
设置文件所属用户。
path
指定要管理的文件路径。值是一个资源的标题。
purse
将不在管理中的其它数据删除。true或false。
recurse
指定是否进行递归操作。可以是true、false、inf、remote。
recurselimit
设置递归的深度。
source
拷贝文件覆盖本地文件。值是一个uri,只支持puppet开头或本地文件的uri。
target
指定源文件。值{"源文件路径"}。只有在ensure => link时使用。
replace
是否覆盖已经存在的文件。true或false。
selrange
文件内容是否属于SELinux的哪个组成部分。只有开启SELinux。
selrole
文件所属的selinux角色。
seltype
文件所属的selinux type。
seluser
文件所属的selinux user。
sourceselect
选择拷贝目录级别。默认source是递归拷贝。
type
检查文件是否只读。
3.3
service:管理服务状态。在配置文件发生更改的情况下自动重启。
service{"标题":
参数 => 值,
}
参数:
ensure
指定服务目标状态。可以为running或stoped。
enable
指定服务是否开机自启动。true或false。
name
服务名。
hasstatus
指定管理脚本是否支持status参数。true或false。如果不支持,puppet会从运行进程列表里查询是否存在服务名,来判断服务状态。
hasrestart
指出管理脚本是否支持restart参数。true或false。
path
启动脚本的搜索路径。可以用冒号分割多个路径,也可以用数组。
provider
默认是init。base或daemontools或init。
3.4
package:管理软件包安装、卸载。管理软件包更新。
package{
"标题":
参数:值,
}
参数:
ensure
可以为present、installed、absent、pureged、latest、版本号。
present表示只要包存在就行。
installed软件必须安装好。
absent当软件包无依赖时删除。
pureged删除所有依赖软件包和配置文件。
latest升级到最新版本。
也可以指定版本号,安装指定版本号的软件包。
allowcdrom
通知apt允许使用cdrom昨晚软件源。
description
描述。
provider
以什么方式安装软件包。
source
指定软件包的安装源。
3.5
exec:执行系统命令。
exec{"标题":
参数 => 值,
}
参数:
cwd
在哪个路径下执行。也可以没有。
path
命令执行的搜索路径。如果没有,则命令使用绝对路径。
command
指定执行命令。一般在title中写,此处就不需要。
creates
当且仅当文件不存在,命令才会执行。值是文件绝对路径。执行命令成功会创建该文件。
user
指定运行命令的用户。
logoutput
是否记录日志。true、false和其它合法的日志等级。
onlyif
只有onlyif所指定的命令执行结果成功(为0),命令才被执行。
unless
与onlyif相反。
environment 设置额外的环境变量。
group
指定用户组。
refresh
定义如何更新命令。当exec收到一个来自其他资源的事件时,默认只会重新执行一次命令。不过这个参数允许你定义更新时执行不同的命令。
refreshondy
命令仅刷新时触发。也就是说只有在一个依赖的对象被改变时,命令才会被执行。仅当命令与其他对象有依赖关系时,这个参数才有意义。
returns
指定返回代码。
timeout
指定命令最长运行时间,单位秒。如果超出,命令会终止,并按运行失败处理。
3.6
cron:计划任务。每个任务需要有command、user及至少一个周期属性。
cron{
"标题":
参数:值,
}
参数:
ensure
定义cron目标状态。present或absent。
command
任务执行的命令。可以不写,默认是title。
user
指定cron任务的执行用户。默认是运行puppet用户。
minute
同crontab定时任务对于任务周期的设定。对应分钟。
hour
同crontab定时任务对于任务周期的设定。对应小时。
month
同crontab定时任务对于任务周期的设定。对应月份。
monday
同crontab定时任务对于任务周期的设定。对应天。
weekda
同crontab定时任务对于任务周期的设定。对应星期。
3.7
group:管理用户组
group{"标题":
参数:值,
}
参数:
name
组名
ensure
指定目标状态。present或absent。
gid
组唯一标识
members
组成员。
3.8
user:puppet私有的用户和组管理工具,不会直接修改/etc/passwd文件。
user{"标题":
参数:值,}
参数:
name
用户名。默认和title一样。
ensure
present或absent。
uid
用户唯一标识。
gid
所属组唯一标识。
groups
所属组名。可以是数组。
managehome
是否自动生成家目录。true或false。默认是false。
home
指定用户家目录。
shell
用户登录后默认分配的shell。
password
用户密码。使用MD5加密后的密串。使用单引号引起来。可以使用grub-md5-crypt命令来生成MD5密文。
3.9
yumrepo:管理客户端yum一致性。
yumrepo{"标题":
参数:值,}
参数:
descr
描述。
name
名字
baseurl
仓库的url。
enable
是否开启仓库。0(不开)或1(开).
enablegroup
是否允许使用yumgroup参数。
exclude
排除哪些软件的安装和更新。
failovermethod
可选priority或roundrobin。
gpgcheck
检查仓库中软件包的gpg签名。可以为0或1.
gpgkey
仓库软件包签名,gpg密钥url
include
包含配置url。
includepkgs
只有匹配的软件包才能安装。
keepalive
可以为0或1
metadata_expire
元组数据的过期时间。
mirrorlist
镜像列表。
priority
优先级。可以是1-99.
protect
启用或禁止对这个仓库的保护。0或1.
proxy
设置代理。
3.10 host:自动管理/etc/hosts
host{"标题":
参数:值,}
参数:
ensure
present或absent。
name
主机名。
ip
主机ip。
host_aliases
别名。
3.11 mount:管理挂载和卸载。
mount{"标题":
参数:值,}
参数:
ensure mounted或unmounted
device
设备
fstype
"ext3|ext4|nfs|cifs|iso9660|ntfs"
options
参数。可以为default、rw、ro
path
要挂载的目录。默认是title。
3.12 tidy:清理过期或无用的软件
tidy{"标题":
参数:值,}
参数:
age
指定过期时间。单位可以是s、m、h、d、w(周)。
backup
清理前是否备份。true或false。
match
匹配条件
path
清理路径。默认是同title。
recurse
是否递归。true或false
remdirs
是否只删除空目录。true或false
size
删除大于指定值得文件。单位可以是k、m。
type
过期的时间类型。可以是atime、mtime、ctime。
资源引用:Type["title1","title2"...].Type表示资源类型,首字母必须大写。
设置资源默认值:Type{参数 => 值,.....}
资源关系:before
在指定资源之前运行
after
在指定资源之后运行
require
必须在指定资源存在或运行成功后执行。
notify
通知指定资源进行更新
subscribe
资源有更新时通知指定资源执行。
标签:tag 元参数,标签资源,tag => "标签名";tag函数,为容器添加资源,tag("标签名");tagged函数,判断一个容器的标签是否被定义过,tagged("标签名")。
运算符:
算法运算符:+、-、*、/、**(幂)、%
整数比较运算符:>、<、==、>=、<=、!=、<=>(0表示相等;1表示前者大;-1表示后者大)
赋值:=、+=、-=、*=、/=、**=、%=
字符串比较:gt、ge、lt、le、eq、ne、cmp(相等返回0;前者大于后者,返回1;前者小于后者,返回-1)
逻辑运算符:||(or)、&&(and)、!(not)
文件判断:-d、-f、-e、-r、-w、-x、-b(是否是二进制文件)。以上如果条件成立,则返回1.
正则表达式:以/包裹表达式。以=~和!~表示匹配和不匹配。()和{}需要转义,使用\(\)和\{\}。
条件判断语句:
if 条件 {
}elseif 条件{
}else{}
case 值{
值1:{}
值2:{}
.
.
.
default:{}
}
$变量 = 值?{
值1:{}
值2:{}
.
.
.
default:{}
}
类:class 类名{}
子类:class 父类:子类{}
继承:class 子类 inherits 父类{Type ["title"]{参数=> 值,参数=> undef,参数+>值}}。undef表示删除父类中的属性;+>表示增加父类没有的属性。
自定义资源:
可以使用define声明创建新的资源类型。
用法:define 类型(参数.....){处理.....}
参数定义:参数类型 参数名 [=>初始值];
参数名必须以$符开头
资源的引用:
类型{title:参数.....}
其中参数不带$
$title和$name:
每一个自定义的资源,都会有两个自带的参数,$title及$name,这两个参数不必明确定义出来。
$title即是引用资源时实例的title。$name默认是$title的值。