一、什么是puppet
puppet是一个为实现数据中心自动化管理而设计的配置管理软件。是一种Linux、Unix平台的集中配置管理系统,使用ruby语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
二、Puppet的工作模式
Puppet是一个C/S架构的配置管理工具,在中央服务器上安装puppet-server软件包(被称作Puppetmaster)。在需要管理的目标主机上安装puppet客户端软件(被称作PuppetClient)。当客户端连接上Puppetmaster后,定义在Puppetmaster上的配置文件会被编译,然后在客户端上运行。每个客户端默认每半个小时和服务器进行一次通信,确认配置信息的更新情况。如果有新的配置信息或者配置信息已经改变,配置将会被重新编译并发布到各客户端执行。也可以在服务器上主动触发一个配置信息的更新,强制各客户端进行配置。如果客户端的配置信息被改变了,它可以从服务器获得原始配置进行校正。puppet的服务器端保存着所有的对客户端服务器的配置代码,在puppet里面叫做manifest(清单). manifest(清单)存放在puppetmaster 服务端。puppet客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理,用户管理和文件管理等等。
1)工作流程
- 客户端puppet调用facter(facter是通过ssl加密收集及检测分析客户端配置信息的一个工具),facter探测出主机的一些变量,如主机名,内存大小,ip地址等。Puppet把这些信息通过ssl连接发送到服务器器端
- 服务器端的puppetmaster通过facter工具分析检测客户端的主机名,然后找到项目主配置文件mainfest里面对应的node配置,并对该部分内容进行解析。Facter发送过来的信息可以作为变量处理,node牵扯到的代码才解析,其他没牵涉的代码不解析,解析分为几个阶段,首先进行语法检查,如果语法没错,就继续解析,解析的结果生成一个中间的“伪代码”,然后把伪代码发送给客户端。
- 客户端接收到伪代码,并执行,客户端把执行的结果发送给服务器。
- 服务器把客户端的执行结果写入日志。
- Puppet工作过程有以下两点值得注意:
- 为了保证安全,client和master之间是基于ssl和证书的,只有经master证书认证的client可以与master通信。
- Puppet会让系统保持在人们所期望的某种状态并一直维持下去,例如:检测某个文件并保证其一直存在,保证ssh服务始终开启,如果文件被删除了或者ssh服务被关闭了,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。
三、环境
主机 | os | IP地址 | 主要软件 |
puppetmaster | centos6.5 | 192.168.1.1 | facter-1.7.1.tar.gz puppet-2.7.21.tar.gz |
puppetclient1 | centos6.5 | 192.168.1.2 | facter-1.7.1.tar.gz puppet-2.7.21.tar.gz |
puppetclient2 | centos6.5 | 192.168.1.3 | facter-1.7.1.tar.gz puppet-2.7.21.tar.gz |
NTPserver | centos6.5 | 192.168.1.4 | ntp-4....... |
四、实战
1)准备环境
- 配置ip地址实现互通
- 配置hosts文件(修改/etc/hosts文件,服务器多的时候需要搭建dns服务器来实现服务通过主机名进行通信,这里就以/etc/hosts文件来实现)
- 配置ntp实现时间同步
2)安装puppet(注:在puppetmaster)
- 安装ruby(puppet就是基于ruby语言开发的,所以需要安装ruby)
-
yum -y insatll compat-readline5 ruby ruby -v #查看版本
安装facter和puppet
-
#安装facter tar zxf facter... -C /usr/src cd /usr/src/facter.. ruby install.rb #安装puppet useradd -s /sbin/nologin puppet tar zxf puppet... -C /usr/src cd /usr/src/puppet... ruby install.rb
复制配置文件
-
cd /usr/src/puppet... cp conf/redhat/fileserver.conf /etc/puppet cp conf/redhat/puppet.conf /etc/puppet cp conf/redhat/server.init /etc/init.d/puppetmaster chmod +x /etc/init.d/puppetmaster chkconfig --add puppetmaster chkconfig puppetmaster on 注:#auth.conf --> puppet server对client访问的ACL配置文件 #fileserver.conf --> puppet server 作为文件服务器的ACL配置文件 #manifests --> Puppet脚本主文件目录,至少需要包含site.pp文件,site.pppuppet主文件(入口文件)。所有要在服务器上执行的操作都写在这种.pp结尾的文件中。 #puppet.conf --> Puppet服务器配置文件
创建节点目录和模板目录
-
mkdir /etc/puppet/manifests mkdir /etc/puppet/modules chown -R puppet /etc/puppet/modules
修改配置文件,并启动
vim /etc/puppet/puppet.conf
【main】添加:modulepath = /etc/puppet/modules:/usr/share/puppet/modules #配置服务器模块路径
service puppetmaster start
netstat -anpt | grep ruby
tcp 0 0 0.0.0.0:8140 0.0.0.0:* LISTEN 2306/ruby
#puppetmaster监听端口为8140
2)安装puppetclient(注puppetclient1和puppetclient2一样)
#安装ruby
yum -y insatll compat-readline5 ruby
#安装facter
tar zxf facter... -C /usr/src
cd /usr/src/facter..
ruby install.rb
3安装puppet
useradd -s /sbin/nologin puppet
tar zxf puppet... -C /usr/src
cd /usr/src/puppet...
ruby install.rb
#配置puppet
cd /usr/src/puppet...
cp conf/redhat/puppet.conf /etc/puppet
cp conf/redhat/client.init /etc/init.d/puppetclient
chmod +x /etc/init.d/puppetclient
chkconfig --add puppetclient
chkconfig puppetclient on
#修改配置文件
vim /etc/puppet/puppet.conf
【main】添加: server = master.benet.com #设置master服务器的域名
3)注册服务器(分别在puppetclient1和puppetclient2上进行注册)
puppet agent --server=master.benet.com --no-daemonize --verbose
4)在puppetmaster实现服务器统一匹配
-
puppet cert --list 查看申请注册客户端 puppet cert sign --all 将未注册的客户端进行注册 ls -l /var/lib/puppet/ssl/ca/signed
注:以上puppet的搭建就完成了。接下来我们一起举几个例子理解一下吧!
- 例子1 目标:为了保护linux的ssh端口爆破,批量修改客户端的sshd端口,将22号端口改为9922,并实现重启sshd服务的工作。
-
需要明确几点:
①需确定openssh软件包安装 (openssl openssl-devel)
②需确定存在ssh的配置文件
③确定sshd的服务是系统服务
创建ssh模块,模块的目录为ssh,模块下有三个文件分别是:manifests、templates、files。 manifest里面必须包含一个init.pp文件,这是该模块的的初始(入口)文件,导入一个模块的时候需要从init.pp开始执行,可以把所有的代码都写入到这个文件中,也可以分成多个.pp文件,init在去包含其他文件,定义class类名时必须是ssh,这样才能实现调动;files目录是该模块的发布目录,puppet提供了一个文件分割机制,类似rsync的模块。templates目录包含erb模块文件、这个和file资源的templates属性有关(很少使用)master端
- 创建目录(注:在master)
-
mkdir -p /etc/puppet/manifests/nodes mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files} mkdir /etc/puppet/modules/ssh/files/ssh chown -R puppet /etc/puppet/modules
创建模块(注:在master)
-
cd /etc/puppet/modules/ssh/manifests vim install.pp //确定客户端安装了ssh服务 class ssh::install { package{ "openssh": ensure => present, } } vim config.pp #这个文件的内容主要是定义,发布的配置文件权限以及调用ssh::install检查client是否安装了ssh服务,以及调用ssh::service重新启动sshd服务。 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 } } vim service.pp class ssh::service{ service{ "sshd": ensure =>running, //确定sshd运行 hasstatus=>true, //puppet该服务支持status命令 hasrestart=>true, //puppet该服务支持status命令 enable=>true, //服务是否开机启动 require=>Class["ssh::config"] //确认config.pp调用 } } vim init.pp #模块主配置文件 class ssh{ include ssh::install,ssh::config,ssh::service }
- 建立服务器端ssh统一维护文件;(由于服务器端和客户端的sshd_config文件默认一样,此时将服务器端/etc/ssh/sshd_config复制到模块默认路径。)
-
cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config
- 创建测试节点配置文件,并将ssh加载进去
-
vim /etc/puppet/manifests/nodes/ssh.pp node 'client1.benet.com' { include ssh } node 'client2.benet.com' { include ssh } vim /etc/puppet/manifests/site.pp #将测试节点载入puppet,修改site.pp import "nodes/ssh.pp"
修改服务器端维护的sshd_config配置文件
-
vim /etc/puppet/modules/ssh/files/ssh/sshd_config port 8922 #重启puppet service puppetmaster restart #客户端puppetclient1主动拉取 puppet agent -t
查看puppet的sshd的端口是否变为8922,如果变为8922说明ok
- 服务器推送同步(在puppetclient和puppetclient2)
-
vim /etc/puppet/puppet.conf #修改puppet主配置文件 listen = true #使puppet监听8139端口 vim /etc/puppet/auth.conf #修改puppet验证配置文件,定义权限 allow * #允许任何 service puppetclient start
再次把服务器的ssh配置文件端口改为8822 (在master)
-
vim /etc/puppet/modules/ssh/files/ssh/sshd_config port 8822 #master服务器推送: puppet kick client2.benet.com
查看puppetclient1和2的sshd的端口是否变为8822,如果变为8922说明ok