在日常系统管理工作中,管理上千台服务器,需要临时的改变其一个配置,例如删掉某个帐号停掉某个服务
一般我们只能不厌其烦的登到每一台机器上重复的完成这些动作,或者写脚本循环登录及其执行操作
如果有了cfengine,一个命令就可以搞定了.是不是很看效率,请看如下实践之体会.以下的所提到的cfengine是2.2版本的.
cfengine是一个功能强大的自动化系统管理工具.引用其官网的说法"cfengine是一种 UNIX 管理工具,其目的是使简单的管理的任务自动化,使困难的任务变得较容易.
它的目标是使系统从任何状态收敛到一种理想状态.使用cfengine,它可以保证你的系统总是维持你所希望的那个状态.
如果说有黑客进来了修改了某个重要的配置文件的内容或者权限,也会被cfengine自动修复!
当你切换使用cfengine来管理系统配置时,你可以得到以下好处:
Cfengine是一个用于设置和维护计算机系统的工具,包含了以下几个组件:
每个系统必须要有最少的配置文件.默认情况下,你需要将配置文件放到/var/cfengine/inputs 目录中.可以集中化管理配置文件,通过拉的方式更新到所有客户端系统
cfengine使用到配置文件,我们需要集中化版本控制(比如Subversion).这样就可以记录所有变更,以便在需要时,可以会滚到某个特定的版本配置.
cfengine中最重要的概念就是Classes. 每种系统都属于一个或者多个 classes.
cfagent每次运行的时,会根据很多各种不同信息来定义classes.可以在特定的classes执行特定的操作.
因此,任何操作都可以在一台主机上执行,也可以在运行特定操作系统的主机上运行,也可以在所有的主机上运行.
Cfengine 使用内置的和用户定义的classes.
主机本生根据其架构决定很多classes 比如主机名称,主机ip,操作系统等.
很多classes 根据当前的日期和时间定义的.
为了确定在给定系统上定义了那些标准classes,可以运行如下命令:
[root@linux]# /var/cfengine/bin/cfagent -p -v | grep Defined
Defined Classes = ( 172_22_5 172_22_5_90 172_22_5_91 64_bit Day17 Hr11 Hr11_Q1 March Min10_15 Min11 Q1 Redhat_AS5 Wednesday Yr2010 addr_
alidc_net alidc_net_hzidc_com any cfengine_01 cfengine_01_hst_xyi_cn_alidc_net cfengine_01_hst_xyi_cn_alidc_net_hzidc_com cfengine_2
cfengine_2_2 cfengine_2_2_3 cfengine_server cn_alidc_net cn_alidc_net_hzidc_com com compiled_on_linux_gnu fe80__216_3eff_fe16_55b
hst_xyi_cn_alidc_net hst_xyi_cn_alidc_net_hzidc_comhzidc_com ipv4_172 ipv4_172_22 ipv4_172_22_5 ipv4_172_22_5_90 ipv4_172_22_5_91 linux
linux_2_6_18_131_el5_customxen linux_x86_64 linux_x86_64_2_6_18_131_el5_customxen
linux_x86_64_2_6_18_131_el5_customxen__1_SMP_Tue_Sep_15_15_46_11_CST_2009 lsb_compliant net net_hzidc_com
net_iface_bond0 net_iface_lo redhat redhat_s redhat_s_5 redhat_s_5_3 redhatenterpriseserver redhatenterpriseserver_5
redhatenterpriseserver_5_3 redhatenterpriseserver_tikanga x86_64 xyi_cn_alidc_net xyi_cn_alidc_net_hzidc_com )
正如你所看到的,这个系统中包含了很多预定义classes,他们属于几个分类:
每个系统都属于 any 这个 class,当你需要对 未定义或者不能使用classes标识的系统进行操作时候,可以使用 any 这个 class.
自定义classes 配置都是在cfagent.conf 中的groups区域中,请看如下例子:
groups:
web_app1 = ( IPRange(172.16.2.1-250) IPRange(172.16.3.1-250) IPRange(172.16.4.1-250) )
web_app1 = ( IPRange(172.16.6.1-250) IPRange(172.16.7.1-250) IPRange(172.16.14.1-250) )
ntp_server= ( nagios1 nagios2 nagios3 monitor_xy7 monitor_xy8 monitor_xy9 )
# 通过配置文件 判断是否属于某一类型的主机
dns = ( '/usr/bin/test -f /etc/named.conf' )
web_normal = ( '/usr/bin/test -f /etc/httpd/conf/httpd.conf' )
# 通过cfengine内部命令来判断
first_ten_server = ( RegCmp("webserver[0-9]i","${host}") )
# all server
all_server= ( dns web_app1 )
copy:
any::
# 根据拷贝结果,定义新的classes
$(clientconf)/syslog.confdest=$(etcdir)/syslog.conf
owner=$(fowner) group=$(fgroup)
mode=644
server=$(cfserver) trustkey=true
define=new_syslog
shellcommands:
new_syslog::
"/etc/init.d/syslog restart > /dev/null 2>&1"
以上配置只是cfagent.conf 中的一段而已,从上面可以看出:
比如上面的配置例子,当syslog.conf配置改变了,当拷贝完成时,会定义一个new_syslog的class.
在shellcommands的操作中,会根据new_syslog class 来重启syslog服务.
一般来说,cfengine 的配置文件,都是集中化方式管理,配置文件都通过版本控制软件进行修改和更新.
系统管理更新配置文件后,提交到svn后,cfengine server 更新配置文件,推送到客户端.
注意:没有绝对的服务端和客户端,在需要的情况下,客户端也可以作服务器端.
注意:update.conf的内容要简单,一般来说就是下载cfagent.conf策略文件,基本上这个文件创建好了之后就不会更改了.
注意:客户端定期执行cfagent,可以通过添加到crontab 或者 cfexecd定期调用.这样的情况下,客户端就不需要运行cfservd程序.
/var/cfengine/
|-- backup
|-- bin
|-- clientconf#客户端从此目录下载和更新配置文件
|-- inputs#服务端自身的配置文件
|-- lib
|-- modules
|-- outputs
|-- ppkeys
|-- rpc_in
|-- rpc_out
|-- share
`-- state
#cat /var/cfengine/clientconf/cfservd.conf (为了简化一点,服务端和客户端使用同样的cfservd.conf配置)注意:此cfservd.conf配置文件比较宽松,可以根据需要进行权限的限制
###############################################################################
# Who and what we allow access to, and who we trust
# Master Server conf and Client cfservd conf
###############################################################################
control:
domain = ( hzidc.com )
cfrunCommand = ( "/var/cfengine/bin/cfagent" )
MaxConnections = ( 100 )
MultipleConnections = ( true )
IfElapsed = ( 1 )
DenyBadClocks = ( false )
AllowConnectionsFrom = ( 172.0.0.0/8 )
TrustKeysFrom = ( 172.0.0.0/8 )#自动交换key,不需要拷贝key
LogAllConnections = ( true )
AllowUsers = ( root admin )
HostnameKeys = ( off )
ChecksumDatabase = ( /var/cfengine/cfdb )
grant:
$(cfrunCommand)172.0.0.0/8#允许ip在172.0.0.0/8范围内的主机,可以cfrun方式远程执行cfagent
/var/cfengine172.0.0.0/8#允许ip在172.0.0.0/8范围内的主机,通过cfagent访问拷贝此目录下的文件
#cat /var/cfengine/clientconf/update.conf注意:要尽可能保持update.conf文件简单,只让它更新必要的cfagent.conf配置文件,其他的具体功能操作都在cfagent.conf文件中定义.
###############################################################################
# update.conf - ensure that the inputs and binaries in /var/cfengine are
# synced to those on the server.
###############################################################################
control:
actionsequence = ( copy ) # sequence of actions to perform
domain = ( hzidc.com ) # our domain
DefaultCopyType = ( checksum ) # Copy based on checksum, not mtime
HostnameKeys = ( off )
cfserver = ( 172.16.20.100 ) # host running cfservd
workdir = ( /var/cfengine ) # the workdir
clientconf = ( /var/cfengine/clientconf )
input_mode = ( 700 ) # mode for input files
bin_mode = ( 755 ) # mode for binaries
fowner = ( root ) # file owner
ogroup = ( root ) # file group
any:: # the class to match
SplayTime = ( 1 ) # max number of minutes over
# which cfengine will share
# its load on the server
############################################################################
copy:
$(clientconf)/cfagent.conf dest=$(workdir)/inputs/cfagent.conf
owner=$(fowner) group=$(ogroup)
mode=700
server=$(cfserver) trustkey=true encrypt=true
#cat /var/cfengine/clientconf/cfagent.conf
###############################################################################
# cfagent.conf for client
###############################################################################
# group区块定义群组(classes),可以在后续的配置中指定特定的组群执行特定的操作,这样就可以将不同类的配置文件都写在同一个cfagent.conf文件中.
groups:
Redhat_AS3 = ( redhat_as_3 )
Redhat_AS4 = ( redhat_as_4 )
Redhat_2u1 = ( redhat_as_2_1 )
Redhat_7u3 = ( redhat_7_3 )
Redhat_AS5 = ( redhat_s_5 )
control:
any::
## Basic Cfengine configurations
access = ( root )
editfilesize = ( 0 ) # 0 turns off the editfilesize limit.
netmask = ( 255.255.255.0 ) # Sets the netmask if you use netconfig.
timezone = ( CST )
## How and Where do we output stuff?
sysadmin = ( [email protected] )
smtpserver = ( smtp.admin.com )
EmailMaxLines = ( n ) # No maximum lines
Syslog = ( on )
## How many cfengines can run, what do we do when the server's busy
SplayTime = ( 45 ) # Run everything immediately
MaxCfengines = ( 20 )
Repository = ( /var/cfengine/backup )
# 如果使用cfexecd定时运行cfagent,它会读取 下面 schedule 中定义时间来运行cfagent
schedule = ( Monday.Hr10 Tuesday.Hr10 Wednesday.Hr10 Thursday.Hr10 Friday.Hr10 Monday.Hr15 )
## Set some defaults
DefaultCopyType = ( checksum ) # Copy based on checksum, not mtime
DeleteNonUserFiles = ( false ) # Do not delete unowned files
Exclamation = ( on ) # Inform us of problems.
ExpireAfter = ( 30 ) # Don't let cfengine run longer then 60 minutes.
HostnameKeys = ( off ) # Store keys based on hostname, not IP
Inform = ( on ) # Show diagnostic output
ShowActions = ( off ) # Do not show verbose diagnostic output
domain = ( hzidc.com ) # Obtain our domain name automatically
# 可以自定义一些变量,方便后面引用,引用方式 $(cfserver)
cfserver = ( 172.16.20.100 )
clientconf = ( /var/cfengine/clientconf )
workdir = ( /var/cfengine )
etcdir = ( /etc )
optdir = ( /opt )
bin_mode = ( 755 ) # mode for binaries
fowner = ( root ) # file owner
fgroup = ( root ) # file group
actionsequence = ( copy editfiles shellcommands processes )
###############################################################################
## copy 区块: 从服务器拷贝配置文件,也可以递归拷贝目录
copy:
any::
$(clientconf)/cfservd.conf dest=$(workdir)/inputs/cfservd.conf
owner=$(fowner) group=$(fgroup)
mode=700
server=$(cfserver) trustkey=true
$(clientconf)/update.conf dest=$(workdir)/inputs/update.conf
owner=$(fowner) group=$(fgroup)
mode=700
server=$(cfserver) trustkey=true
# 引用前面自定义个group(classes),属于Redhat_AS4这个组的拷贝以下配置文件
Redhat_AS4::
$(clientconf)/sysctl.conf dest=/etc/sysctl.conf
owner=$(fowner) group=$(fgroup)
mode=777
server=$(cfserver) trustkey=true
$(clientconf)/limits.conf dest=/etc/security/limits.conf
owner=$(fowner) group=$(fgroup)
mode=777
server=$(cfserver) trustkey=true
###############################################################################
## editfiles 区块: 此块操作是自动编辑系统配置文件
editfiles:
any::
{ /root/.bashrc
AutoCreate
DeleteLinesContaining "export PS1"
AppendIfNoSuchLine "export PS1='\n\e[1;37m[\e[m\e[1;32m\u\e[m\e[1;33m@\e[m\e[1;35m\h\e[m \e[4m`pwd`\e[m\e[1;37m]\e[m\e[1;36m\e[m\n\$'"
}
###############################################################################
## processes 区块: 定义检查系统进程,如果没有在ps里发现相应进程,cfagent将根据指定的命令启动该进程
processes:
any::
# Make sure these processes are always running
"cfservd" restart "/var/cfengine/bin/cfservd"
###############################################################################
## shellcommands 区块: 定义了需要运行的系统命令,可以是脚本,也可以是命令
shellcommands:
any::
# restart apache
"/etc/init.d/httpd restart"
# execute cmd
"/bin/echo client no do ser with domain "
###############################################################################
## files区块: 定义了检查系统文件属性,如有不符将自动修正
files:
any::
/etc/passwd
mode=644 # make sure the file permissions are right
owner=root # make sure it's owned by root
action=fixall # if anything is wrong, fix it immediately!
checksum=md5 # keep a "tripwire" checksum to tell us
/etc/ssh/sshd_config m=644 o=root g=0 act=fixall
#####################################################################注意:此配置文件中的主机名要能解析(通过/etc/hosts 或者dns),否则运行会找不到客户端ip,服务端需要配置hosts 或者dns.此配置文件只需要在服务端使用.
#list of hosts you're going to manage (remote client must run cfservd)
#####################################################################
domain = hzidc.com
access = root admin
hostnamekeys = off
outputdir= /var/cfengine/output
#-------host list----------#
test_name1
test_name2
test_name3
test_name4
test_name5
test_name6
test_name7
test_name8
test_name9
test_name10
/var/cfengine/bin/cfkey说明: 服务端生成的密钥保存在/var/cfengine/ppkeys目录下.至此cfengine 服务端已经基本配置完成了,下面我们就要在客户端初始化运行cfengine
/var/cfengine/bin/cfservd
当然在真实生产线部署,管理大量的服务器,要对cfengine进行一些改进,才能满足特定的需要.