天天看點

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