下载:
安装
[root@mail cfengine-2.2.10]# tar -zxvf cfengine-2.2.10.tar.gz
[root@mail cfengine-2.2.10]# cd cfengine-2.2.10
[root@mail cfengine-2.2.10]# ./configure
[root@mail cfengine-2.2.10]# make
[root@mail cfengine-2.2.10]#make install
启动
[root@mail cfengine-2.2.10]# cp /usr/local/share/cfengine/cfagent.conf.example   /var/cfengine/inputs/cfagent.conf
[root@mail cfengine-2.2.10]# cp /usr/local/share/cfengine/cfservd.conf.example   /var/cfengine/inputs/cfservd.conf
cfengine 配置中最简单和必须的结构:
#comment…. 这是注释,以“ # ”开头,检查和创建 /bin /usr/bin 的链接
control: 定义一个动作类型
actionsequence = ( links ) 注意括号两边必须有空格,将 links 动作假如到 actionsequence ,必须有 actionsequence ,否则 cfengine 什么都不会做, actionsequence 告诉 cfengine 该做什么,以什么顺序去做
links: 告诉 cfengine 下面的是需要创建的链接,可以有多个,按顺序执行,但 links 必须加到 actionsequence 否则将什么不会做
         /bin -> /usr/bin
其中动作类型为下面之一:    groups, control, homeservers, binservers, mailserver, mountables, import, broadcast, resolve, defaultroute, directories, miscmounts,files, ignore, tidy, required, links, disable, shellcommands, editfiles, processes
针对SUNOS 系统和其他系统采用不同动作:
#comment
control:
         actionsequence = ( links )
links:
         sun4:: 以“::”结尾,这个代表 classes( 分类 ) ,用来部署针对该 classes 的动作,只有属于该 classes ,才执行下面的动作, classes cfengine 内定义的
                   /bin -> /usr/bin
         osf::
                   ………
上面例子就可以实现只针对 Sunos 生效,其他类型的系统有另外的操作。
增加另外的action actionsequence
#comment …
control:
         actionsequence = ( tidy links ) 增加了新的动作 tidy ,用来删除文件,先执行 tidy ,后执行 links
links:  
         /bin -> /usr/bin
tidy:   要使下面动作生效,必须将 tidy 加入到 actionsequence
         /tmp pattern=* age=7 recurse=inf 在目录 /tmp 下查找匹配 pattern 的文件,并且该文件有超过 7 天没有被访问,包括其子目录
cfengine 的运行模式:
1.       在所有站点上使用 cron 运行 cfagent
2.       在所有站点上配置 cfservd 服务,这样可以远程使用 cfrun 进行激活,使得配置生效,记得将 cfservd 加入系统自动启动项目,且将所有站点加入到 cfrun.hosts 文件中
一些基本概念:
         复合classes 是以“.”或者”|”连接起来的,如myclass.sun4.Monday:: 只有当host属于myclass且属于sun4且属于Monday的时候才执行下面动作; sun4|ultrix|osf:: host属于sun4 Ultrix osf 的时候执行下面动作
action      
myhost:: 匹配所有的host除了myhost
                            command
mygroup.!myhost:: 匹配mygroup中所有host除了myhost
         预定义classesultrix, sun4, sun3, hpux, hpux10, aix, solaris, osf, irix4, irix, irix64sco, freebsd, netbsd, openbsd, bsd4_3, newsos, solarisx86, aos,nextstep, bsdos, linux, debian, cray, unix_sv, GnU, NT
         变量的使用:control:
                                               myvar = ( /usr/local/…. ) 定义了变量myvar
                                     links:
                                               $(myvar) -> /another/directory 使用变量myvar
         将其他变量值赋值给变量: myvar = ( “$(othervar)” )
         将命令输出赋值给变量: listing = “exec /bin/ls” 之前要加上exec
         内部变量: arch 当前host详细结构说明
                                 binserver          默认存放二进制的host
                                     class                            当前系统类型
                                     date          当前日期
                                     domain     当前host的域
                                     fqhost    hostfully qualified hostname
                                     host          当前hosthostname
                                     ipaddress   IP地址
                                     ostype               $(arch)的简称
                                     split           对字串进行分割
                                     sysadm    管理员的邮箱地址或名字
                                     timezone 当前的时区
                                     year                    当前的年份
                   未定义的变量: control:
                                                                 actionsequence = ( shellcommands )
                                                                 myvar = ( “test string” )
                                                        shellcommands:
                                                                 “/bin/echo $(myvar) $(myvar2)”
                   输出结果:cfengine:host: Executing script /bin/echo test string $(myvar2)
编写模块:
                   control:
                            moduledirectory = /usr/local/cfengine/modules 存放模块的路径
                            actionsequence =(
                                                                 files
                                                                 module:myplugin.specialclass
                                                                 “module:argplugin.specialclass arg1 arg2”
                                                                 copy
                                                                 )
                   模块可以使用各种语言编写, perl shell 都可以
         通用 class any :: any 代表所有的 class
                                               actions
         访问控制:     control:
                                                        access = ( mark root )
         目录或文件的编辑于遍历: files:
                                                                           /usr/local/bin m=0755 exclude=*.ps action=fixall
                                                                           /usr/local/bin m=0755 include=*.os ation=fixall
         挂载文件目录: control:
     site      = ( mysite )
                                          domain    = ( mysite.country )
                                            sysadm    = ( mark )
                                           netmask   = ( 255.255.255.0 )
                                 actionsequence =
                                                (
                                                           mountall 挂载每个 host 上已经定义的文件系统
                                                         mountinfo 显示每个 host 上已经成功挂载的文件系统
                                                         addmounts 检查 host 文件系统是否都已经挂载
                                                         mountall
                                                           links
                                                     )
              groups:
                                 MyGroup =
                                       (
                                                host1
                                                 host2
                                                binserver1
                                                 binserver2
                                       )
homeservers:
                                 MyGroup:: host1
binservers:
                                           MyGroup.sun4::   server1
                                          MyGroup.ultrix:: server2
mailserver:
                                           host1:/usr/spool/mail
mountables:   告诉 cfengine 哪些目录是可以挂载的
                                 host1:/mysite/host1/u1
                                 host1:/mysite/host1/u2
                                 server1:/mysite/server1/local
                                 server2:/mysite/server2/local
links:
                                        /usr/local -> /${site}/${binserver}/local
循环列表: control    
                                     split = ( “ “ ) 使用空格做分隔符
                                     mylist = ( “mark ricky bad-dude” ) 定义了列表,将列表赋值给 mylist
                               tidy:
                                               /mnt/home1/$(mylist) pattern=*.cfsaved age=1 将遍历 mylist 中的所有目录,匹配 .cfsaved 且一天没有访问的文件
         运行用户脚本: control:
                                                  cfbin = ( /local/gnu/lib/cfengine/bin ) 定义了两个变量
                                                  backupdir = (/iu/dax/backup )
                                        shellcommands: 运行 shell 命令
                                                        “$(cfbin)/cfbackup –p –f $(backupdir) –s /iu/nexus/u1”
         管理 acl      files:
                                               $(HOME)/myfile acl=acl_alias1 action=fixall
                                     acl:
                                                        { acl_alias1
                                                        method:append
                                                        fstype:solaris
                                                        user:len:rwx
}
                                                       
                                                        { acl_alias2
                                                        method:append
                                                        fstype:dfs
                                                        user:/…/iu.hioslo.no/cell_admin:wx   cell_admin 用户 wx 的权限
                                                        group:/…/iu.hioslo.no/acct-=admin:rx 给用户组 acct-admin rx 的权限
                                                        user:/…/iu.hioslo.no/root:rx
                                                        user:*:-x
}