该工具基于ruby语言开发,相比较于Ansble和SaltStack它的安全性会高一些,它通过加密认证进行通信
工作流程:
1.客户端puppet调用facter搜集变量,通过SSL发送给服务器
2.服务器端的puppetmaster通过facter工具分析检测客户端的信息,配置生成伪代码,返给客户端
3.客户端接受伪代码并执行,反馈给服务器结果
4.服务器将执行结果写入日志
puppet管理工具需要通过puppetmaster和puppetagent这两个程序来进行通信管理,管理端和客户端需要通过安装不同的软件来进行管理和应用
1.查看资源
puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]
-l:列出所有资源类型
-s:显示指定类型的简要帮助信息
-m:显示指定类型的元参数,一般与-s一同使用
2.group(用户组管理)
name:组名
gid:定义GID值
system:是否为系统组,true OR false
ensure:状态,present/absent
members:成员用户
3.user(用户管理)
name:用户名
uid: 定义UID值
gid:基本组ID
groups:附加组
comment:注释
expiry:过期时间
home:用户的家目录
shell:默认shell类型
system:是否为系统用户
ensure:状态,present/absent
password:加密后的密码
4.package(软件包管理)
ensure:installed/present/latest/absent
name:包名
source:程序包来源
provider: 指明安装方式
5.service(管理服务的状态)
ensure:服务状态,值有true(running)和false(stopped)
enable:是否开机自动启动,值有true和false
name:服务名称
path:服务脚本路径,默认为/etc/init.d/下
start:定制启动命令
stop:定制关闭命令
restart:定制重启命令
status:定制状态
6.file(文件管理)
ensure:目标状态,absent/present/file/directory/link
file:类型为普通文件,其内容由content属性生成或复制由source属性指向的文件路径来创建
link:类型为符号链接文件,必须由target属性指明其链接的目标文件
directory:类型为目录,可通过source指向的路径复制生成,recurse属性指明是否递归复制
path:文件路径
source:源文件
content:文件内容
target:符号链接的目标文件
owner:定义文件的属主
group:定义文件的属组
mode:定义文件的权限
atime/ctime/mtime:时间戳
7.exec(执行shell环境命令,通常为外部命令)
command:要运行的命令
cwd:指定运行该命令的目录
creates:文件路径,仅此路径表示的文件不存在时,command方才执行
user/group:运行命令的用户身份
path:指定命令执行的搜索路径
onlyif:此属性指定一个命令,此命令正常(退出码为0)运行时,当前command才会运行
unless:此属性指定一个命令,此命令非正常(退出码为非0)运行时,当前command才会运行
refresh:重新执行当前command的替代命令
refreshonly:仅接收到订阅的资源的通知时方才运行
8.cron(定义周期性任务)
command:要执行的任务
ensure:目标状态,present/absent
hour:时
minute:分
monthday:日
month:月
weekday:周
user:以哪个用户的身份运行命令(默认为root)
target:添加为哪个用户的任务
name:cron job的名称
9.notify(调试输出)
message:记录的信息
name:信息名称
环境:
192.168.11.25
192.168.11.26、192.168.11.27
准备配置工作
1.修改hostname
192.168.11.25:hostnamectl set-hostname master
192.168.11.26:hostnamectl set-hostname client1
192.168.11.27:hostnamectl set-hostname client2
2.修改hosts文件把三台机器的地址解析添加进去
vim /etc/hosts
192.168.11.25 master
192.168.11.26 client1
192.168.11.27 client2
3.配置ntp服务器,使三台服务器时间同步
master:
yum -y install ntp
vim /etc/ntp.conf
systemctl start ntpd
ntpdate time1.aliyun.com
client:
yum -y install ntpdate
ntpdate master
安装puppet工具
1.在master上安装puppet-server启动服务
yum -y install puppet-server
systemctl start puppetmaster
2.在两台client上安装puppet
yum -y install puppet
3.在两台client上进行认证
puppet agent --server=master --no-daemonize --verbose
这个时候在master上执行puppet cert --list可以进行查看认证请求
4.在master上同意请求
puppet cert sign --all
可以在master上执行ll /var/lib/puppet/ssl/ca/signed/查看生成的认证文件,路径注意看上个命令生成的路径
5.在两台client上修改配置文件
vim /etc/puppet/auth.conf
allow * #表示同意所有地址访问
vim /etc/puppet/puppet.conf
[main]
server = master #在[main]下添加master的名字
[agent]
listen = true #这个添加在最后一行,监听8139端口
6.在两台client上启动puppetagent服务
systemctl start puppetagent
1.创建模块目录
mkdir -pv /etc/puppet/modules/nginx/{manifests,files,templates}
mkdir /etc/puppet/manifests/nodes
chown -R puppet /etc/puppet/modules/
2.到/etc/puppet/manifests/目录下创建pp文件去调用nginx模块
vim nodes/test.pp
node 'client1'{
include nginx
}
node 'client2'{
include nginx
}
这里说明两个node分别后面就是两台client服务器的名字,都调用nginx模块,这里的模块可以理解为在/etc/puppet/modules/下创建的文件目录,下面可以放很多目录去写不同的模块,使不同的管理服务器可以调用不同的模块去完成不同群体部署,方便管理一个群集中不同的服务器
3.到/etc/puppet/manifests/目录下创建一个site.pp文件去把上面创建的node文件加载进去
vim site.pp
import "nodes/test.pp"
4.编写init.pp文件去配置自动安装nginx步骤
vim /etc/puppet/modules/nginx/manifests/init.pp
class nginx {
yumrepo { "nginx":
descr => "nginx repo",
baseurl => "http://nginx.org/packages/centos/\$releasever/\$basearch/",
gpgcheck => "0",
enabled => "1",
}
package{'nginx':
ensure => installed,
allow_virtual => false;
}
service{'nginx':
ensure => running,
hasrestart => true,
hasstatus => true,
enable => true,
}
#file{'index.html':
# ensure => file,
# path => '/var/www/html/index.html',
# source => 'puppet://modules/nginx/index.html',
#}
#exec { 'restart-nginx':
# command => "/usr/bin/systemctl restart nginx",
# refreshonly => true,
#}
}
注意:执行的步骤都是从init.pp文件为最初执行的入口,当然你也可以创建几个.pp文件把这里的步骤分为几步,然后在init.pp文件中用clude方法把这几个方法加载进去依次执行
5.在需要安装的服务器上执行拉取命令
puppet agent -t
比如我在client1上执行命令,全部为绿色没有报错则为成功(如下图)