天天看点

cfengine 学习文档

资料下载于

在运维自动化管理框架方面一直在尝试,后来听说这方面已很早就已经有人在摸索了其中最早的就是cfengine,大概1993年就出现了,时至今日在实际运维中应用也非常广泛。相见恨晚啊,赶紧拿来测试下,通过近期的实践,发现它正是我一直以来想要的东西呵呵。同时还测试了puppet稍后放出测试笔记。

"cfengine是一种 UNIX 管理工具,其目的是使简单的管理的任务自动化,使困难的任务变得较容易。它的目标是使系统从任何状态收敛到一种理想状态。--摘自cfengine官网。

1    安装步骤

1.1    安装berkeley

tar xzvf db-5.0.21.tar.gz

cd db-5.0.21

cd build_unix/

../dist/configure --prefix=/opt/Berkeley

sudo make && sudo make install

1.2    安装cfengine

cd ~

tar xzvf cfengine-2.2.10.tar.gz

cd cfengine-2.2.10

sudo ./configure --prefix=/usr/local/cfengine --with-berkeleydb=/opt/Berkeley/

sudo make

sudo make install

sudo mkdir /var/cfengine

sudo mkdir /var/cfengine/bin

sudo mkdir /var/cfengine/inputs

sudo cp /usr/local/cfengine/sbin/cfagent /var/cfengine/bin

sudo cp /usr/local/cfengine/sbin/cfexecd /var/cfengine/bin

sudo cp /usr/local/cfengine/sbin/cfservd /var/cfengine/bin

sudo chown -R root:0 /var/cfengine

sudo chmod -R 755 /var/cfengine

可能需要

echo "/opt/Berkeley/lib/">~/Berkeley.conf

sudo cp ~/Berkeley.conf /etc/ld.so.conf.d/

sudo /sbin/ldconfig

1.3    测试

编辑文件

/var/cfengine/inputs/cfagent.conf

=================================

Control:

actionsequence = ( shellcommands )

shellcommands:

"/bin/echo Hello World!"

>Sudo /usr/local/cfengine/sbin/cfkey    #生成密钥

    >sudo /var/cfengine/bin/cfagent -f /var/cfengine/inputs/cfagent_doc.conf 

cfengine:gateway:/bin/echo Hello: Hello World!

2    程序结构及工作原理简介:

2.1    安装目录:/usr/local/cfengine/

2.2    程序执行目录/var/cfengine

|-- bin #cfengine可执行文件放置的位置

|-- inputs #用于放置相应的配置文件 

|-- modules #自定义模块的存储目录 

|-- ppkeys #交换密钥的存储目录

|-- outputs #程序执行后的输出,通常里面没内容

2.3    程序文件

Cfagent: 解释策略的承诺并且以收敛的方式执行它们。代理可使用由统计监测引

擎(自动配置代理,配置文件为update.conf(拖拽)和 cfagent.conf主配置文件)

Cfenvd产生的数据,并且它能从运行于本地或远程主机上的Cfenvd中获取数据。

Cfexecd: 执行Cfagent,并且记录它的输出(可选择通过电子邮件寄出摘要)。

可以在一个后台程序(standalone)的模式下运行,或者可以通过cron 在一个类似

于Unix 的系统上运行。

Cfservd: 监控Cfengine 的端口:提供文件数据,并在接收一个来自cfrun 的连

的基础上启动Cfagent。请注意,没有数据可以通过这个后台程序。(文件服务和远

程激活服务,配置文件为cfservd.conf)

Cfrun: 联接远程主机,并要求他们运行cfagent。(配置文件为cfrun.hosts)

Cfenvd: 收集在每台主机上使用资源的统计数据,用于异常状况的检测。信息以

cfengine 类的形式被代理获得,因此代理可以及时地对异常的动态状况进行检查并

作出反应。

Cfkey: 在主机生成“公有-私有”密钥对。一般作为Cfengine 软件安装过程中的

一个步骤,你只需运行一次该程序。

Cfshow: 一旦你对它的内部存储感兴趣,cfshow 便将cfagent 的数据库内容以

ASCII的格式导入。

