庖丁解Puppet之操做记实

庖丁解Puppet之
初级入门篇
node

 

系统环境:
python

软件包:
mysql

环境安装:
Puppet 是用ruby语言写的,因此要安装ruby环境,服务器端与客户端都要安装,我这的环境没有装ruby,因此用yum安装一下。要精细化安装的话,须要安装4个包。
[root@testsns ~]# yum –y install ruby*linux

精细化安装Ruby环境
1.puppet是基于ruby开发。因此要安装ruby语言环境。
找到相应版本对应的ruby的rpm包(下以redhat 5.4为例)
rpm –ivh ruby-libs-1.8.5-5.el5_2.3.i386.rpm
rpm –ivh ruby-1.8.5-5.el5_2.3.i386.rpm
2.Rdoc的安装。
若是须要查看帮助文档,须要安装此包。有一点特殊说明,此包在AS4上未找到相关的rpm。因此建议服务端使用5.0以上的版本。
rpm –ivh ruby-irb-1.8.5-5.el5_2.3.i386.rpm
rpm –ivh ruby-rdoc-1.8.5-5.el5_2.3.i386.rpmnginx

Server端安装:
一、时间同步
ntpdate time.nist.govsql

二、安装Facter用来获取客户端系统信息(如hostname,ip,OS-Version,fqdn等)
[root@testsns opt]# tar zxvf facter-1.6.5.tar.gz
[root@testsns opt]# cd facter-1.6.5
[root@testsns facter-1.6.5]# ruby install.rb
[root@testsns facter-1.6.5]# cd ..shell

[root@testsns opt]# tar zxvf puppet-2.6.13.tar.gz
[root@testsns opt]# cd puppet-2.6.13
[root@testsns puppet-2.6.13]# ruby install.rb
[root@testsns puppet-2.6.13]# cp conf/auth.conf /etc/puppet/
[root@testsns puppet-2.6.13]# cp conf/redhat/fileserver.conf /etc/puppet/
[root@testsns puppet-2.6.13]# cp conf/redhat/puppet.conf /etc/puppet/
[root@testsns puppet-2.6.13]# cp conf/redhat/server.init /etc/init.d/puppetmaster
[root@testsns puppet-2.6.13]# chmod +x /etc/init.d/puppetmaster
[root@testsns puppet-2.6.13]# chkconfig --add puppetmaster
[root@testsns puppet-2.6.13]# chkconfig puppetmaster on
[root@testsns puppet-2.6.13]# mkdir -p /etc/puppet/manifests
三、生成pupput用户
[root@testsns opt]# puppetmasterd --mkusers
四、启动
[root@testsns opt]# /etc/init.d/puppetmaster start

apache

Slave端安装:数组

一、时间同步缓存

ntpdate time.nist.gov

   和服务器端安装方法同样,先安装ruby环境,再安装facterpuppet,只是在puppet拷贝配置文件时要注意。

二、安装Facter用来获取客户端系统信息(hostname,ip,OS-Version,fqdn)

 

---内容以下
[agent]
Listen = true
Server = testsns
---
[root@nfstest puppet-2.6.13]# vi /etc/puppet/namespaceauth.conf
----内容以下
[fileserver]
allow *
[puppetmaster]
allow *
[puppetrunner]
allow *
[puppetbucket]
allow *
[puppetreports]
allow *
[resource]
allow *
----

三、生成用户和rra目录
[root@nfstest puppet]# puppetmasterd --mkusers
四、启动
[root@nfstest puppet]# /etc/init.d/puppet start
五、修改hosts
   修改双方的/etc/hosts文件,添加各自的IP地址对应的主机名,生产环境作内部DNS比较好,不用修改每台服务器的hosts文件。
192.168.133.42 nfstest
192.168.133.44 testsns
六、开放端口
   关闭双方的防火墙及selinux,或开放8140(server服务器端口),8139(client服务器端口)。相互做ping hostname telnet hostname 8140 test hostname 8139等,看网络及hosts是否正常

