cfengine学习笔记03[原创]

终于到最后一篇了,也就是cfengine最便捷的所在了,让你只通过一台机器管理你想要管理的任意一个或多个服务器,是不是很神奇,请往下看

前两篇已经把基本的配置都写好且配置好了,这里我仅仅捡关键的写了,cfservd.conf,update.conf及供维护服务器端使用的cfagent.conf文件参考上篇文章,这片文章中我们仅仅需要配置cfrun.hosts文件
内容如下

#
# This is the host list for cfrun
#
# Only these hosts will be contacted by remote connection
#

domain=b.c #设置域
access=root #设置需要访问的用户

192.168.220.130 #维护主机的ip,每个写一行

这样一切准备就绪后,就可以执行/var/cfengine/bin/cfrun -v了,显示结果如下


Domain name = b.c

GNU Cfengine server daemon –

2.2.8

Free Software Foundation 1994-

Donated by Mark Burgess, Oslo University College, Norway

————————————————————————

Host name is: conversion.localhost

Operating System Type is linux

Operating System Release is 2.6.18-8.el5xen

Architecture = i686

Using internal soft-class linux for host linux

The time is now Wed Oct 15 21:53:51 2008

————————————————————————

Additional hard class defined as: 32_bit

Additional hard class defined as: linux_2_6_18_8_el5xen

Additional hard class defined as: linux_i686

Additional hard class defined as: linux_i686_2_6_18_8_el5xen

Additional hard class defined as: linux_i686_2_6_18_8_el5xen__1_SMP_Thu_Mar_15_21_02_53_EDT_2007

GNU autoconf class from compile time: compiled_on_linux_gnu

Address given by nameserver: 127.0.0.1

Checking integrity of the state database

Checking integrity of the module directory

Checking integrity of the input data for RPC

Checking integrity of the output data for RPC

Checking integrity of the PKI directory

Making sure that locks are private…

Loaded /var/cfengine/ppkeys/localhost.priv

Loaded /var/cfengine/ppkeys/localhost.pub

Looking for a source of entropy in /var/cfengine/randseed

cfrun(0): .......... [ Hailing 192.168.220.130 ] ..........
Connecting to server 192.168.220.130 to port 0 with options
Loaded /var/cfengine/ppkeys/root-192.168.220.130.pub
Connect to 192.168.220.130 = 192.168.220.130 on port 5308
Loaded /var/cfengine/ppkeys/root-192.168.220.130.pub

...............................................................
cfrun:conversion.localhost: Strong authentication of server=192.168.220.130connection confirmed
192.168.220.130 replies..

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

cfengine:test:
Executing script /usr/bin/rsync -r [email protected].168.220.129::software/upload/ /tmp/test/...(timeout=0,uid=-1,gid=-1)
cfengine:aoyun-web-2: Finished script /usr/bin/rsync -r [email protected]192.168.220.1129::software/upload/ /tmp/test/
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Connection with 192.168.220.130 completed

以上是执行的全过程,我做了一个rsync的操作,这样如果要是需要很多台server同时手动rsync操作或其他操作的话,就可以使用这个了


总之cfengine还是很强大的,cfagent.conf配置文件中有需要参数可以调整,还希望大家在实际使用当中仔细学习了。

cfengine学习笔记02[原创]

书接上回,上次介绍的只是单独使用cfagent程序来完成任务,今天说下cfservd和cfagent配合使用的方法,应用环境和上次的一样,

先在A上的/var/cfengine目录下建立master/inputs文件夹
目录结构如下

/var/cfengine/
|-inputs #用于放置相应的配置文件
|-outputs #程序执行后的输出,通常里面没内容
|-bin #cfengine可执行文件放置的位置

|-master/

|-inputs #用户存放客户机需要的cfagent.conf文件

上面红色的是这次新建立的


在A上放入的master/inputs文件下放入cfagent.conf文件内容如下


##################################################
#
# cfagent.conf
#
# This is a simple file for getting started with
# cfengine. It is harmless. If you get cfengine
# running with this file, you can build on it.
#
##################################################

###
#
# BEGIN cfagent.conf (Only hard classes in this file )
#
###

control:

actionsequence = ( shellcommands ) #定义要执行的动作,此处是执行一个shell命令

domain = ( test.com ) #定义域名

timezone = ( MET ) #定义时区

######################################################################
shellcommands: #需要执行的shell命令

"/bin/touch /tmp/2" #在/tmp目录下建立2这个文件
######################################################################

###
#
# END cfagent.conf
#
###

然后在A的/var/cfengine/inputs文件夹下建立cfservd.conf,内容如下

#########################################################
#
# This is a cfd config file
#
# The access control here follows after any tcpd
# control in /etc/hosts.allow and /etc/hosts.deny
#
#########################################################

