puppet
特点:
puppet与其他手工操作工具有一个最大的区别是 puppet的配置具有稳定性,因此你可以多次执行puppet,一旦你更新了你的配置文件,puppet就会根据配置文件来更改你的机器配置,通常每30分钟检查一次. puppet会让你的系统状态同配置文件所要求的状态保持一致. 比如你配置文件里面要求ssh服务必须开启. 假如不小心ssh服务被关闭了,那么下一次执行puppet的时候,puppet会发现这个异常,然后会开启 ssh 服务. 以使系统状态和配置文件保持一致.puppet就象一个魔术师,会让你的混乱的系统收敛到puppet配置文件所想要的状态.
工作流程:
puppet既可以在单机上使用,也可以以c/s结构使用.在大规模使用puppet的情况下,通常使用c/s结构.在这种结构中puppet客户端只是指运行puppet的服务器,puppet服务器端是指运行puppetmaster的服务器.
puppet客户端首先会连接到puppet服务器端,并且通过facter工具把客户端的基本配置信息发送给服务器端. 服务器端通过分析客户端的主机名,通过node定义,找到该主机的配置代码,然后编译配置代码,把编译好的配置代码发回客户端,客户端执行代码完成配置.并且把代码执行情况反馈给puppet服务器端.
===========================================================
环境设置:
------------
时间服务器:
puppet需求客户端和服务端必须时间一致,所以先配置ntp服务器
安装:
服务端:ntp-4.2.4p8-3.el6.x86_64
客户端:ntpdate-4.2.4p8-3.el6.x86_64
配置:
服务端:
#vim /etc/ntp.conf
35 server 127.127.1.0 # local clock
36 fudge 127.127.1.0 stratum 10
#/etc/init.d/ntpd restart
客户端:
#ntpdate 192.168.0.250 同步时间
-------------
puppet要求主机名称合乎要求:
修改主机名称:
主机名称必须写成完整域名,而且需要在hosts文件里面做解析
客户端和服务端都需要把自己的主机和对方的主机名称解析写到hosts文件内
-------------
关闭防火墙
关闭selinux
-------------
安装依赖性软件
客户端和服务端都要安装:
#yum install ruby* python* -y
-------------
=========================================================
安装主包:客户端和服务器端都需要安装
facter安装:
作用:用来获取客户端系统信息(如hostname,ip,OS-Version,fqdn等)
#tar xvzf facter-1.6.6.tar.gz
#cd facter-1.6.6
#ruby install.rb
Puppet安装:
#tar xvzf puppet-2.7.12.tar.gz
#cd puppet-2.7.12
#ruby install.rb
==========================================================
通信配置:
1).服务端 从解开的puppet目录中拷取相应的配置文件:
# cp conf/redhat/fileserver.conf /etc/puppet/
# cp conf/redhat/puppet.conf /etc/puppet/
# cp conf/redhat/server.init /etc/init.d/puppetmaster
# chmod 755 /etc/init.d/puppetmaster
# chkconfig --add puppetmaster
# chkconfig puppetmaster on
# mkdir /etc/puppet/manifests
# pwd
/etc/puppet
# ls auth.conf fileserver.conf manifests puppet.conf
auth.conf //client访问puppet server的ACL配置文件
fileserver.conf //puppet server 作为文件服务器的ACL配置文件
manifests //Puppet脚本主文件目录,至少需要包含site.pp文件
puppet.conf //Puppet服务器配置文件
生成puppet账户:
[root@server puppet-2.7.12]# puppetmasterd --mkusers
启动master:
# /etc/init.d/puppetmaster start
2).客户端 从解开的源码包拷取相关配置文件:
# cp conf/namespaceauth.conf /etc/puppet/
# cp conf/redhat/puppet.conf /etc/puppet/
# cp conf/redhat/client.init /etc/init.d/puppet
# chmod +x /etc/init.d/puppet
修改相关配置文件:
# vi /etc/puppet/puppet.conf
[main]
server = server.a.com //服务器端主机名(这行原来没有,添加)
# vi /etc/puppet/namespaceauth.conf //修改内容如下
[fileserver]
allow *
[puppetmaster]
allow *
[puppetrunner]
allow *
[puppetbucket]
allow *
[puppetreports]
allow *
[resource]
allow *
生成puppet账户:
[root@client puppet-2.7.12]# puppetmasterd --mkusers
删除客户端/var/lib/puppet/ssl目录下的文件(否则可能会报错):
[root@client puppet]# rm -rf /var/lib/puppet/ssl/*
启动:
# /etc/init.d/puppet start
==================================================================
puppet通信:
客户端:
# puppetd --test --server manager.up.com
//客户端向server端发送请求
//Puppet客户端使用HTTPS和服务端(master)通信,为了和服务器端通信必须有合法的SSL认证,第一次运行puppet客户端的时候会生成一个SSL证书并指定发给Puppet服务端。
info: Creating a new SSL key for client.sxkeji.com
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
info: Creating a new SSL certificate request for client.sxkeji.com
info: Certificate Request fingerprint (md5): 62:CD:A6:63:A7:8C:89:54:68:AF:95:12:59:16:D7:08
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session Exiting;
no certificate found and waitforcert is disabled
服务端:
1).Server端查看请求的主机
# puppetca --list
wing.up.com (05:BF:3C:9E:D8:72:13:24:1D:3F:4C:15:00:E7:FC:25)
2).发送接受请求
puppet 服务端接受到客户端的证书后必须签字(sign)才能允许客户端接入
# puppetca -s –a
notice: Signed certificate request for client.sxkeji.com
notice: Removing file Puppet::SSL::CertificateRequest client.sxkeji.com at /var/lib/puppet/ssl/ca/requests/wing.up.com.pem'
-s //sign签名
-a //对所有客户端全部签名
//puppetca –s client.a.com //只签名某个客户端
3).使用puppet cert list --all 命令可以查看已经加入的客户端
# puppet cert list --all
+ wing.up.com (05:BF:3C:9E:D8:72:13:24:1D:3F:4C:15:00:E7:FC:25)
+ manager.up.com (52:A3:37:85:33:4D:97:7B:1B:78:87:DE:4F:EB:1D:DE) (alt names: DNS:puppet, DNS:puppet.a.com, DNS:server.a.com)
客户端:
4).client再次发送请求puppetd --test --server server
# puppetd --test --server manager.up.com
notice: Ignoring --listen on onetime run info: Caching catalog for client.a.com
info: Applying configuration version '1332988321'
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.25 seconds
只要出现上面结尾带seconds这样的提示,恭喜你通信成功!
server和client就可以正常通信了
=======================================================================
通信排错:
错误1:
# puppetd --test --server manager.up.com
err: Could not request certificate: The certificate retrieved from the master does not match the agent's private key.
Certificate fingerprint: 36:1E:1D:03:B6:90:E9:F6:88:06:37:8B:81:2E:65:EE
To fix this, remove the certificate from both the master and the agent and then start a puppet run, which will automatically regenerate a certficate.
On the master:
puppet cert clean wing.up.com
On the agent:
rm -f /var/lib/puppet/ssl/certs/wing.up.com.pem
puppet agent -t
Exiting; failed to retrieve certificate and waitforcert is disabled
解决方法:
服务器端:
1).#puppet cert clean wing.up.com
2).重启服务
客户端:
1).#rm -f /var/lib/puppet/ssl/certs/wing.up.com.pem
2).# puppetd --test --server manager.up.com //注意这不是错误。。。。wing
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
Exiting; no certificate found and waitforcert is disabled
如果还是上面提示
# rm -rf /tmp/puppet
# mv /var/lib/puppet /tmp
# puppetd --test --server manager.up.com
如果还是同样的错误错,重复以上所有步骤
错误2:
notice: Ignoring --listen on onetime run
notice: Run of Puppet configuration client already in progress; skipping
解决方法:
#ps -e | grep puppet
查看是否有puppet进程在运行。如果有,则停掉puppet,再运行,即可。 没有进程,那有可能puppetdlock存在,则删除之,使用rm -rf /var/puppet/state/puppetdlock
错误3:
# puppetd --test --server manager.up.com
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
Exiting; no certificate found and waitforcert is disabled
解决方法:执行下面命令后重新执行
#mv /var/lib/puppet/ /tmp/
错误4:
# puppetd --test --server manager.up.com
err: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed. This is often because the time is out of sync on the server or client
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
err: Could not send report: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed. This is often because the time is out of sync on the server or client
解决方法:务必保持两台主机时间同步,执行下面命令
#rm -rf /var/lib/puppet/ssl/*
#puppetd --test --server server.robin.com
==========================================================
客户端定期更新时间:
修改puppet客户端默认连接到puppetmaster的时间间隔,默认情况下,puppet 客户端每隔30分钟连接到puppetmaster.
我修改为10分钟.
#vim /etc/puppet/puppet.conf
runinterval = 600 # 默认配置文件里没有这一行,需要自己手动添加,这里的单位为秒
/var/lib/puppet/yaml/node/目录存放客户端更新文件
===========================================================
puppet应用:
1).给客户端创建文件
服务端:
#vim /etc/puppet/manifests/site.pp
file { //资源类型
"/tmp/aa.txt": //标题title
content => "world\n", //属性
}
客户端:
# puppetd --test --server manager.up.com
2).推送文件
--------------------------
服务端:
#vim /etc/puppet/fileserver.conf
[files]
path /
allow 192.168.0.0/24
#echo hello > /hello.txt
#vim /etc/puppet/manifests/site.pp
file {
"/tmp/hello.txt":
source => "puppet://manager.up.com/files/hello.txt",
}
客户端:
# puppetd --test --server manager.up.com
# cat /tmp/hello.txt
hello
-----------------------------
服务端:
file {
"/tmp/bb.txt":
source => "puppet://manager.up.com/files/bb.txt",
group => wing,
owner => wing,
mode => 700,
}
客户端:
# puppetd --test --server manager.up.com
#ll
-rwx------ 1 wing wing 5 Jan 10 14:49 bb.txt
=================================================
3.推送脚本并执行:
file {
"/tmp/b.sh":
source => "puppet://manager.up.com/files/b.sh",
notify => Exec["exec-touch"], //exec-touch是自己定义的名字,随便写
}
exec {
"exec-touch": // 里面的名字就是上面file资源里定义的名字
cwd => "/tmp", // 下面command里/tmp/b.sh的路径/tmp存在的话,此行不用写
command => "sh /tmp/b.sh",
user => "root",
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ", 注:command里面的命令如果写绝对路径,比如/bin/sh,此行不用写
}
=================================================
4.执行一条命令:
exec {
"touch":
command => "touch /tmp/cccccccccc.txt",
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
}
=================================================
5.执行多条命令:
exec {
"haha":
cwd => "/tmp",
command => "/bin/bash /tmp/a.sh;/bin/touch /tmp/d.txt",
user => "root",
}
=================================================
6.服务状态管理:
service {
mysqld:
ensure => "stopped",
httpd:
ensure => "running",
sshd:
ensure => "stopped",
}
=================================================
7.软件包管理
Package资源
Package资源管理系统的软件包安装,该资源的主要属性是ensure;设置该软件包应该在什么状态. installed 表示要安装该软件,也可以写成present; absent 表示反安装该软件,pureged 表示干净的移除该软件,latest表示安装软件包的最新版本。
服务端:
[root@server manifests]# vim /etc/puppet/manifests/site.pp
package {
["httpd"]:
ensure => installed;
["vsftpd"]:
ensure => absent;
}
puppet利用方括号来定义数组,数组的内容由逗号分割,以上表示确保安装httpd和卸载vsftpd
客户端:
注意:yum库配置好
[root@client ~]# rpm -q httpd
package httpd is not installed
[root@client ~]# rpm -q vsftpd
vsftpd-2.2.2-11.el6.x86_64
[root@client ~]# puppetd --test --server server.a.com
[root@client ~]# rpm -q httpd
httpd-2.2.15-26.el6.x86_64
[root@client ~]# rpm -q vsftpd
package vsftpd is not installed
====================================================
8.计划任务
服务端
#vim /etc/puppet/manifests/site.pp
cron {
"logrotate":
command => "/usr/sbin/logrotate",
user => root,
hour => 2,
minute => 0
}
客户端
[root@client ~]# puppetd --test --server server.a.com
上述例子执行的结果就是在crontab中增加了一行:
0 2 * * * /usr/sbin/logrotate
====================================================
====================================================
模块:
1.需要在puppet主配置文件puppet.conf内指定模块目录位置
[main]
modulepath=/etc/puppet/modules:目录2:目录3
2.创建模块目录结构
1)#mkdir /etc/puppet/modules
2)创建具体模块
#mkdir /etc/puppet/modules/模块名
#mkdir /etc/puppet/modules/模块名/manifests
#mkdir /etc/puppet/modules/模块名/files
#mkdir /etc/puppet/modules/模块名/templates
3.配置模块
在模块的manifests目录下的init.pp文件是模块的核心配置文件,每个模块都必须拥有一个init.pp文件
#vim /etc/puppet/modules/模块名/manifests/init.pp
class 模块名称 {
file {
"/tmp/aa.txt":
content => "world\n",
}
}
4.使用模块
#vim /etc/puppet/manifests/site.pp
include 模块名
5.关联资源
编辑motd模块的核心配置文件init.pp
#vim init.pp
class motd {
package { "setup":
ensure => present,
}
file { "/etc/motd":
owner => "root",
group => "root",
mode => 644,
source => "puppet://$puppetserver/files/motd",
require => Package["setup"],
}
}
修改文件服务配置文件:
#vim /etc/puppet/fileserver.conf
[files]
path /etc/puppet/modules/motd/files/etc/
allow 192.168.116.0/24
motd模块的init.pp文件中包含一个独立的类motd,类中包含两个资源:一个软件包和一个文件资源。setup软件包里有很多我们日常需要的配置文件,大家可以使用rpm工具查看setup包,会发现很多系统配置文件包含其中。/etc/motd文件就包含在setup软件包中,motd就是message of the day.File[/etc/motd]是一个文件资源,它的前三个属性分别定义了文件的拥有者、拥有组和ugo权限,source定义了文件的位置,puppet://服务器/modules/模块名/文件保持位置。“文件保持位置”是相对模块目录下files目录而言的。所有存放在模块中的文件都位于files目录下,这里可以认为是模块文件共享的根。在这个例子里,我们需要创建相应目录和文件
[root@puppet-master puppet]# mkdir /etc/puppet/modules/motd/files/etc -p
[root@puppet-master puppet]# echo "Hello Puppet" >/etc/puppet/modules/motd/files/etc/motd
客户端测试
[root@client puppet]# puppetd --test --server server.a.com
================================================
创建erb模板文件:
#vim /etc/puppet/modules/exam/templates/hello.erb
hello how are you
调用erb模板文件:
#vim /etc/puppet/modules/模块名/manifests/init.pp
class 模块名称 {
file {
"/tmp/aa.txt":
content => template ("/etc/puppet/modules/exam/templates/hello.erb"),
}
}
===================================================
节点:
每一个节点代表一台主机,可以给不同的节点设置不同的推送信息
直接使用节点:
#vim site.pp
node ’节点主机名称‘ {
file {
"/tmp/aa.txt":
content => "world\n",
}
}
-----------------------
也可以先定义节点,再在site.pp文件调用节点:
定义节点:
#mkdir /etc/puppet/manifests/nodes
#vim /etc/puppet/manifests/nodes/nodes.pp
node '节点主机名称' {
file {
"/tmp/aa.txt":
content => "world\n",
}
}
注:节点主机名称必须得能被解析
调用节点:
#vim /etc/puppet/manifests/site.pp
import 'nodes/*'
-------------------------
节点名称可以使用正则:
node /^node\d+\.uplooking\.com/ {
include motd
}
这个例子会匹配node开头一个或多个数字连接并以.uplooking.com结尾的主机,如node1.uplooking.com、node2.uplooking.com、node250.uplooking.com 。
include指令可以使用多次,也可以在“配置集合”间用逗号隔开。
include sshd
include apache
include squid,nginx
除了“配置集合”外,我们还可以为节点指定单独的配置项,如下:
node 'node1.uplooking.com' {
include motd
package { 'vim-enhanced': ensure => present }
}
======================================
概念:
资源 :可被puppet管理的配置文件、用户、cron任务、软件包、系统服务等系统实体
资源类型 :file package service
资源清单 :site.pp主力清单 init.pp模块清单 nodes.pp节点清单
类: :class指令,用来定义模块
模块 :可直接被清单调用,使用 ’include 模块名称‘调用
模板 :以.erb结尾的模板文件可直接被模块的动作调用,使用‘template("模板绝对路径")’函数调用
节点 :可为不同的客户端主机单独定义分发配置,使用‘import’调用
文件 :发送到Agent端的真实配置文件
======================================
附加
一.资源类型
1.file 文件管理
● ensure — 指定文件的目标状态
- present 检查文件是否存在,不存在则新建之
- absent 检查文件是否存在,存在则删除之
- directory 指定这是一个目录
● path — 文件完整路径。默认与title相同
● source — 文件获取地址。以puppet:///开头为从master下载,正常路径则在agent本地读取
● content — 文件的具体内容。亦可由erb模板生成。
● recurse — 对目录是(true)否(false)递归(ensure => directory时有效)
● owner — 所属用户,可用uid
● group — 所属用户组,可用gid
● mode — 权限属性,数字,如755
2.package 软件包管理
● ensure — 指定软件包的目标状态
- present 检查软件包是否存在,不存在则安装之
- absent 检查软件包是否存在,存在则卸载之
- latest 检查软件包版本是否在软件源中最新,非最新则升级之
- {any version string} 检查软件包版本是否为指定版本,不是则安装为指定版本
- purged 深度卸载,删除所有配置文件和依赖包,有潜在风险,慎用
● name — 软件包的名称,默认与title相同
● source — 获取安装包的地址(若包没有repo地址)
3.service 服务管理
●ensure — 指定服务的目标状态
- running (true) 运行状态
- stopped (false) 停止状态
● enable — 指定服务是否开机自启动,并非对所有均有效
- true 开机启动
- false 开机不启动
● name — 服务名,默认与title相同
● status, start, stop, and restart — 对这些操作手工指定命令,用于init脚本不规范的服务
● has restart — 描述该服务是否有restart指令,默认false。如果无,则puppet会依次执行stop/start实现restart
● hasstatus — 描述该服务是否有status指令,默认false。如果无,则puppet会grep进程列表来实现status判断
● pattern — 当hasstatus为false,puppet进行grep匹配时采用的正则表达式,默认与title相同
● binary — 当服务没有init脚本时,将直接使用该程序的二进制包本体。binary属性的值即为该本体的完整路径
二.工具箱 – exec, cron, user, group
1. exec:执行shell命令
● command — 欲运行的具体命令,如未指定path,则要求路径完整准确。默认与title相同
● path — 指定命令的$PATH。以逗号分隔。例:
● creates — 将被此命令生成的文件。若该文件已存在,则命令不执行
● refreshonly — 当设置为true时,该命令只会在其subscribe的资源变动时执行
● onlyif — 当该属性值中的命令或一组命令成功执行(返回值均为0)时,该命令才会执行
● unless — 与onlyif相反……
● environment — 提供环境变量。可为一个或一组
2. cron:计划任务管理
● command — 欲执行的命令或脚本路径
● ensure — 决定该计划任务的目标状态
- present 如该cron不存在,则添加之
- absent 如该cron已存在,则删除之
● hour, minute, month, monthday, and weekday — 计划任务的时间安排,支持列表(如:[2, 4])
● user — 执行该cron的用户身份
3. user:用户管理
● name — 用户名,默认与title相同
● uid — 指定具体UID。不指定则自动生成
● ensure — 指定用户的目标状态
- present 该用户不存在则生成
- absent 该用户存在则删除
● gid — 该用户所属主用户组的GID
● groups — 该用户所属用户组名,可为列表
● home — 该用户分配的家目录
● managehome — 是否自动生成家目录,默认为false,需要手工指定
● shell — 用户登录后默认分配的shell
4. group:组管理
● name — 组名,默认与title相同
● gid — 指定具体GID,不指定则自动生成
● ensure — 指定该组的目标状态
- present 该组不存在则建立
- absent 该组存在则删除
● system — 表明此组是否为系统组,使用较小的GID
三.变量
$test="hello,guys"
file {
"/tmp/test":
content => $test;
}