了解Puppet
一、案例概述
作为一名系统管理员,维护服务器正常运行是最基本的职责。在管理几台到几十台服务器时,大部分管理员喜欢写自己的小工具来维护。但是随着服务器数量的增多, 任务量也逐渐增加,这时就需要简洁的、强大的框架来完成系统管理任务。 为实现这一目的, 引入一批工具。这批工具是“可编程”的,系统管理员只需要为这批工具写上几行“代码”,它便会自动完成所有的工作,Puppet 就是这批运维自动化工具中的其中一种。在一些大型互联网企业中, Puppet 运维自动化工具管理着几百甚至上千台服务器,它可以针对多台服务器进行统一操作,如部署统一软件、进行统 一上线维护等,而且能够快速完成上线部署,减少人力并降低人力误操作风险。
二、案例前置知识点
2.1 Puppet 工作原理
Puppet 的目的是让管理员只集中于要管理的目标,而忽略实现的细节。Puppet 既可以在单机上使用,也可以以 C/S 结构使用。在大规模使用 Puppet 的情况下,通常使用 C/S 结构。在这种结构中 Puppet 客户端只运行 Puppet Client, Puppet 服务器端只运行 Puppet Master。
2.2 Puppet 工作流程
-
户端 Puppet 调用 Facter 工具( Facter 是通过 SSL 加密收集及检测分析客户端配置信息的一个工具),Facter 探测出主机的一些变量,如主机名、内存大小、 IP 地址等。Puppet 把这些信息通过 SSL 连接发送到服务器端。
-
服务器端的 Puppet Master 通过 Facter 工具分析检测客户端的主机名, 然后找到项目主配置文件 manifest 里面对应的 node 配置, 并对该部分内容进行解析。 Facter 发送过来的信息可以作为变量处理, node 牵涉到的代码才解析, 其他没牵涉的代码不解析。解析分为几个阶段,首先进行语法检查。如果语法没错,就继续解析 。解析的结果生成一个中间的“伪代码”,然后把伪代码发给客户端。
-
客户端接收到“伪代码”并且执行,客户端把执行结果发送给服务器。
-
服务器端把客户端的执行结果写入日志。
2.3 Puppet 工作中的注意事项
1.为了保证安全,Client 和 Master 之间是基于 SSL 和证书的,只有经 Master 证书认证的 Client 才能与 Master 通信。
2.Puppet 会让系统保持在人们所期望的某种状态并一直维持下去。例如检测某个文件并保证其一直存在,保证 SSH 服务始终开启,如果文件被删除了或者 SSH 服务被关闭了,Puppet 下次执行时(默认 30 分钟),会重新创建该文件或者启动 SSH 服务。
部署Puppet并创建SSH服务
资源配置
操作系统 | 配置 | 主机名/IP | 软件 |
---|---|---|---|
CentOS 7.9 | 2C2G | master.puppet.com | puppet-server |
CentOS 7.9 | 2C2G | client01.puppet.com | puppet |
CentOS 7.9 | 2C2G | client02.puppet.com | puppet |
一、基础环境
1.1 关闭防火墙
systemctl stop firewalld systemctl disable firewalld
1.2 关闭selinux
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config reboot
1.3 修改主机名
hostnamectl set-hostname master.puppet.com hostnamectl set-hostname client01.puppet.com hostnamectl set-hostname client02.puppet.com
1.4 配置hosts 映射
cat >> /etc/hosts << EOF 172.16.10.10 master.puppet.com 172.16.10.11 client01.puppet.com 172.16.10.12 client02.puppet.com EOF
1.5 时间同步
yum -y install chrony systemctl start chronyd chronyc sources -v
二、Puppet 安装与部署
-
安装 Puppet Master,从 官 网 Index of /el/7Server/products/x86_64 下 载 Puppet 源 puppetlabs-release-7-12.noarch.rpm 软件包,上传到 master.puppet.com 服务器上
2.1 安装puppet yum源
-
puppet服务端、客户端都要执行
## 上传 puppetlabs-release-7-12.noarch.rpm rpm -ivh puppetlabs-release-7-12.noarch.rpm
2.2 master节点,安装puppet服务端
yum -y install puppet-server systemctl start puppetmaster systemctl enable puppetmaster
2.3 client节点,安装并配置puppet客户端
yum -y install puppet ## 客户端修改配置文件。客户端都要执行 vim /etc/puppet/puppet.conf ##在[main]下面加上server这一行:指定master服务端主机名 server = master.puppet.com
2.4 客户端注册
# 客户端申请注册。客户端执行 puppet agent --server=master.puppet.com --no-daemonize --verbose ##执行后界面会停留在前端界面,待服务端同意申请后,可以使用 Ctrl+C 结束 # 服务端查看申请。服务端执行 puppet cert --list # 服务端同意申请。服务端执行 ##同意指定客服端申请 puppet cert sign client01.puppet.com ##同意全部客户端申请 puppet cert sign --all # 清理注册 puppet cert --clean client01.puppet.com # 注册成功后,可以通过目录去查看已经注册的客户端 ll /var/lib/puppet/ssl/ca/signed/
三、配置实例:部署shh服务
3.1 配置测试节点
# Master 需要使用的相关配置文件如下 # 节点信息:/etc/puppet/manifests/nodes/ # 模块信息:/etc/puppet/modules/ # Master 上创建需要的目录 mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files} mkdir /etc/puppet/modules/ssh/files/ssh mkdir /etc/puppet/manifests/nodes chown -R puppet modules/
3.2 配置模块配置文件 install.pp
vim /etc/puppet/modules/ssh/manifests/install.pp ##检测是否安装ssh服务(首先确定客户端安装 SSH 服务) class ssh::install{ package{"openssh": ensure => present, } }
3.3 配置模块配置文件 config.pp
vim /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", # 调用 install.pp 确定 ssh 已经安装 require => Class["ssh::install"], # 如果 config.pp 发生变化通知 service.pp notify => Class["ssh::service"], } }
3.4 创建模块配置文件 service.pp
vim /etc/puppet/modules/ssh/manifests/service.pp class ssh::service { service {"sshd": ensure=>running, hasstatus=>true, hasrestart=>true, enable=>true, require=>Class["ssh::config"] } }
3.5 创建模块主配置文件 init.pp
vim /etc/puppet/modules/ssh/manifests/init.pp class ssh{ include ssh::install,ssh::config,ssh::service }
3.5 建立服务器端 ssh 统一维护文件
# 复制服务器端/etc/ssh/sshd_config 文件到模块默认路径 cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/ chown -R puppet /etc/puppet/modules/ssh/files/ssh/
3.6 建立服务器端 ssh 统一维护文件
# 复制服务器端/etc/ssh/sshd_config 文件到模块默认路径 cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/ chown -R puppet /etc/puppet/modules/ssh/files/ssh/
3.7 创建测试节点配置文件
vim /etc/puppet/manifests/nodes/ssh.pp node 'client01.puppet.com'{ include ssh } node 'client02.puppet.com'{ include ssh }
3.8 将测试节点载入 Puppet,即修改 site.pp
vim /etc/puppet/manifests/site.pp import "nodes/ssh.pp"
3.9 修改服务端维护的sshd_config 配置文件
vim /etc/puppet/modules/ssh/files/ssh/sshd_config ## 取消注释并修改端口号为 2222 Port 9922 //取消注释并修改为 2222
3.10 重启 puppet master服务
# 查看目录文件层级 tree /etc/puppet/ # 重启 systemctl restart puppetmaster
3.11 配置同步
-
客户端主动拉取
# 在其中一台 client01.puppet.com 客户端上,执行以下操作从服务器端主动拉取 配置 puppet agent -t # 查看服务器 SSH 服务是否重启,端口是否生效 netstat -tunlp | grep ssh
-
服务端主动推送
-
当大规模部署时不可能在每台客户端都采用拉取动作,而此时用服务器推送模式反而更合理。
-
# 在客户端 client02.puppet.com 上做修改 # 修改 puppet 配置文件 vim /etc/puppet/puppet.conf ##最后一行添加以下内容 listen = true ## 使 Puppet 监听 8139 端口 # 修改验证配置文件 auth.conf 定义一些验证信息及访问权限 vim /etc/puppet/auth.conf ##最后一行添加以下内容 allow * # 启动 Puppet Agent 客户端 systemctl start puppetagent # 修改客户端 client02.puppet.com 的/etc/ssh/sshd_config 文件,将 Port 9922 还原成最初始状态,然后重启 sshd 服务 # 向 client02.puppet.com 节点推送配置 puppet kick client02.puppet.com # puppet kick -p 10 -host 客户端 #-p表示一批10个客户端推送 --host 推送给谁 puppet kick –d --host `cat puppet.txt`