#
# Could import cf.groups here and use a structure like
# in cfengine.conf, cf.main, cf.groups
#

control:

domain = ( b.c ) #设置域名
cfrunCommand = ( "/var/cfengine/bin/cfagent" ) #设置cfrun命令执行的命令路径

any::

IfElapsed = ( 1 ) #一个anti-spamming参数,防止client端频繁的请求解析input的文件
ExpireAfeter = ( 15 ) #设置过期时间
MaxConnections = ( 10 ) #设置最大的连接数
MultipleConnections = ( true ) #是否允许多个client端连接
AllowConnectionsFrom = ( 192.168.220 ) #允许从哪里连接,可以是网段,可以是域名
AllMultipleConnectionsFrom = ( 192.168.220 )
TrustKeysFrom = ( 192.168.220 ) #括弧中的主机会自动被信任
LogAllConnections = ( true )

#########################################################

admit: # or grant: #授权哪些机器可以访问什么目录及文件

/var/cfengine/bin/cfagent 192.168.220.*
/var/cfengine/master/inputs 192.168.220.*

现在就可以在A上启动server端了,启动命令

/var/cfengine/bin/cfservd

接下来是B上的工作,cfagent就不需要了,等下会自动从A上把需要的cfagent.conf传过来的

首先在B上建立和A同样的cfservd.conf文件,同时启动服务端,用于两台机器之间的通信用,然后在/var/cfengine/inputs文件夹中建立update.conf文件,内容如下

#######################################################
#
# cf.update - for b.c
#
#######################################################

###
#
# BEGIN cf.update
#
###

#######################################################################
#
# This script distributes the configuration, a simple file so that,
# if there are syntax errors in the main config, we can still
# distribute a correct configuration to the machines afterwards, even
# though the main config won't parse. It is read and run just before the
# main configuration is parsed.
#
#######################################################################

control:

actionsequence = ( copy processes tidy ) # Keep this simple and constant
#设置要执行的动作
domain = ( b.c ) # Needed for remote copy #设置域名

#
# Which host/dir is the master for configuration roll-outs?
#

policyhost = ( 192.168.220.128 ) #主策略服务器,这里可以是A的ip或A的域名
master_cfinput = ( /var/cfengine/master/inputs )
#定义主文件放置位置,也就是cfagent.conf等需要传到client端的配置文件及shell文件放置的位置
AddInstallable = ( new_cfenvd new_cfservd )

#
# Some convenient variables
#

workdir = ( /var/cfengine ) #定义工作目录

cf_install_dir = ( /usr/local/sbin )

###################################################################
#
# Spread the load, make sure the servers get done first though
#
###################################################################

!AllBinaryServers::

SplayTime = ( 1 )

############################################################################

#
# Make sure there is a local copy of the configuration and
# the most important binaries in case we have no connectivity
# e.g. for mobile stations or during DOS attacks
#

copy: #定义copy的动作,从服务端的master_cfinput目录下把文件拷贝到local的inputs文件夹下

$(master_cfinput) dest=$(workdir)/inputs
r=inf
mode=700
type=binary
exclude=*.lst
exclude=*~
exclude=#*
server=$(policyhost)
trustkey=true

!quetzalcoatal::

$(cf_install_dir)/cfagent dest=$(workdir)/bin/cfagent
mode=755
backup=false
type=checksum

$(cf_install_dir)/cfservd dest=$(workdir)/bin/cfservd
mode=755
backup=false
type=checksum
define=new_cfservd

$(cf_install_dir)/cfexecd dest=$(workdir)/bin/cfexecd
mode=755
backup=false
type=checksum

$(cf_install_dir)/cfenvd dest=$(workdir)/bin/cfenvd
mode=755
backup=false
type=checksum
define=new_cfenvd

#####################################################################

tidy:

#
# Cfexecd stores output in this directory.
# Make sure we don't build up files and choke on our own words!
#

$(workdir)/outputs pattern=* age=7

#####################################################################

processes:

new_cfservd::

"cfservd" signal=term restart /var/cfengine/bin/cfservd

new_cfenvd::

"cfenvd" signal=kill restart "/var/cfengine/bin/cfenvd -H"

###
#
# END cf.update
#
##

到这里,update.conf文件也准备完毕了,接下来就是执行了

到现在为止,inputs下还没有cfagetn.conf文件,现在执行

/var/cfengine/bin/cfagent #前提cfagent文件已经copy到/var/cfengine/bin下
或者
/usr/local/sbin/cfagent

不过建议使用cfagent -v执行,这样就能看到执行时的信息了,当一切都完成时,如果正常,可以看到在/var/cfengine/inputs下多了cfagent.conf文件,并且在/tmp下建立了cfagent.conf中定义的2这个文件

