About
系统配置管理、运维自动化工具。
2005 年由 Luke Kanies 开发——使用 Ruby 语言。
工作原理
Puppet 是 C/S 架构。配置文件保存在服务器端,客户端定期下载并按要求配置系统。
为了安全,客户端和服务器端通信使用 SSL 证书,服务器端给客户端颁发证书后,客户端就能从服务器端获取配置并执行任务。
安装
两台主机:服务器端 (b2)、客户端 (b6)。
CentOS 7 的所有机器都要先安装 Puppet 的源:
yum install https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm
服务器端:
yum install puppet-server # 3.8.7-1.el7
systemctl start puppetmaster # 启动服务
systemctl status puppetmaster # 确认状态
systemctl enable puppetmaster # 开机启动
systemctl stop firewalld # 暂时把防火墙关了
客户端:
yum install puppet
systemctl enable puppet
systemctl stop firewalld # 暂时把防火墙关了
在 /etc/sysconfig/puppet
文件中设置 Server 主机名:
PUPPET_SERVER=b2
在 /etc/puppet/puppet.conf
文件中设置 Server 主机名:
[agent]
server=b2
启动服务:
systemctl start puppet
systemctl status puppet # 确认状态
systemctl enable puppet # 开机启动
手动强制执行任务:
$ puppet agent -t
Exiting; no certificate found and waitforcert is disabled # 正常,要等服务器验证通过
服务器端:
$ puppet cert list
"b6" (SHA256) ... # 待认证的主机
$ puppet cert sign b6 # 分配证书 (从 request/ 移到了 signed/)
安装到这里就完成了,接下来可以给 Server 布置一些任务,比如给客户端安装一些工具、创建一些账户等等。
任务测试
服务器端:
创建任务文件 /etc/puppet/manifests/site.pp
(文件名不能变):
node 'b6' {
include example
}
class example {
package { ["nmap","telnet","traceroute"]:
ensure => latest,
allow_virtual => false,
}
}
重启服务:
systemctl restart puppetmaster
客户端:
手动执行任务:
puppet agent -t
客户端默认每 30分钟 (m) 到 Server 端更新一次配置,如果要调整该时间,编辑 /etc/puppet/puppet.conf
文件:
[agent]
runinterval=30s # 为了测试设短一点。可选单位有 s|m|h|d|y,0 表示立即执行。
重启服务:
systemctl restart puppet
服务器端:
编辑任务,再多加一个包,重启服务,等 30s,客户端应该就安装好这个包了。
配置文件
/etc/sysconfig/puppet
/etc/puppet/
|-- auth.conf
|-- fileserver.conf # (服务器端)
|-- manifests/ # 任务 (服务器端)
|-- modules/
`-- puppet.conf
/var/lib/puppet/ssl # 证书目录 (服务器端)
命令
# 客户端
puppet agent -t # 测试
puppet agent -t --debug # 测试,打印更多输出
puppet agent -t --debug --noop # 测试,不真的执行
puppet agent --no-daemonize --verbose --onetime
systemctl status puppet # 查看任务执行时的报错
证书相关:
# 服务器端
puppet cert list # 查看认证请求
puppet cert sign HOSTNAME # 通过认证、颁发证书
模块相关 (https://forge.puppet.com/):
# 服务器端
puppet module install NAME
puppet module search STRING
puppet module list # 已安装的模块
任务
创建账户、分组
# 创建用户 (无 HOME 目录)
user {"test":
uid=>2000,
# gid=>2000, # CentOS 7 不需要,默认 uid=gid。要使用该配置就必须先创建该分组。
home=>"/home/test",
shell=>"/bin/bash";
}
# 删除用户
user {"test":
ensure=>"absent",
}
# 创建用户 (有 HOME 目录)
user {"test":
ensure=>"present",
managehome=>true,
groups=>wheel, # 加入用户组
}
# 创建分组
group {"tmp":
ensure=>"present",
gid=>3000,
}
group {"tmp":
ensure=>"absent",
}
配置仓库、安装包
yumrepo{"epel7":
descr=>"163repo",
baseurl=>"http://mirrors.163.com/centos/7/os/x86_64/",
gpgcheck=>"0",
enabled=>"1";
}
package {"puppet":
ensure=>installed,
require=>Yumrepo["puppetlabs"] # puppetlabs 源是依赖,必须存在
}
周期任务
cron {"logrotate":
command=>"/usr/sbin/logrotate",
user=>root,
hour=>2, # 每 2 小时执行一次
minute=>0
}
cron {"logrotate":
command=>"/usr/sbin/logrotate",
user=>root,
hour=>['2-4'], # 第 2-4 小时内,每 10 分钟执行一次
minute=>'*/10'
}
cron {"ntpdate":
command=>"/usr/sbin/ntpdate 192.168.0.1",
user=>root,
minute=>'*/5', # 每5分钟执行一次
require=>Package["crontabs"]; # 依赖的包,必须先安装
}
执行命令
多个 exec
的资源名可以相同。
exec {"squid":
command => "/usr/local/sbin/squid",
path => "/usr/local/sbin/",
}
exec {"logrotate":
path => "/usr/bin:/usr/sbin:/bin",
onlyif => "test `du /var/log/messages | cut -f1` -gt 100000" # 执行命令的条件
}
创建文件
file {"/etc/aliases":
source => "puppet://server/module/aliases"
}