工作原理
Puppet 的目的是让管理员只集中于要管理的目标, 而忽略实现的细节 Puppet 既可以在单机上使用, 也可以 c/s 使用, 在大规模使用 puppet 的情况下, 通常使用 c/s 结构, 在这种结构中 puppet 客户端只运行 puppetclient,puppet 服务器只运行 puppetmaster
.
.
工作流程
1)客户端 puppet 调用 facter(facter 是通过 ssl 加密收集及检测分析客户端配置信息的一个工具),facter 探测出主机的一些变量, 如主机名, 内存大小, ip 地址等 Puppet 把这些信息通过 ssl 连接发送到服务器器端
2)服务器端的 puppetmaster 通过 facter 工具分析检测客户端的主机名, 然后找到项目主配置文件 mainfest 里面对应的 node 配置, 并对该部分内容进行解析 Facter 发送过来的信息可以作为变量处理, node 牵扯到的代码才解析, 其他没牵涉的代码不解析, 解析分为几个阶段, 首先进行语法检查, 如果语法没错, 就继续解析, 解析的结果生成一个中间的伪代码, 然后把伪代码发送给客户端
3)客户端接收到伪代码, 并执行, 客户端把执行的结果发送给服务器
4)服务器把客户端的执行结果写入日志
.
.
Puppet 工作过程有以下两点值得注意:
1)为了保证安全, client 和 master 之间是基于 ssl 和证书的, 只有经 master 证书认证的 client 可以与 master 通信
2)Puppet 会让系统保持在人们所期望的某种状态并一直维持下去, 例如: 检测某个文件并保证其一直存在, 保证 ssh 服务始终开启, 如果文件被删除了或者 ssh 服务被关闭了, puppet 下次执行时(默认 30 分钟), 会重新创建该文件或者启动 ssh 服务
.
.
安装 puppet 的实验步骤
搭建 puppetmaster
搭建 puppetclient
配置测试节点
客户端主动拉取
服务器推送
.
.
搭建 puppetmaster
规划服务器主机名(小规模可以修改 / etc/hosts 文件, 服务器多的时候我们需要搭建 dns 服务器来实现服务通过主机名进行通信, 这里就以 / etc/hosts 文件来实现)
- .
- (puppetmaster)
- .
- [root@master /]# vim /etc/sysconfig/network
- HOSTNAME=master.itzhushou.cn
- .
- [root@master /]# vim /etc/hosts
- 192.168.1.10 master.itzhushou.cn
- 192.168.1.20 client1.itzhushou.cn
- 192.168.1.30 client2.itzhushou.cn
- .
重启生效
- [root@master /]# reboot
- .
- (NTP)
- [root@master /]# rpm -q ntp
- [root@master /]# vim /etc/ntp.conf (添加以下两行)
- server 127.127.1.0
- fudge 127.127.1.0 stratum 8
- .
启动 ntp 服务并开启 iptables 例外
- [root@master /]# service ntpd start
- [root@master /]# chkconfig ntpd on
- [root@master /]# iptables -I INPUT -p udp --dport 123 -j ACCEPT
- [root@master /]# service iptables save
- .
- (puppetmaster)
- .
- [root@master /]# hostname
- .
在 puppetmaster 上面配置时间同步, 作为 ntp 的客户端
- [root@master /]# ntpdate 192.168.1.40
- [root@master /]# mount /dev/cdrom /media/
- [root@master /]# cd /media/
- [root@master /]# ls
- .
安装 ruby(puppet 就是基于 ruby 语言开发的, 所以需要安装 ruby)
- [root@master /]# yum -y install compat-readline5
- [root@master /]# yum -y install ruby
- .
安装完成之后检查版本
- [root@master /]# ruby -v
- [root@master /]#useradd -s /sbin/nologin puppet
- [root@master /]# cd /
- .
安装 facter(通过 facter 工具分析检测客户端传来的信息)
- [root@master /]# umount /dev/cdrom /media/
- [root@master /]# umount /dev/cdrom
- [root@master /]# mount /dev/cdrom /media/
- [root@master /]# cd /media/
- [root@master /]# ls
- [root@master /]# tar zxf facter-1.7.1.tar.gz -C /usr/
- [root@master /]# cd /usr/facter-1.7.1/
- [root@master /]# ruby install.rb
- .
安装 puppet
编译安装:
- [root@master /]# cd /media/
- [root@master /]# tar zxf puppet-2.7.21.tar.gz -C /usr/
- [root@master /]# cd /usr/puppet-2.7.21/
- [root@master /]# ruby install.rb
- .
复制配置文件
- [root@master /]# cp conf/redhat/fileserver.conf /etc/puppet/
- [root@master /]# cp conf/redhat/puppet.conf /etc/puppet/
- [root@master /]# cp conf/redhat/server.init /etc/init.d/puppetmaster
- .
修改文件属性并创建 puppet 主目录:
- [root@master /]# chmod +x /etc/init.d/puppetmaster
- [root@master /]# mkdir /etc/puppet/manifets
- [root@master /]# mkdir /etc/puppet/manifests
- [root@master /]# mkdir /etc/puppet/modules
- .
puppet 服务证书请求与签名
关闭防火墙(也可开例外)
- Service iptables stop
- [root@master /]# service iptables stop
- .
在 [main] 标题下添加一行: 配置服务器模块路径
- [root@master /]# vim /etc/puppet/puppet.conf
- modulepath = /etc/puppet/modules:/usr/share/puppet/modules
- .
启动 puppet 主程序
- [root@master /]# service puppetmaster start
- [root@master /]# netstat -anpt | grep ruby
- .
配置防火墙
- [root@master /]# iptables -I INPUT -p tcp --dport 8140 -j ACCEPT
- [root@master /]# service iptables save
- .
- .
- (puppetclient1)
- .
搭建 puppetclient
规划服务器主机名
- [root@master /]# vim /etc/sysconfig/network
- HOSTNAME=client1.itzhushou.cn
- .
- [root@master /]# vim /etc/hosts
- 192.168.1.10 master.itzhushou.cn
- 192.168.1.20 client1.itzhushou.cn
- 192.168.1.30 client2.itzhushou.cn
- .
- [root@master /]# reboot
- [root@master /]# hostname
- .
服务器时间同步
- [root@master /]# ntpdate 192.168.1.40
- .
安装 ruby
- [root@master /]# mount /dev/cdrom /media/
- [root@master /]# yum -y install compact-readline5 reby
或者 rpm -ivh compact-readline5......
.
安装 facter
- [root@master /]# cd /
- [root@master /]# umount /dev/cdrom /media/
- [root@master /]# mount /dev/cdrom /media
- [root@master /]# cd /media/
- [root@master /]# tar zxf facter-1.7.1.tar.gz -C /usr/
- [root@master /]# cd /usr/facter-1.7.1/
- [root@master /]# ruby install.rb
- .
安装 puppet
- [root@master /]# cd /media/
- [root@master /]# tar zxf puppet-2.7.21.tar.gz -C /usr/
- [root@master /]# cd /usr/puppet-2.7.21/
- [root@master /]# ruby install.rb
- .
复制文件并设置执行权限
- [root@master /]# cp conf/redhat/puppet.conf /etc/puppet/
- [root@master /]# cp conf/redhat/client.init /etc/init.d/puppetclient
- [root@master /]# chmod +x /etc/init.d/puppetclient
- [root@master /]# service iptables stop
- .
puppet 服务证书请求签名
- [root@master /]# vim /etc/puppet/puppet.conf
- server = /master.itzhushou.cn
- .
注意: puppetclient2 的配置过程与 puppetclient1 类似, 主机名改为 client2.itzhushou.cn 即可, 其他都一样
.
注册服务器
分别在 puppetclient1 和 puppetclient2 上进行注册, 执行的命令一样
[root@master /]# puppet agent --server=master.itzhushou.cn --no-daemonize --verbose
上面会一直等待, 可以按 ctrl+c 结束, 但是服务器上已经有申请信息了
- .
- .
- (puppetmaster)
- .
可以执行 puppet cert --list 查看申请注册客户端
将未注册的客户端进行注册 Puppet cert sign --all
- [root@master /]# puppet cert --list
- [root@master /]# puppet cert sign --all
- .
可以通过目录去查看已经注册的客户端(看到下面的信息说明注册成功了)
- [root@master /]# ll /var/lib/puppet/ssl/ca/signed/
- .
.
.
应用案例
1 配置一个测试节点
节点信息:/etc/puppet/manifests/nodes
模块信息: /etc/pupppet/modules
实验目标: 为了保护 linux 的 ssh 端 ××× 破, 批量修改客户端的 sshd 端口, 将 22 号端口改为 9922, 并实现重启 sshd 服务的工作
想完成以上几点, 需要明确几点:
需确定 openssh 软件包安装
需确定存在 ssh 的配置文件
确定 sshd 的服务是系统服务
创建 ssh 模块, 模块的目录为 ssh, 模块下有三个文件分别是: manifeststemplatesfiles
manifest 里面必须包含一个 init.pp 文件, 这是该模块的的初始 (入口) 文件, 导入一个模块的时候需要从 init.pp 开始执行, 可以把所有的代码都写入到这个文件中, 也可以分成多个. pp 文件, init 在去包含其他文件, 定义 class 类名时必须是 ssh, 这样才能实现调动
files 目录是该模块的发布目录, puppet 提供了一个文件分割机制, 类似 rsync 的模块
templates 目录包含 erb 模块文件这个和 file 资源的 templates 属性有关(很少使用)
master 端
- .
- [root@master /]# rpm -q openssh
- .
创建必要的目录
- [root@master /]# mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files}
- [root@master /]# mkdir /etc/puppet/manifests/nodes
- [root@master /]# mkdir /etc/puppet/modules/ssh/files/ssh
- [root@master /]# chown -R puppet /etc/puppet/modules/
- [root@master /]# ll /etc/puppet/modules/ssh/
- .
创建模块配置文件 install.pp
Vi /etc/puppet/modules/ssh/manifests/install.pp
输入以下信息(首先确定客户端安装了 ssh 服务)
- .
- [root@master /]# vim /etc/puppet/modules/ssh/manifests/install.pp
- class ssh::install{
- package{ "openssh":
- ensure => present,
- }
- }
- .
注意: present 是以, 结尾, 由于配置的是 ssh 服务, 所以模块名为 ssh, 如果配置 http, 则模块名为 http
.
创建模块配置文件 config.php
- [root@master /]# 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",
- require => Class["ssh::install"],
- notify => Class["ssh::service"],
- }
- }
- .
命令解释
- 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"], // 调用 ssh::install 确定
openssh 已经安装
- notify => Class["ssh::service"], // 如果 config.pp 发生变化通知 service.pp
- }
- }
这个文件的内容主要是定义, 发布的配置文件权限以及调用 ssh::install 检查 client 是否安装了 ssh 服务, 以及调用 ssh::service 重新启动 sshd 服务
.
创建模块配置文件 service.pp
- [root@master /]# 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"]
- }
- }
- .
命令解释
- class ssh::service{
- service{ "sshd":
- ensure =>running, // 确定 sshd 运行
- hasstatus=>true, //puppet 该服务支持 status 命令, 即类似 service
sshd status 命令
hasrestart=>true, //puppet 该服务支持 status 命令, 即类似 service
sshd status 命令
- enable=>true, // 服务是否开机启动
- require=>Class["ssh::config"] // 确认 config.pp 调用
- }
- }
- .
创建模块主配置文件 init.pp
- [root@master /]# vim /etc/puppet/modules/ssh/manifests/init.pp
- class ssh{
- include ssh::install,ssh::config,ssh::service
- }
- .
上面一共建立了 4 个文件, 确保建立好
- [root@master /]# ll /etc/puppet/modules/ssh/manifests/
- .
建立服务器端 ssh 统一维护文件
由于服务器端和客户端的 sshd_config 文件默认一样, 此时将服务器端 / etc/ssh/sshd_config 复制到模块默认路径
- [root@master /]# cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/
- [root@master /]# chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config
- .
创建测试节点配置文件, 并将 ssh 加载进去
Vi /etc/puppet/manifests/nodes/ssh.pp, 输入以下信息
- [root@master /]# vim /etc/puppet/manifests/nodes/ssh.pp
- node client1.itzhushou.cn {
- include ssh
- }
- node client2.itzhushou.cn {
- include ssh
- }
- .
将测试节点载入 puppet, 即修改 site.pp
Vi /etc/puppet/manifests/site.pp, 输入以下信息:
- [root@master /]# vim /etc/puppet/manifests/site.pp
- import "nodes/ssh.pp"
- .
修改服务器端维护的 sshd_config 配置文件
- [root@master /]# vim /etc/puppet/modules/ssh/files/ssh/sshd_config
- Port 9922
- .
重新启动 puppet
- [root@master /]# /etc/init.d/puppetmaster restart
- (puppetclient1)
配置客户端主动拉取
一般在小规模自动化群集中, 如代码上线需要重新启动服务时, 为了防止网站暂时性无法访问的问题, 每台客户端需要运行一次 puppet agent -t 命令, 所以选择模式时需要根据规模的大小来决定, 一般运维工程师 puppet 服务器到各客户端建立 ssh 信任, 然后自定义脚本, ssh 让客户端批量执行 puppet 命令同步
在客户端 puppetclient1 上执行命令:
- [root@master /]# puppet agent -t
- .
然后在客户端上查看 ssh 配置文件的端口是否改变, 并查看端口运行状态:
- [root@master /]# vim /et/ssh/sshd_config
- [root@master /]# netstat -anpt | grep ssh
- .
.
服务器推送同步
1 修改 puppet 主配置文件
在客户端上执行下面命令:
Vi /etc/puppet/puppet.conf, 在最后添加一行, 使 puppet 监听 8139 端口
- [root@master /]# vim /etc/puppet/puppet.conf
- listen= true
- .
修改 puppet 验证配置文件, 定义权限
在客户端上执行: vim /etc/puppet/auth.conf
在最后一行添加下面的内容
- [root@master /]# vim /etc/puppet/auth.conf
- allow *
- .
启动 puppet 客户端
- [root@master /]# /etc/init.d/puppetclient start
- .
- .
- (puppetmaster)
- .
再次把服务器的 ssh 配置文件端口改为 9933(换一个试试)
.
服务器推送给客户端
- [root@master /]# puppet kick client1.itzhushou.cn
- .
在客户端查看端口是否改变
(puppetclient1)
来源: http://www.bubuko.com/infodetail-2518384.html