Cfenvgraph: 将Cfenvd 的数据库内容导入为一种可用于图标格式显示一台主机

在其环境中的一般行为。

2.4.1    服务器激活方式:集中控制的方式,上图详细给出了整个流程.

2.4.1.1    服务器上运行cfrun,cfrun会根据cfrun.hosts中的主机列表来连接到某个客户机的cfservd程序

2.4.1.2    客户机上cfservd调用本机的cfagent程序

2.4.1.3    客户机上cfagent程序执行update.conf,连接到中央机的cfservd复制下载策略文件cafagent.conf

2.4.1.4    客户机下载成功后执行最新版本的策略文件,不成功就执行旧版本的.

注:update.conf的内容一般为一些非常简单的固定操作:下载策略文件,清理日志,重启服务,基本上这个文件创建好了之后就不会更改了.在下载策略文件的时候如果下载成功,会将原策略文件改名,加上.cfsaved后缀

2.4.2    客户端自主激活方式:

客户机独立执行cfagent (可以是定期执行,例如加入cron中)。整个流程简化为图中的第3,4步。

3    基本配置

3.1    控制服务器

3.1.1    自定义的目录

/var/cfengine/masterfile #管理目录存储 公共配置文件和模块等

|   |-- inputs #存储用于分发的配置文件

|   |   |-- cfagent.conf

|   |-- modules存储用于分发的模块文件

|   |   |-- module:mymodpy

