网页浏览总次数

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/

2011年3月12日星期六

程序员的练车日记 - 第二个两小时

左右并线:看反光镜,确认安全,打转向灯并线。困难在于看到后面有车,但估计不了是否安全。一般右反光镜能看到后面的车头,并线是安全的,但看到后面的车身时,并线就有些危险了。

换档咯噔响:离合要踩到底,先把档位推到空档,再推到目标档位,完全抬离合之前不要给油。

车速控制:到路口的时候不管有没有车或行人都要收油,左转弯的时候不要给油。

车位控制:行走的时候左右位置要控制好,避免压线和撞栏杆,一般是评经验完成。

加快起步速度:笨鸟先飞,估计绿灯要亮时先挂档慢松离合。

编译 CentOS 5 内核

如果只是编译驱动程序,只要安装kernel-devel包就可以。

为了安装rpm源码,需要安装 rpm-build,redhat-rpm-config和unifdef:

[root@host]# rpm install rpm-build redhat-rpm-config unifdef

因不建议以root身份编译内核,以普通用户身份创建目录树 ~/rpmbuild:

[user@host]$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
[user@host]$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

从CentOS镜像站点下载 kernel 源码包:

[user@host]$ wget http://mirror.neu.edu.cn/centos/5.5/os/SRPMS/kernel-2.6.18-194.el5.src.rpm
[user@host]$ rpm -i kernel-2.6.18-194.el5.src.rpm 2>&1 | grep -v mockb

版本号 2.6.28-194 需根据实际情况替换。由于 ~/.rpmmacros配置了rpm源码安装环境,kernel源码会被安装到 ~/rpmbuild 目录下。

产生编译用的源码目录树:

[user@host]$ cd ~/rpmbuild/SPECS
[user@host SPECS]$ rpmbuild -bp --target=`uname -m` kernel-2.6.spec 2> prep-err.log | tee prep-out.log

在 ~/rpmbuild/BUILD 目录会发现生成的源码目录树。

安装编译环境:

[root@host]# yum groupinstall "Development Tools"
[root@host]# yum install ncurses-devel

配置内核:
[user@host]$ cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.`uname -m`
[user@host]$ cp configs/kernel-2.6.18-`uname -m`[-type].config .config

[-type] 是可选的配置类型。

编译内核:

首先运行 make oldconfig,然后按照编译内核的步骤进行。为了自定义编译后的内核版本,可编辑Makefile里的 EXTRAVERSION 变量。


参考:
http://wiki.centos.org/HowTos/I_need_the_Kernel_Source
http://wiki.centos.org/HowTos/Custom_Kernel

2011年3月6日星期日

程序员的练车日记 - 第一个两小时

起 步:踩离合,挂1档,给车打火,半抬离合,确认离合已稳,保持离合位置,给油,慢抬离合。注意事项:熄火主要发生在离合抬得太快(给油的时候踩离合的脚不自觉松了)。半抬离合的距离要控制好,感觉车稍微有些抖动的时候就可以稳住离合给油。

找半联洞:踩离合,挂1档,踩刹车,半抬离合找半联洞,找到后确认离合已稳,保持离合位置,抬刹车给油,慢抬离合。熄火主要发生在离合抬得太快(给油的时候踩离合的脚不自觉松了)。

换 档:踩离合,换档,抬离合,给油。注意在踩离合之前不要给油,直到整个换档过程完成才给油。离合要踩到底。

停 车:踩刹车,等车速到可控时,再踩离合,挂空档,轻踩刹车,让车自然停下。注意不可急踩刹车。


他人经验:
左右转弯要抬头看
靠左侧开,视野好
刹车重踩慢放

2011年3月5日星期六

CentOS 5 配置 sendmail 用户转发

如果以用户 A 的身份给用户 B 发送信件,但用户 B 不可达,则 sendmail 会尝试给 A 发退信通知,如果 A 也不可达则会堵住邮件队列。这种情况通常发生在需要发送匿名邮件时,A通常是个伪帐号。

