简介

puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置客户端. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息。
工作流程
puppet客户端首先会连接到puppet服务器端,并且通过facter工具把客户端的基本配置信息发送给服务器端. 服务器端通过分析客户端的主机名,通过node 定义,找到该主机的配置代码,然后编译配置代码,把编译好的配置代码发回客户端,客户端执行代码完成配置.并且把代码执行情况反馈给puppet服务器端.
常用资源
常见的资源有notify(调试与输出),file(配置文件),package(软件安装),service(服务管理),exec(执行命令),cron(定时脚本),user(用户),group(用户组)

#查看puppet支持的所有资源和模块
[root@puppet-master ~]# puppet describe -l
#查看文件资源的详细信息
[root@puppet-master ~]# puppet describe -s file

前期准备

准备两台Centos7虚拟机,一台用作server端,一台用作agent端,配置IP地址和hostname(要严格匹配FQDN格式),同步时间,关闭防火墙和selinux,配置ip地址和hostname映射

hostname

ip

puppet-master.jun.cc

192.168.29.136

puppet-agent.jun.cc

192.168.29.137

下载官方rpm包,并配置yum源
下载地址:http://yum.puppetlabs.com/el/7/products/x86_64/

部署puppet-master

#安装软件
[root@puppet-master ~]# yum install puppet-server puppet -y
#启动服务
[root@puppet-master ~]#systemctl start puppetmaster
[root@puppet-master ~]#systemctl start puppet
#查看启动情况
[root@puppet-master ~]# netstat -tnlp |grep 8140

修改配置文件

[root@puppet-master ~]# vi /etc/puppet/puppet.conf
certname=puppet-master.jun.cc #定义自己签名认证的名称,即自己的主机名

部署puppet-agent

#安装软件
[root@puppet-agent ~]# yum install puppet -y

修改配置文件

[root@puppet-agent ~]# vi /etc/puppet/puppet.conf
certname=puppet-agent.jun.cc #定义自己签名认证的名称,即自己的主机名
server=puppet-master.jun.cc #指定puppetmaster
runinterval=60 #定义agent多长时间主动从master拉取一次资源
#启动服务
[root@puppet-agent ~]# systemctl start puppet

实现master和agent的认证连接

agent端尝试发送注册申请

[root@puppet-agent ~]# puppet agent -t

master端进行认证连接

#查看认证请求 
[root@puppet-master ~]# puppet cert --list 
#签发认证
[root@puppet-master ~]# puppet cert sign --all

agent再次发送注册申请

[root@puppet-agent ~]# puppet agent -t
#生成证书在/var/lib/puppet/ssl

应用案例

文件资源案例

1、创建文件

#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
#创建一个文件
#设置部署结点
node 'puppet-agent.jun.cc'{
	#格式:文件资源{‘title‘: 属性 => 值, }
	#title可自行起名
	file{'aaa':
		#指定路径
		path => "/tmp/puppet.txt",
		#添加文件内容
		content => "Hello puppet agent";
	}
}
#agent端手动拉取资源
[root@puppet-agent ~]# puppet agent -t
#查看执行情况
[root@puppet-agent ~]# cat /tmp/puppet.txt 
Hello puppet agent[root@puppet-agent ~]#

2、复制本地配置文件

#编辑部署文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	file{'conf':
		path => "/tmp/httpd.conf",
		mode => "644",
		owner => "root",
		group => "root",
		source => "puppet://puppet-master.jun.cc/files/httpd.conf",
	}
}
#修改配置文件
[root@puppet-master puppet]# vi fileserver.conf 
#添加文件存放的目录和允许权限
[files]
path /etc/puppet/files/
allow *

#查看执行情况
[root@puppet-agent ~]# ls /tmp/
httpd.conf

当远程主机已经存在有相同的配置文件时,备份原有的配置文件

#编辑部署文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	file{'conf.bak':
		path => "/tmp/httpd.conf",
		source => "puppet://puppet-master.jun.cc/files/httpd.conf",
		backup => ".bak",
	}
}
#在远程主机创建httpd.conf文件
[root@puppet-agent ~]# echo haha > /tmp/httpd.conf
#手动拉取资源
[root@puppet-agent ~]# puppet agent -t
#查看执行情况
[root@puppet-agent ~]# ls /tmp/
httpd.conf  httpd.conf.bak

3、创建软连接

#编辑部署文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	file{'link':
		path => "/tmp/puppet.link",
		ensure => link,
		target => "/usr/lib/puppet",
	}
}
#查看执行结果
[root@puppet-agent ~]# ls -al /tmp/
总用量 32
lrwxrwxrwx   1 root root   15 7月  13 11:16 puppet.link -> /usr/lib/puppet

4、创建文件夹

[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	file{'dir':
		path => "/tmp/hello",
		ensure => directory,
	}
}
#查看执行结果
[root@puppet-agent ~]# ls -al /tmp/
drwxr-xr-x   2 root root 4096 7月  13 11:19 hello

用户管理案例

1、创建用户kawhi和www

#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	user{'abc':
		name => kawhi,
		#present:必须存在
		ensure => present,
		uid => 1024;
	}
	user{'bcd':
		name => www,
		ensure => present,
		uid => 1056;
	}
}
#等待60s,agent自动拉取资源
#查看执行情况
[root@puppet-agent ~]# id kawhi
uid=1024(kawhi) gid=1024(kawhi) 组=1024(kawhi)
[root@puppet-agent ~]# id www
uid=1056(www) gid=1056(www) 组=1056(www)

软件安装资源案例

1、安装nginx

#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	package{'nginx':
		ensure => "installed",
	}
}
#查看执行情况
[root@puppet-agent ~]# which nginx
/usr/sbin/nginx

:当软件有依赖包时,卸载会报错

服务资源管理案例

1、启动nginx服务并设置开机启动

#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	service{'nginx':
		ensure => running,
		enable => true,
	}
}
#查看执行结果
[root@puppet-agent ~]# netstat -tnlp |grep 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      4240/nginx          
tcp        0      0 :::80                       :::*                        LISTEN      4240/nginx

2、关闭nginx服务并停止开机启动

#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	service{'nginx':
		ensure => stopped,
		enable => false,
	}
}
#查看执行结果
[root@puppet-agent ~]# netstat -tnlp |grep 80

命令执行资源案例

1、执行脚本

#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	exec{
		#脚本所在的绝对路径
		"/tmp/create_file.sh":
		#脚本执行的目录
		cwd => "/tmp",
		user => root,
		#执行命令的搜索路径
		path => ["/usr/bin","/usr/sbin","/bin","bin/sh"],
	}
}
#编写脚本内容
[root@puppet-agent ~]# vi /tmp/create_file.sh 
#!/bin/bash
touch file1
echo 'abc' > file1
#查看执行情况
[root@puppet-agent ~]# cat /tmp/file1 
abc

计划任务资源案例

1、添加计划任务

#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	cron{
		"ntpdate":
		command => "usr/bin/ntpdate ntp1.aliyun.com",
		user => root,
		#设定小时
		hour => 0,
		#设定分钟
		minute => 5,
		#设定月份 month 范围 1-12
		#设定星期 weekday 范围 0-7(0为周日)
		#设置天数 monthday 范围 1-31
	}
}
#查看执行结果
[root@puppet-agent ~]# crontab -e
# Puppet Name: ntpdate
5 0 * * * usr/bin/ntpdate ntp1.aliyun.com

2、删除计划任务

#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	cron{
		"ntpdate":
		command => "usr/bin/ntpdate ntp1.aliyun.com",
		user => root,
		hour => 0,
		minute => 5,
		ensure => absent,
	}
}
#查看执行结果
[root@puppet-agent ~]# crontab -e

应用:在agent安装vsftpd

#创建软件模块目录
#manifest目录是模块的功能代码目录
#files目录是资源目录
[root@puppet-master ~]# mkdir -pv /etc/puppet/modules/vsftpd/{manifests,files}
#编写模块核心文件
[root@puppet-master ~]# vi /etc/puppet/modules/vsftpd/manifests/init.pp
class vsftpd{
	#配置yum源
	yumrepo {"Server":
		descr => "Server repo",
		#需要提前在agent端挂载资源 
		baseurl => "file:///media/CentOS_7",
		gpgcheck => "0",
		enabled => "1";
	}
	#处理包
	package {"vsftpd":
		ensure => installed,
		#关联yum资源时首字母需要大写
		require => Yumrepo["Server"];
	}
	#配置服务
	service {"vsftpd":
		#开启服务
		ensure => running;
	}
}
#调用模块
#编辑配置文件
[root@puppet-master ~]# vi /etc/puppet/manifests/site.pp
node 'puppet-agent.jun.cc'{
	include vsftpd
}
#检查配置语法
[root@puppet-master ~]# puppet parser validate /etc/puppet/modules/vsftpd/manifests/init.pp
[root@puppet-master ~]# puppet parser validate /etc/puppet/manifests/site.pp
#agent端手动拉取资源
[root@puppet-agent ~]# puppet agent -t
#查看服务状态
[root@puppet-agent ~]# netstat -tnlp |grep vsftpd
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      2404/vsftpd