|   |   `-- module:mymodsh

3.1.2    配置文件/var/cfengine/inputs/cfservd.conf

=================================================================

control:    控制段 

  domain = ( soufun.test.com )  #设置管理域的根

any:: #分类 

#any::所有 

#192_168_7_55::仅192.168.7.55。这里我们用any::做默认的全局配置

IfElapsed = (1) #一个anti-spamming参数,防止client端频繁的请求解析input的文件

  AllowConnectionsFrom = ( 192.168.7.0/24 ) #设置允许访问的IP段 

  TrustKeysFrom = ( 192.168.7.0/24 ) #设置信任的域,和域中的服务器自动交换密钥

  AllowUsers = ( root )

  MaxConnections = ( 150 )

  MultipleConnections = ( true ) #允许多个client端连接

  #AllowMultipleConnectionsFrom = ( 192.168.7)

LogAllConnections = ( true )# 记录日志

admit:   # or grant: 授权

# 哪些机器在什么条件下可以访问什么目录及文件

   /var/cfengine/masterfile/inputs       192.168.7

   /var/cfengine/masterfile/modules      192.168.7

   /var/cfengine            192.168.7

   /home/mayanjie           192.167.7

3.1.3    配置文件/var/cfengine/masterfile/inputs/cfagent.conf

======================================================================

control:#控制段 

moduledirectory = ( /var/cfengine/modules ) #自定义模块目录位置

192_168_7_25::  #IP为192.168.7.25的服务器策略

actionsequence = ( copy shellcommands "module:mymodpy canshu1"

                                        "module:mymodsh canshu1" )

#定义要执行的动作,此处是执行copy shellcommands 和2个自定义模块.注意是按顺序执行

#"module:mymodpy canshu1" 模块名 参数……

192_168_7_55:: #IP为192.168.7.55的服务器策略

actionsequence = ( copy )

192_168_7_139::  #IP为192.168.7.139的服务器策略

any:: #默认策略 定义一些变量

policyhost      = ( 192.168.7.55 )  #管理服务器地址或域名

master_cfinput  = ( /var/cfengine/masterfile/inputs ) #管理服务器上共享策略文件的目录

master_file = ( /var/cfengine/inputs ) #本地策略文件存储路径 

workdir = ( /var/cfengine ) #程序工作目录

shellcommands: #需要执行的shell命令

"/usr/bin/python /var/cfengine/sh/1.py"

copy: #复制动作

192_168_7_25::# 192.168.7.25执行的复制操作 

$(master_cfinput)/1.py         dest=$(workdir)/sh/1.py

                                  mode=755 #复制后的权限

                                  type=checksum #对文件进行对比

                                  backup=false #是否备份

                                  #purge=true #是否与源完全同步,会删除多余的文件和目录

                                  #exclude=*.lst #排除

                                  server=$(policyhost) #管理服务器地址

                                  trustkey=true #自动交换密钥

any::

$(master_file)/1.py         dest=$(workdir)/sh/2.py

                                  mode=755

                                  type=checksum

                                  backup=false

                                  #purge=true

                                  #server=$(policyhost)

                                  #trustkey=true

3.1.4    启动服务

/var/cfengine/bin/cfservd –v

netstat -an|grep 5308查看端口是否开启

3.1.5    CfRun配置

/var/cfengine/inputs/cfrun.hosts

#

# This is the host list for cfrun

# Only these hosts will be contacted by remote connection

domain=soufun.test.com #管理域的根

#access=toreo,mark,haugerud,sigmunds

sl1 #服务器名

192.168.7.139 #或服务器IP

===========================================================

#注所有被控机名称sl1.soufun.test.com都需要在/etc/hosts解析

/var/cfengine/bin/cfrun –v 执行

3.2    被控服务器

/var/cfengine/inputs/update.conf

================================================================

control:

   actionsequence  = ( copy processes tidy )

   domain          = ( soufun.test.com )  #设置管理域的根

   policyhost      = ( 192.168.7.55 )

   master_cfinput  = ( /var/cfengine/masterfile/inputs )#设置主配置文件目录

   master_modules = ( /var/cfengine/masterfile/modules )#设置主模块文件目录

    #定义主文件放置位置,也就是cfagent.conf等需要传到client端的配置文件及自定义文件放置的位置

   AddInstallable = ( new_cfenvd new_cfservd )

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

# solaris::

#  cf_install_dir  = ( /usr/local/cfengine/sbin )

  linux:: #linux系统的安装目录

   cf_install_dir  = ( /usr/local/cfengine/sbin )

  !AllBinaryServers::

     SplayTime = ( 1 ) 时间散列 

copy:

     $(master_cfinput)            dest=$(workdir)/inputs

                                  r=inf

                                  mode=700

                                  type=binary

                                 #exclude=*.lst

                                 #exclude=*~

                                 #exclude=#*

                                  server=$(policyhost)

                                  trustkey=true

     $(master_modules)            dest=$(workdir)/modules

!quetzalcoatal::

     $(cf_install_dir)/cfagent    dest=$(workdir)/bin/cfagent

     $(cf_install_dir)/cfservd    dest=$(workdir)/bin/cfservd

                                  define=new_cfservd

     $(cf_install_dir)/cfexecd    dest=$(workdir)/bin/cfexecd

     $(cf_install_dir)/cfenvd     dest=$(workdir)/bin/cfenvd

                                  define=new_cfenvd

tidy:

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

    #此命令删除outputs/目录中在最后7天尚未访问的所有文件

processes: #进程操作

  new_cfservd::

    "cfservd" signal=term restart /var/cfengine/bin/cfservd # kill cfservd 并重启服务

  new_cfenvd::

    "cfenvd" signal=kill restart "/var/cfengine/bin/cfenvd -H" # kill -9 cfenvd 并重启服务

4    配置范例说明

4.1    控制类

4.1.1    什么是类(classes)

一个类是将一个或多个主机的复杂环境裁剪和限制在一个区域之内的一种方式,并可以通过一个标志或名字而被访问。类对范围有如下描述:一些事情被限制于其中的地方。

4.1.2    可用的类包括

操作系统:linux_i686_2_6_18_8_el5xen

体系结构:linux_i686_2_6_18_8_el5xen__1_SMP

主机名:hostname

IP地址:192_168_7 192_168_7_25 ipv4_192 ipv4_192_168 ipv4_192_68_7 ipv4_192_168_7_25

日期/时间:May Min15_20 Min19 Q2 Tuesday Yr2010

例子1:

actionsequence = ( copy shellcommands "module:mymodpy canshu1" "module:mymodsh canshu1" )

192_168_7_25::类是一个只包含 IP=192.168.7.25这台服务器的类

如果服务器IP=192.168.7.25则会执行actionsequence中定义的操作。

例子2:

Yr2010::时间域在 2010年的全部服务器

4.2    所有的操作均由配置段构成

4.2.1    control,

控制

#设定一些系统变量

actionsequence = ( files copy tidy )

#声明一切变量和自定义类(groups段中声明的)

addclasses = ( myclass )

4.2.2    copy,

复制

         (master_cfinput)            dest=$(workdir)/inputs

4.2.3    tidy

清理删除临时文件等

4.2.4    shellcommands

执行命令

分类执行的

    shellcommands:

       all::

          "/usr/bin/rdate -s ntp1" timeout=30

       redhat.Hr02_Q1::

          "/usr/local/sbin/log_packages" background=true

4.2.5    files

文件操作,检查权限 所有者等。

    files:

      /etc/passwd mode=644 owner=root group=root action=fixall checksum=md5

       /etc/shadow mode=600 owner=root group=root action=fixall

       /etc/group mode=644 owner=root group=root action=fixall

4.2.6    processes

进程操作重起服务,监控进程等

processes:

          "cfexecd" restart "/var/cfengine/bin/cfexecd"

4.2.7    disable,

禁用操作禁用某些命令 或文件等

disable:

      /root/.rhosts

       /etc/hosts.equiv

#其实是重命名为.cfdisabled,权限改为0600。比如:

    disable:

       solaris::

          /usr/bin/eject inform=true syslog=true

甚至可以用于轮转日志:

       /var/log/httpd/access_log size=>5mbytes rotate=4

4.2.8    editfiles

editfiles:

        /etc/crontab

         AppendIfNoSuchLine "0 * * * * root /var/cfengine/bin/cfexecd -F"

      }

4.2.9    admit

授权

admit:

   /usr/local/var/cfengine/inputs *.mydomain.com

   /var/cfagent/bin/cfagent       *.mydomain.com

4.2.10     links

    links:

       /usr/tmp -> ../var/tmp

       /usr/local/bin +> /usr/local/lib/perl/bin

4.2.11    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 )

4.2.12    其他

mailserver, groups, homeservers, binservers, mountables,import, broadcast, resolve, defaultroute, directories, miscmounts,ignore, required,strategies

4.2.13    actionsequence 

actionsequence = ( files copy tidy ) 指定执行动作(按顺序的)必须的,如果只是编辑了配置段但没有加入到actionsequence则不会被执行。

4.3    定义变量

       policyhost      = ( 192.168.7.55 )

        调用

server=$(policyhost)

4.4    自定义模块

待续

问题

问题1、

报错checking Berkeley DB Version... configure: error: This release of cfengine requires BerkeleyDB 3.2 or later

解决方法:export LD_LIBRARY_PATH="/opt/Berkeley/lib"

问题2、

make:报错

make[2]: Entering directory `/root/cfengine-2.2.10/src'