解决办法是把发给A的信件转给一个可达的地址,比如C,在sendmail可通过如下方式实现:

方案一:配置别名(alias),A的别名是C
方案二:通过虚拟帐号(virtusertable)
方案三:通过地址改写

在 O'Reilly Sendmail 4th Edition 这本书有这么一段文字描述

Before undertaking this step, however, see §17.8.59 on page 645 for a description of the FEATURE(virtusertable) which also allows nonlocal addresses to be transformed into inside or outside addresses. Note, too, that the User Database (§23.7.27 on page 942) allows recipient addresses to be changed so that they can be delivered to new hosts, and that the FEATURE(genericstable) in §17.8.19 on page 622 allows sender addresses to be changed to appear to be coming from new hosts. Clearly, there are many ways to achieve the same result, and one of those might be more suitable to your needs than the F=A flag.

方案一和二默认只支持本地域,如果A不属于本地域,则需要做额外的配置。假设本地域是 localdomain,而A的地址是 user-a@example.com,则方案二的实现过程如下:

修改 /etc/mail/sendmail.mc,确认如下行以配置

...
FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable.db')dnl
...
VIRTUSER_DOMAIN(`example.com')
...

修改 /etc/mail/virtusertable,如下
user-a@example.com another-user@another-domain

如果another-user是本地域的用户,则 @another-domain 可以省略。

执行如下命令让配置生效

cd /etc/mail
make
makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable
/etc/init.d/sendmail restart

要flush特定特征的队列里的邮件,比如收件人地址含 leo 的邮件,可用

/usr/sbin/sendmail -qf -qRleo -v

参考 http://kb.bobcares.com/?View=entry&EntryID=153

2011年3月2日星期三

CentOS 5 给sendmail加 sasl 认证

CentOS 5的sendmail包已支持sasl认证,可用如下命令确认:

[root@yylab3 ~]# sendmail -d0.1 -bv
Version 8.13.8
Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS
TCPWRAPPERS USERDB USE_LDAP_INIT

可看到有 SASLv2的输出。

首先编辑 Sendmail 认证配置文件,如下

[root@yylab3 ~]# cat /usr/lib64/sasl2/Sendmail.conf
pwcheck_method:saslauthd
#pwcheck_method:auxprop

32位CentOS该文件的位置是 /usr/lib/sasl2/Sendmail.conf。

编辑 /etc/mail/sendmail.mc,修改相关行如下

define(`confLOG_LEVEL’, `20′)dnl
dnl #DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl
define(`confAUTH_MECHANISMS’, `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl

然后 cd /etc/mail && make 可产生 /etc/mail/sendmail.cf文件。
为了方便mc到cf文件的转换,可安装 sendmail-cf 包。

重启 sendmail 服务让修改生效:
/etc/init.d/sendmail restart


接下来配置 saslauthd,修改 /etc/sysconfig/saslauthd 如下

[root@yylab3 ~]# cat /etc/sysconfig/saslauthd
SOCKETDIR=/var/run/saslauthd
MECH=pam
#MECH=shadow
FLAGS=

运行 /etc/init.d/saslauthd restart 使修改生效,可用 testsaslauthd 测试 saslauthd是否生效:

[root@yylab3 ~]# testsaslauthd -s smtp.sendmail -u leo -p leoleo
0: OK "Success."

现在 sendmail 应该支持认证转发邮件了,可以 telnet 服务器的25端口,

[root@yylab3 ~]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 yylab3.example.com ESMTP Sendmail 8.13.8/8.13.8; Thu, 3 Mar 2011 16:29:55 +0800
ehlo localhost
250-yylab3.example.com Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-STARTTLS
250-DELIVERBY
250 HELP
auth login
334 VXNlcm5hbWU6
bGVv
334 UGFzc3dvcmQ6
bGVvbGVv
235 2.0.0 OK Authenticated


参考 http://www.ispexperts.com.np/?page_id=449