本文共 6433 字,大约阅读时间需要 21 分钟。
一、什么是puppet
puppet是一个为实现数据中心自动化管理而设计的配置管理软件。是一种、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)工作流程
三、环境
主机 | 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)准备环境
2)安装puppet(注:在puppetmaster)
yum -y insatll compat-readline5 rubyruby -v #查看版本
安装facter和puppet
#安装factertar zxf facter... -C /usr/srccd /usr/src/facter..ruby install.rb#安装puppetuseradd -s /sbin/nologin puppettar zxf puppet... -C /usr/srccd /usr/src/puppet...ruby install.rb
复制配置文件
cd /usr/src/puppet...cp conf/redhat/fileserver.conf /etc/puppetcp conf/redhat/puppet.conf /etc/puppetcp conf/redhat/server.init /etc/init.d/puppetmasterchmod +x /etc/init.d/puppetmasterchkconfig --add puppetmasterchkconfig 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/manifestsmkdir /etc/puppet/moduleschown -R puppet /etc/puppet/modules
修改配置文件,并启动
vim /etc/puppet/puppet.conf【main】添加:modulepath = /etc/puppet/modules:/usr/share/puppet/modules #配置服务器模块路径service puppetmaster startnetstat -anpt | grep rubytcp 0 0 0.0.0.0:8140 0.0.0.0:* LISTEN 2306/ruby #puppetmaster监听端口为8140
2)安装puppetclient(注puppetclient1和puppetclient2一样)
#安装rubyyum -y insatll compat-readline5 ruby#安装factertar zxf facter... -C /usr/srccd /usr/src/facter..ruby install.rb3安装puppetuseradd -s /sbin/nologin puppettar zxf puppet... -C /usr/srccd /usr/src/puppet...ruby install.rb#配置puppetcd /usr/src/puppet...cp conf/redhat/puppet.conf /etc/puppetcp conf/redhat/client.init /etc/init.d/puppetclientchmod +x /etc/init.d/puppetclientchkconfig --add puppetclientchkconfig 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的搭建就完成了。接下来我们一起举几个例子理解一下吧!
需要明确几点:
①需确定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端
mkdir -p /etc/puppet/manifests/nodesmkdir -p /etc/puppet/modules/ssh/{manifests,templates,files}mkdir /etc/puppet/modules/ssh/files/sshchown -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 }
cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/sshchown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config
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
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