/bin/sh ../ylwrap cfparse.y y.tab.c cfparse.c y.tab.h cfparse.h y.output cfparse.output -- yacc -d

got /root/cfengine-2\.2\.10/src/

../ylwrap: line 82: yacc: command not found

解决 安装byacc-1.9-28.i386.rpm

yum install byacc*

/root/cfengine-2.2.10/missing: line 46: flex: command not found

解决 安装flex-2.5.4a-33.i386.rpm

yum install flex*

继续make

报错

make[1]: Entering directory `/usr/cfengine-2.2.8/src'

/bin/bash ../ylwrap cflex.l .c cflex.c -- /bin/bash /usr/cfengine-2.2.8/missing --run flex  

got /usr/cfengine-2\.2\.8/src/

make[1]: *** [cflex.c] Error 1

make[1]: Leaving directory `/usr/cfengine-2.2.8/src'

make: *** [install-recursive] Error 1

执行make clean

重新执行 configure

在执行 make

通过

执行 make install

安装完成

通过RPM包安装的cfengine

使用cfengine来实现服务器的自动化配置

<a href="http://yahoon.blog.51cto.com/13184/52409">http://yahoon.blog.51cto.com/13184/52409</a>

本文转自 holy2009 51CTO博客,原文链接:http://blog.51cto.com/holy2010/418063