排错:
关于排错方面,建议在A上即服务器端使用cfservd -d2来启动,这样执行的时候,服务器端就会把执行的信息显示在屏幕上,从而方便查错。
关于这个的应用,我是这样看的,可以在所有client上定义crontab,每天执行,当shellcommands需要变更时,在服务器端更新master/inputs下的cfagent.conf文件,这样client端再执行就会把新的脚本下载下来了。

cfengine学习笔记01[原创]

cfengine看了有几天了,试验也做了不少了,基本上可以说是入门了,这是一个集中管理的软件,内容分发性质的软件,可以单机使用,也可以多机使用

Cfengine 是一个令人恐怖的系统管理工具。它可自动对联网的计算机进行配置和维护,适用于所有基于UNIX或类UNIX的操作系统,并且它可以通过UNIX兼容的环境/库Cygwin 在较新版本的Windows操作系统中运行。

Cfengine目的是使简单的管理的任务自动化,使困难的任务变得较容易。它的目标是使系统从任何状态收敛到一种理想状态。依照它的作者 Mark Burgess 所说,cfengine 总是使您的系统更接近于您所定义的配置; 它决不会使系统变得更糟。

以上是cfengine网站对此软件的说明,接下来我们就开始吧

环境:vmvare模拟两个linux,hostname分别是linux01(192.168.220.128)和linux02(192.168.220.130)
http://www.cfengine.org下载cfengine的程序,目前稳定版最新的是2.2.8,
安装超级傻瓜,就三步
./configure
make
make install
执行文件被安装到了/usr/local/sbin目录下,都是cf开头的
配置文件模板被放在了/usr/local/share/cfengine目录下
接下来在/var下建立cfening文件夹,及相应的文件夹,目录结构如下

/var/cfengine/
| -inputs #用于放置相应的配置文件
| -outputs #程序执行后的输出,通常里面没内容
| -bin
#cfengine可执行文件放置的位置

文件夹建好后,就把cfengine的应用程序拷贝到bin文件夹下,当然做软连接也是可行的

cp /usr/local /sbin/cf * /var/cfengine/bin/

拷贝三个配置文件到inputs文件夹

cp /usr/local /share/cfengine/cfagent.conf.example /var/cfengine/cfagent.conf
cp /usr/local /share/cfengine/cfservd.conf.example /var/cfengine/cfservd.conf
cp /usr/local /share/cfengine/update.conf.example /var/cfengine/update.conf

先来说下几个应用程序的作用

cfagent 一个独立运行的程序(关键程序)
An autonomous configuration agent (required) .
cfservd cfengine的服务端
A file server and remote activation service (optional) .
cfexecd 计划任务和报告服务(可以替代crontab的东东)
A scheduling and report service (recommended) .
cfenvd
An anomaly detection service (strongly recommended) .
cfrun 远程控制的程序
A way of activating cfagent remotely (use this as you need to) .
cfshow
A way of examining the contents of helper databases (helper) .
cfenvgraph
Ancillary tool for cfenvd (helper) .
cfkey 生成key的程序,只需运行一次就可以了
Key generation tool (run once on every host) .

编辑inputs下的cfagent.conf文件内容如下

##################################################
#
# cfagent.conf
#
# This is a simple file for getting started with
# cfengine. It is harmless. If you get cfengine
# running with this file, you can build on it.
#
##################################################

###
#
# BEGIN cfagent.conf (Only hard classes in this file )
#
###

control:

actionsequence = ( shellcommands ) #定义要执行的动作,此处是执行一个shell命令

domain = ( test.com ) #定义域名

timezone = ( MET ) #定义时区

######################################################################
shellcommands: #需要执行的shell命令

"/bin/touch /tmp/2" #在/tmp目录下建立2这个文件
######################################################################

###
#
# END cfagent.conf
#
###

动作类型包含以下几种,这里举例只使用了shellcommands

groups, control, copy, homeservers, binservers, mailserver, mountables,import, broadcast, resolve, defaultroute, directories, miscmounts,files, ignore, tidy, required, links, disable, shellcommands,strategies,editfiles, processes

保存退出后,执行/var/cfengine/bin/cfagent -v,然后可以看到如下结果

********************************************************************* Main Tree Sched: shellcommands pass 1 @ Mon Sep 22 19:33:57 2008 ********************************************************************* cfengine:linux01: Executing script /bin/touch /tmp/2…(timeout=0,uid=-1,gid=-1) (Setting umask to 77) cfengine:linux01: Finished script /bin/touch /tmp/2 Performance(Exec(/bin/touch /tmp/2)): time=0.0187 secs, av=0.0187 +/- 0.0316 ———————————————————————

你可以在看到/tmp下有刚刚touch好的2文件,如此一个简单的cfengine就做好了,这样如果你需要删除什么目录下的文件,或者拷贝,再或者你自己的脚本,就都可以添加到cfagent.conf文件中,然后通过crontab定义cfagent的定期执行


参考文章: