网页浏览总次数

2011年4月7日星期四

cfengine 3 入门

1 快速开始

上 http://www.cfengine.org/pages/source_code 去抓个最新的源码,

wget http://www.cfengine.org/tarballs/download.php?file=cfengine-3.1.4.tar.gz

解压安装

tar zxvf cfengine-3.1.4.tar.gz
cd cfengine-3.1.4
./configure --prefix=/usr/local/cfengine-3.1.4
make
sudo make install

准备运行目录

以root身份运行如下命令:

mkdir -p /var/cfengine/{bin,masterfiles,inputs,outputs}
cp /usr/local/cfengine-3.1.4/sbin/* /var/cfengine/bin
cp /usr/local/cfengine-3.1.4/share/doc/cfengine/inputs/* /var/cfengine/masterfiles
cp /var/cfengine/masterfiles/* /var/cfengine/inputs
/var/cfengine/bin/cf-key
/var/cfengine/bin/cf-agent


现在cfengine已能正常工作,其工作目录为 /var/cfengine。


2 相关概念

cfengine主要的可执行程序有:

cf-agent 执行策略定义文件,产生预期的配置结果
cf-execd 包装程序,配置到crontab里定时执行cf-agent
cf-key 证书生成文件
cf-promises 测试策略定义文件
cf-runagent 远程触发cf-agent的执行
cf-serverd 配置文件分发服务和接收远程执行cf-agent的请求


典型的IDC配置管理如下分布:

一个策略定义点(CVS或者SVN配置仓库)
多个策略分发点,从策略定义点获取策略定义文件
多个策略实施点,从策略分发点获取策略定义文件,并本地执行实施

策略分发点的策略定义文件通常存在 /var/cfengine/masterfiles 目录,
策略实施点的策略定义文件存在 /var/cfengine/inputs 目录,
/var/cfengine/outputs保存策略实施的结果。

系统自带的策略定义文件:

cfengine_stdlib.cf cfengine标准库
failsafe.cf 当出现错误时执行的动作(一般是更新本地的策略定义文件)
promises.cf 这是cf-agent执行时的起点文件
site.cf 机器特定的一些配置
update.cf 更新本地的策略定义文件

cfengine里的每一个配置策略称为一项承诺(promise),即配置要达到的目标。承诺可包含若干个执行体(body),即为达到配置目的要执行的动作。若干个承诺组在一起形成配置束(bundle),它是承诺的容器,类似于子函数的概念。哪些机器适用于哪些承诺,这是由类(class)决定的,如果不指定承诺适用的类,则对任何机器都适用。

cfengine内定了一些承诺(promise),执行过程是无法更改的,但可以更改这些promise的执行体(body)达到定制目的,比如"control"这个执行体可定制大多数cfengine程序的行为。

不管是budnle还是body,它们的定义语法是类似的:

<它是什么> <它对谁起作用> <它的名字>

<它是什么> 这部分是cfengine的关键字,可选为 bundle 或 body
<它对谁起作用> 这部分是cfengine的关键字,可选为 agent, server, perms, signals等
<它的名字> 这是用户自定义的标记


3 建立分布式的配置管理系统

假设策略分发点的ip地址是 192.168.132.1,策略实施点的ip地址是 192.168.132.60。

策略分发点的配置

/var/cfengine/masterfiles/promises.cf:
...
body runagent control
{
...
trustkey => "true";
force_ipv4 => "true";
}
...
body server control
{
...
allowconnects => { "127.0.0.1" , "::1", "192\.168\.132\..*" };
allowallconnects => { "127.0.0.1" , "::1", "192\.168\.132\..*" };
trustkeysfrom => { "127.0.0.1" , "::1", "192\.168\.132\..*" };
skipverify => { "192\.168\.132\..*" };
}
...


/var/cfengine/masterfiles/site.cf:
...
bundle server access_rules()
{
access:
"/var/cfengine/masterfiles"
admit => { "192\.168\.132\..*" };

"/var/cfengine/bin/cf-agent"
admit => { "192\.168\.132\..*" };
...
}
...


/var/cfengine/masterfiles/update.cf:
...
bundle agent update
{
vars:

"master_location" string => "/var/cfengine/masterfiles";

files:

!192_168_132_1::
"/var/cfengine/inputs"

perms => u_p("600"),
# copy_from => mycopy("$(master_location)","localhost"),
copy_from => myrcopy("$(master_location)","192.168.132.1"),
depth_search => recurse("inf"),
action => uimmediate;

192_168_132_1::
"/var/cfengine/inputs"

perms => u_p("600"),
copy_from => mycopy("$(master_location)","localhost"),
depth_search => recurse("inf"),
action => uimmediate;
}
...
body copy_from myrcopy(from,server)
{
trustkey => "true";
source => "$(from)";
servers => { "$(server)" };
compare => "digest";
encrypt => "true";
verify => "true";
force_ipv4 => "true";

}
...


大部分定制的配置选项是关于远程连接授权的,细节可参考cfengine手册。

配置完成后,运行 /var/cfengine/bin/cf-agent 让配置在本地生效。


策略实施点的配置

把测试分发点的 /var/cfengine/masterfiles/update.cf 覆盖本地的 /var/cfengine/inputs/update.cf即可。运行 /var/cfengine/bin/cf-agent 同步其他配置文件并在本地执行实施。


4 排错

修改完配置后,建议在策略分发点以非root用户先执行,没错后再考虑拷贝到策略分发目录。

当以非root用户执行cf-agent或者cf-promises时,cfengine的工作目录为 $HOME/.cfengine。

如遇到问题可启动相关程序的详细输出选项和调试选项,比如 cf-serverd -d2 -v 。


5 参考资料

http://www.cfengine.org/pages/manual_guides

2011年4月6日星期三

如何看每个进程的IO操作

用 sysstat 包的iostat可以查看磁盘的状态,比如

iostat -xkd

但无法看到每个进程的IO操作状态。

sysstat 8.1.7-1有一个工具pidstat可以看进程磁盘活动,

pidstat -d 1

但CentOS不可用。

iotop,iopp,atop……工具很多,但得费点周折,这里有个简单的办法。

下载 iodump,

wget http://aspersa.googlecode.com/svn/trunk/iodump
dmesg -c
/etc/init.d/klogd stop
echo 1 > /proc/sys/vm/block_dump

# allow 30 seconds of stats to be logged
sleep 30

dmesg -c | perl iodump

echo 0 > /proc/sys/vm/block_dump
/etc/init.d/klogd start

参考 http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/