Puppet是一种Linux、Unix平台的集中配置管理系统,使用ruby语言,可管理配置文件、用户、cron任务、软件包、系统服务等。Puppet把这些系统实体称之为资源,Puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
puppet是一个IT基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期: 供应(provisioning)、配置(configuration)、联动(orchestration)及报告(reporting)。
基于puppet ,可实现自动化重复任务、快速部署关键性应用以及在本地或云端完成主动管理变更和快速扩展架构规模等。
遵循GPL 协议(2.7.0-), 基于ruby语言开发。
2.7.0 以后使用(Apache 2.0 license)
对于系统管理员是抽象的,只依赖于ruby与facter。
能管理多达40 多种资源,例如:file、user、group、host、package、service、cron、exec、yum repo等。
puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置客户端. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息.
Puppet工作流程
使用模型
puppet的使用模型分为单机使用模型和master/agent模型
单机使用模型
实现定义多个manifests --> complier --> catalog --> apply
master/agent模型
master/agent模型实现的是集中式管理,即 agent 端周期性向 master 端发起请求,请求自己需要的数据。然后在自己的机器上运行,并将结果返回给 master 端。
从上面的图,我们可以看到,Master接收到Agent的请求后,会查找自己的Manifests及相关的配置,并找到请求节点相关的内容,然后编译成Catalog,发回给Agent执行。
这个过程大概有这样几个步骤:
1. Master加载配置文件
2. 查找节点定义,查看节点中声明的资源和类
3. 查找到这些资源和类,编译生成Catalog
puppet 名词解释
资源:是puppet的核心,通过资源申报,定义在资源清单中。相当于ansible中的模块,只是抽象的更加彻底。
类:一组资源清单。
模块:包含多个类。相当于ansible中的角色。
站点清单:以主机为核心,应用哪些模块。
操作篇:
操作环境:
192.168.80.181 |
master.czm.com |
ruby ruby-libs ruby-shadow puppet puppet-server facter ntp |
192.168.80.182 | client01.czm.com | puppet ntp |
192.168.80.183 | client02.czm.com | puppet ntp |
注:三台主机均为NAT模式
修改主机名:
hostnamectl set-hostname 主机名
exit 登出
重连即可
master:
搭建
systemctl stop firewalld && setenforce 0 //关闭防火墙及selinux
释放网络仓库 重启网卡使主机可以ping通外网ip
vi /etc/hosts
scp 发送给其他两台主机
yum install ntp -y //时间同步
ntpdate time1.aliyun.com //同步阿里云网络时间
yum install -y epel-release //安装网络源
yum -y install ruby ruby-libs ruby-shadow
yum -y install puppet puppet-server facter
vi /etc/puppet/puppet.conf //在[main]下新增
modulepath = /etc/puppet/modules:/usr/share/puppet/modules
systemctl start puppetmaster
systemctl enable puppetmaster //启动服务以及开机自启
netstat -anpt | grep 8140
client:(01和02搭建的环境基本一致)
关闭防火墙以及selinux ntp同步网络时间 安装epel源
yum install -y puppet
注:
其中主配置文件为/etc/puppet/puppet.conf,使用的主程序为/usr/bin/puppet。
可以使用puppet describe来打印有关Puppet资源类型,提供者和元参数的帮助。使用语法如下:
puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]
-l:列出所有资源类型;
-s:显示指定类型的简要帮助信息;
-m:显示指定类型的元参数,一般与-s一同使用;
例子:
puppet describe -l -s -m
vi /etc/puppet/puppet.conf //在[agent]下添加,末尾添加
定义主服务器name
service puppet start
systemctl enable puppet
ps aux | grep pupp
——————————申请与注册————————————
client上操作--接着在服务器上授权
在client上:申请注册
puppet agent --server=master.czm.com --no-daemonize --verbose --debug
在master上:
puppet cert --list //查看申请的客户端
puppet cert sign --all
//将未注册的客户端进行注册
ll /var/lib/puppet/ssl/ca/signed/ //查看已经注册的客户端
注:认证报错后
find /var/lib/puppet -type f -print0 |xargs -0r rm //删除认证ssl
将删除语句执行在了master主机上,客户端连接报以下错
重启puppetmaster即可
到此申请完成
配置实例:
案例描述:
为了保护linux的ssh端口,批量修改客户端sshd端口,将22端口修改为9922,并实现重启工作。
注:配置文件内要注意格式 结尾不能多加空格行
1、创建必要的目录
在master上:
mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files}
//创建ssh模块,模块下面有三个文件:manifests、templates和files
mkdir /etc/puppet/manifests/nodes //创建节点目录
mkdir /etc/puppet/modules/ssh/files/ssh //创建ssh模块目录
chown -R puppet /etc/puppet/modules/
ll /etc/puppet/modules/ssh/
2、创建模块配置文件install.pp
vi /etc/puppet/modules/ssh/manifests/install.pp //新建文件(首先确定客户端安装ssh服务)
class ssh::install{
package{"openssh":
ensure => present,
}
}
vi /etc/puppet/modules/ssh/manifests/config.pp//新建文件
class ssh::config{
file {"/etc/ssh/sshd_config":
ensure => present,
owner => "root",
group => "root",
mode => "0600",
source => "puppet://$puppetserver/modules/ssh/ssh/sshd_config",
require => Class["ssh::install"],
notify => Class["ssh::service"],
}
}
vi /etc/puppet/modules/ssh/manifests/service.pp //新建文件
class ssh::service {
service {"sshd":
ensure=>running,
hasstatus=>true,
hasrestart=>true,
enable=>true,
require=>Class["ssh::config"]
}
}
vi /etc/puppet/modules/ssh/manifests/init.pp //新建文件
class ssh{
include ssh::install,ssh::config,ssh::service
}
ll /etc/puppet/modules/ssh/manifests/ //下面有四个文件
cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/
chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config //修改权限
vi /etc/puppet/manifests/nodes/ssh.pp
node 'client02.czm.com' {
include ssh
}
node 'client01.czm.com' {
include ssh
}
vi /etc/puppet/manifests/site.pp //新建文件
import "nodes/ssh.pp"
vi /etc/puppet/modules/ssh/files/ssh/sshd_config //修改(13)
Port 9922
service puppetmaster restart //重新启动puppet
--------------client----客户端主动拉取---------
puppet agent -t
cat /etc/ssh/sshd_config //验证如下
Port 9922
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
从上图,可以看出更换了ssh的端口。
netstat -tunlp| grep ssh //查看服务器ssh服务是否重启,端口是否生效
5、配置服务器推送同步(客户端)
vi /etc/puppet/puppet.conf //最后一行添加
listen = true
vi /etc/puppet/auth.conf //最后一行添加
allow *
service puppet restart //启动puppet客户端
cat /etc/ssh/sshd_config //查看
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
netstat -tunlp| grep ssh //确认启动ssh服务
------------master---------------
puppet kick clientname //开始往客户端推送
vi /etc/ssh/sshd_config //在clientname上查看,验证如下
Port 9922
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
netstat -tunlp| grep sshd //在clientname上查看,查看服务器ssh服务是否重启,端口是否生效
扩展:
管理系统上的用户组
vim group.pp
group{'mygrp':
name => 'mygrp',
ensure => present,
gid => 2000,
}
说明:
name:组名,可以省略,如果省略,将继承title的值;
gid:GID;
system:是否为系统组,true OR false;
ensure:目标状态,present/absent;
members:成员用户;
管理系统上的用户:
vim user1.pp
user{'keerr':
ensure => present,
system => false,
comment => 'Test User',
shell => '/bin/tcsh',
home => '/data/keerr',
managehome => true,
groups => 'mygrp',
uid => 3000,
}
说明:
name:用户名,可以省略,如果省略,将继承title的值;
uid: UID;
gid:基本组ID;
groups:附加组,不能包含基本组;
comment:注释;
expiry:过期时间 ;
home:用户的家目录;
shell:默认shell类型;
system:是否为系统用户 ;
ensure:present/absent;
password:加密后的密码串;
puppet的管理软件包:
vim package1.pp
package{'nginx':
ensure => installed,
provider => yum
}
说明:
ensure:installed, present, latest, absent, any version string (implies present)
name:包名,可以省略,如果省略,将继承title的值;
source:程序包来源,仅对不会自动下载相关程序包的provider有用,例如rpm或dpkg;
provider:指明安装方式;
定义服务的状态
vim service1.pp
service{'nginx':
ensure => true,
enable => false
}
说明:
ensure:服务的目标状态,值有true(running)和false(stopped)
enable:是否开机自动启动,值有true和false
name:服务名称,可以省略,如果省略,将继承title的值
path:服务脚本路径,默认为/etc/init.d/下
start:定制启动命令
stop:定制关闭命令
restart:定制重启命令
status:定制状态
管理文件、目录、软链接:
vim file1.pp
file{'aaa':
path => '/data/aaa',
source => '/etc/aaa',
owner => 'keerr',
mode => '611',
}
说明:
ensure:目标状态,值有absent,present,file,directory和link
file:类型为普通文件,其内容由content属性生成或复制由source属性指向的文件路径来创建;
link:类型为符号链接文件,必须由target属性指明其链接的目标文件;
directory:类型为目录,可通过source指向的路径复制生成,recurse属性指明是否递归复制;
path:文件路径;
source:源文件;
content:文件内容;
target:符号链接的目标文件;
owner:定义文件的属主;
group:定义文件的属组;
mode:定义文件的权限;
atime/ctime/mtime:时间戳;
执行命令,慎用。通常用来执行外部命令:
vim exec1.pp
exec{'cmd':
command => 'mkdir /data/testdir',
path => ['/bin','/sbin','/usr/bin','/usr/sbin'],
# path => '/bin:/sbin:/usr/bin:/usr/sbin',
}
说明:
command(namevar):要运行的命令;
cwd:指定运行该命令的目录;
creates:文件路径,仅此路径表示的文件不存在时,command方才执行;
user/group:运行命令的用户身份;
path:指定命令执行的搜索路径;
onlyif:此属性指定一个命令,此命令正常(退出码为0)运行时,当前command才会运行;
unless:此属性指定一个命令,此命令非正常(退出码为非0)运行时,当前command才会运行;
refresh:重新执行当前command的替代命令;
refreshonly:仅接收到订阅的资源的通知时方才运行;
定义周期性任务:
vim cron1.pp
cron{'timesync':
command => '/usr/sbin/ntpdata 172.16.0.1',
ensure => present,
minute => '*/3',
user => 'root',
}
说明:
command:要执行的任务(命令或脚本);
ensure:目标状态,present/absent;
hour:时;
minute:分;
monthday:日;
month:月;
weekday:周;
user:以哪个用户的身份运行命令(默认为root);
target:添加为哪个用户的任务;
name:cron job的名称;