认证:
客户端发送请求
Puppeted --test –server testsns
服务器查看
Puppetca –list
服务器端签名
Puppetca –s –a //对全部客户端所有签名
Puppetca –s nfstest //只签名某个客户端
 

功能模块介绍及实例操做

文件分发:
经过puppet能够向被管理机上推送文件,方法是使用file类型的source属性
1:修改/etc/puppet、fileserver.conf
2:修改/etc/puppet/manifests/ site.pp
实例:要把server服务器上/opt目录下的mysql-5.1.49-linux-i686-icc-glibc23.tar.gz传输至client服务器的/opt目录下,文件名不变。
第一步:Vi /etc/puppet/fileserver.conf
[files]
path /opt/
allow 192.168.133.0/24

第二步:vi /etc/puppet/manifests/site.pp
file
{ "/opt/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz":
source => "puppet://$puppetserver/files/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz",
}

第三步:
在client客户端执行更新命令
puppetd --test --server testsns

    此处“$puppetserver”是puppet Server端的名称,即hostname,网上教程都是在hosts里指定,生产环境下用内部的DNS上做解析,像我公司一个www平台就有70台linux服务器,一个个添加hosts,不搞死人去。

修改文件属性:
   实例:把/tmp/dd142/ puppet-2.6.13.tar.gz文件的权限改成puppet用户,并设置权限为666。
第一步:编辑Server端的site.pp
vi /etc/puppet/manifests/site.pp
---内容以下
file
{ "/tmp/dd142/puppet-2.6.13.tar.gz":
owner => "puppet",
group => "puppet",
mode => 666,
}
----
第二步:在client端执行命令
puppetd --test --server testsns

执行SHELL命令或shell脚本:
    实例:经过puppet分发执行shell脚本,在客户端的opt目录下新建一目录shelldir。
第一步:编辑Server端的site.pp
vi /etc/puppet/manifests/site.pp

exec { "exec-mkdir":
cwd => "/opt",
command => "sh /opt/lgh.sh",
user => "root",
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
}
第二步:在client端编辑一shell脚本

第三步:在client端执行命令
puppetd --test --server testsns
在/opt目录下查看shelldir有没有创建。

服务检查及修改:
    能够经过puppet对一些服务进行检查。puppet是经过service命令操做的。因此,只能针对在/etc/init.d/目录下的服务
实例:把客户端的防火墙起来(原来是关闭的)
vi /etc/puppet/manifests/site.pp //清空site.pp,再新建

service
{ iptables:
ensure => "running",
}

cron计划任务:
接上面的shell程序实例,在17:30执行/opt/lgh.sh。
cron { "cron-shell": #title部分,可用来做为注释。
command => "sh /opt/lgh.sh" #要执行的命令
user => "root", #添加到root用户下的crontab中
minute => "30", #即第一个星号
hour => "17" #即第二个星号
}
登陆客户端查看效果

扩展阅读:

在开源世界里,有不少配置工具可供选择,这个领域一些关键的产品有:
Puppet(http://puppet.reductivelabs.com/):
Ruby写成的配置管理工具,使用C/S架构,使用declarative language配置客户端。
Cfengine(http://www.cfengine.org):
最早发布的开源配置工具之一,1993年发布,一样是C/S架构,一般应用于教育机构。
LCFG(http://www.lcfg.org/):
C/S架构的配置管理工具,使用XML定义配置。
Bcfg2
Python编写的C/S架构的配置管理工具,使用规格书和客户机响应配置目标主机。
本文档致力于描述使用Puppet管理你的主机、应用程序、后台程序和各类服务。

在此只讲Puppet,由于它简单,强大,流行。

什么是puppet?

    puppet是一种Linux、Unix平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
     puppet采用C/S星状的结构,全部的客户端和一个或几个服务器交互。每一个客户端周期的(默认半个小时)向服务器发送请求,得到其最新的配置信息,保证和该配置信息同步。每一个puppet客户端每半小时(能够设置)链接一次服务器端, 下载最新的配置文件,而且严格按照配置文件来配置服务器. 配置完成之后,puppet客户端能够反馈给服务器端一个消息. 若是出错,也会给服务器端反馈一个消息.
为何要开发puppet
    系统管理员都喜欢本身写点小工具来让本身的工做完成的更快或者更好, 不论是在大企业管理大量的服务器仍是只管理两三台机器. 可是不多人会把他们的工具发布出来. 也就是是说极少有工具能被重用,或者说不少工具就只能在所在的组织内部有用.拷贝给别的组织,他们也用不上. 也就是说,每一个系统管理员,在一个新的公司,都会另起炉灶开发一套基于ssh,for循环的"系统"来帮助本身完成系统管理任务.
    开发puppet是为了让系统管理员能够相互交流和共享成熟的工具,避免重复的劳动.经过如下两个特性来实现这一目标:
提供一个简洁的可是强大的框架来完成系统管理任务
系统管理任务能够描述成puppet语言,所以能够相互分享代码,就像分享其余语言的代码同样,好比python, c等
    所以,做为系统管理员的你能够更快的完成工做,由于你能够用puppet来处理全部的管理细节. 甚至你还能够下载其余管理员的puppet代码来让你的工做完成的更快.
使用puppet 的稳定性
     puppet与其余手工操做工具备一个最大的区别就是 puppet的配置具备稳定性,所以你能够屡次执行puppet, 一旦你更新了你的配置文件,puppet就会根据配置文件来更改你的机器配置,一般每30分钟检查一次. puppet会让你的系统状态同配置文件所要求的状态保持一致. 好比你配置文件里面要求ssh服务必须开启. 假如不当心ssh服务被关闭了,那么下一次执行puppet的时候,puppet会发现这个异常,而后会开启 ssh 服务. 以使系统状态和配置文件保持一致.puppet就象一个魔术师,会让你的混乱的系统收敛到puppet配置文件所想要的状态.
     可使用puppet管理服务器的整个生命周期,从初始化到退役.不一样于传统的例如sun的Jumpstart或者redhat的Kickstart, puppet能够终年让服务器保持最新状态.只要一开始就正确的配置他们,而后不再用去管他们.一般puppet用户只须要给机器安装好puppet并让他们运行,而后剩余的工做都由puppet来完成.

puppet的细节和原理

     puppet的目的是让你只集中于你要管理的目标,而忽略实现的细节,例如命令名,参数或者文件格式. puppet把系统里面的用户,软件包,服务 看做是"资源", puppet的做用就是管理这些资源以及资源之间的相互联系.
     底层支撑工具 Providers,puppet有不少的资源类型,例如文件,用户,软件包,服务, 不一样的操做系统上对资源的管理命令是不同的,例如debian下面用apt-get安装软件,redhat下面用yum安装软件. 所以puppet 对同一资源的管理能够有多个实现,配置资源的时候,能够明确的指定用什么provider. 例如在redhat上配置一个package资源的时候,能够指定provider是yum.
Facter变量
     在puppet客户端分析代码的时候,会把从facter传送过来的对应的值赋值给变量. 你能够单独手工执行facter这个命令,这个命令会打印出它所收集到的关于主机的信息,例如ip地址等等. facter把收集到值发送给puppet服务器端,服务器端就能够根据不一样的条件来对不一样的节点机器生成不一样的puppet配置文件. 最重要的一个就是服务器的主机名.

工做方式与流程

     puppet既能够在单机上使用,也能够以c/s结构使用.在大规模使用puppet的状况下,一般使用c/s结构.在这种结构中puppet客户端只是指运行puppet的服务器,puppet服务器端是只运行puppetmaster的服务器.
     puppet客户端首先会链接到puppet服务器端,而且经过facter工具把客户端的基本配置信息发送给服务器端. 服务器端经过分析客户端的主机名,经过node 定义,找到该主机的配置代码,而后编译配置代码,把编译好的配置代码发回客户端,客户端执行代码完成配置.而且把代码执行状况反馈给puppet服务器端.
修改系统配置
     puppet 经过管理资源的方式来管理系统, 例如管理某个软件是否要安装,是安装最新的仍是安装了就行. 管理某个服务是否开启, 管理某个文件的属性,内容等等. 全部的资源都有对应的几个属性能够设置. 经过设置属性的方式来管理资源. 有一种特殊的属性能够用在全部的资源上面,这种属性叫作 metaparams ( 元参数或者元属性).

资源之间的关系

    支持资源之间的关系配置是puppet的关键特性之一. 一个资源的变动能够对另外一个资源产生一个动做.例如 /etc/apache.conf这个资源有改动,可让/etc/init.d/apache 这个资源 reload一下.假如一个资源依赖另外一个资源,那么puppet会优先配置被依赖的资源,所以若是你的配置文件没有准备好,对应的服务是不会先启动的.

puppet 语言资源     puppet的所有就是管理资源,所以puppet语言的焦点就是处理这些资源,下面是一个基本的管理单个资源的例子. file {"/etc/hosts": owner = root, group = root, mode = 644}      上面的列子给出了定义一个资源所须要的全部组件,类型,名字和属性. 定义了一个 file 资源, 资源的title(标题)是 "/etc/hosts", 资源的属性里面设置了该文件属于那个用户和组,以及文件的权限. 也能够在一个大括号里面定义多个资源,经过分号来区分. 避免重复配置      puppet的编译器会避免在不一样的代码段里面管理同一个资源, 若是在不一样的代码段对同一个资源进行配置,执行puppet的时候你会获得一个语法错误.puppet探测这种冲突的状况是经过判断资源类型和资源的title(标题); 若是两个资源有相同的资源类型和title; 那么就认为这两个资源是表示同一个资源. 类     你能够把多个相关的资源定义在一块儿,组成一个类.能够在其余的代码段include这个类.puppet还支持有限制的类的继承,做用就是在子类里面的属性能够覆盖父类里面的属性. 字符串     几乎全部的东西和符号在puppet里面都被看做是字符串,包括数字和布尔值. 可是若是你用引号把true和false引发来,他们会被当作字符串,例如你想赋值给某个资性"yes"的 字符串. 变量 puppet除facter变量外,也能够自定义变量,但不容许你在同一个类里面对一个变量进行两次赋值. $myvar = value123 条件语句     Puppet支持常见的条件语句,使得你能根据不一样的条件导入不一样的资源定义。如if、case、另外puppet从版本0.24.6开始支持比较运算符。 数组    puppet 很是有限的支持数组这种类型,你能够建立数组,而且给他们赋值,可是你不能删除它们.数组用的最多的状况就是上面ssh例子里面,资源依赖哪一种状况. 或者是一次管理多个相同类型的资源.例如:user { [bin, adm]: ensure => present } 函数     puppet提供一些有用的函数,例如template利用erb模板来生成文件内容,这样就能够根据不一样主机的状况,生成不一样的配置文件.例如配置squid的内存缓存大小,能够利用facter返回的内存值作一个简单的数学计算,而后写入到squid的配置文件,就是经过template来完成的. 另一个函数include 能够读入另外的puppet配置文件或者类.这样能够把puppet的文件分割的更有规律. 节点     最后一个关于puppet语言的语法是节点定义"node", 节点定义很象类定义,也支持继承特性. 当一个节点(puppet客户端)链接到puppet服务器端,puppet解析器会查找这个节点的node代码片段,而后利用这个代码片段来生成该客户端的配置代码. puppet里面主机名来标明一个主机,所以主机名在puppet里面至关重要. 若是puppet找不到匹配该主机名的node定义,就会用默认的节点定义来配置该主机. 在node里面使用主机名,须要用单引号把主机名括起来. node 'server1' { include nginx }     在上面的代码中,若是server1这个主机链接到puppet服务器,puppet服务器就会按照nginx的代码来配置这台服务器. 自定义资源     puppet里面有一个很是有用的语法结构,叫作define, 经过define能够把多个资源包装成一个资源,或者把一个资源包装成一个模型,便于使用.例如,在debian里面管理一个apache虚拟机很是简单,把一个虚拟主机的配置文件放到/etc/sites-available/里面,而后作一个符号连接到/etc/sites-enabled目录. 你能够为你每一个虚拟主机复制一样的配置代码.

相关文章
相关标签/搜索