这几天在弄redmine通过windows 2008域服务器的AD认证问题,目的是让redmine去读AD上的用户帐号,自动注册和登陆。

redmine的配置如下:


以上配置区分大小写,需要注册的有帐号和Base DN这两个地方,填错了就会登陆不了。登陆时提示: 无效的用户名或密码

比如域服务器的域名为:host.domain.com,

帐号需配置成这样:CN=administrator,CN=Users,DC=host,DC=domain,DC=com

Base DN:DC=host,DC=domain,DC=com

我的经验是DN不需要加CN=Users,加了之后只有下图中Users下的用户可以登陆,而Domain Controllers下的用户将登陆不了。

帐号一定要配置成上面这样,类似host.domain.comadministrator或administrator,经过我的测试是不行的。帐号也不一定非要administrator,只要有查看域权限的用户就行。

主机填AD服务器的IP,端口默认为389。

密码是指administrator用户的密码。

 

配置好之后,保存。再用ad的用户直接登陆redmine,可以登陆就说明成功了。

 

另外还需要注意的是:在redmine早一点的版本中,如果AD内的用户没有配置mail或姓名之类的资料,也是登陆不了的。不过在我测试的1.2版本上,如果mail不对或重复,用户在登陆redmaine时,redmine将会让用户重新填写。

 

linux的openldap有一个测试ldap的命令,叫:ldapsearch,配置不成功可以用这个命令测试,如:

ldapsearch -x -h host.domain.com -b "dc=host,dc=domain,dc=com" -D"cn=administrator,cn=users,dc=host,dc=domain,dc=com" -w password > ad.txt

 

ldapsearch参考:http://godoha.blog.51cto.com/108180/73382

今天发现使用svn up之后,/var/log/messages内有个错误:

Oct 28 13:36:48 web1 svn: No worthy mechs found
Oct 28 13:58:14 web1 svn: No worthy mechs found
Oct 28 14:07:18 web1 svn: No worthy mechs found

 

网上查了下,是因由于加密认证的库没有装上导致的,需要安装cyrus-sasl-md5 :

yum -y install cyrus-sasl-md5  

 

用上面的命令安装cyrus-sasl-md5后,再svn up就没报错了。

 

不过svn: No worthy mechs found的问题,并不影响使用。

 

       Redmine是一个基于web的项目管理软件,用Ruby开发。它通过“项目(Project)”的形式把成员、任务(问题)、文档、讨论以及各种形式的资源组织在一起,大家参与更新任务、文档等内容来推动项目的进度,同时系统利用时间线索(Timeline)和各种动态的报表(Report)形式来自动给成员汇报项目进度。

       Redmine功能可以说是非常强大了:

  ● 多项目和子项目支持

  ● 里程碑版本跟踪

  ● 可配置的用户角色控制

  ● 可配置的问题追踪系统

  ● 自动日历和甘特图绘制

  ● 支持 Blog 形式的新闻发布、Wiki 形式的文档撰写和文件管理

  ● RSS 输出和邮件通知

  ● 每个项目可以配置独立的 Wiki 和论坛模块

  ● 简单的任务时间跟踪机制

  ● 用户、项目、问题支持自定义属性

  ● 支持多种版本控制系统的绑定(SVN、CVS、Git、Mercurial 和 Darcs)

  ● 支持多 LDAP 用户认证

  ● 支持用户自注册和用户激活

  ● 多语言支持(已经内置了zh简体中文)

  ● 多数据库支持(MySQL、SQLite、PostgreSQL)

  ● 外观模版化定制(可以使用 Basecamp 、Ruby安装)

 

下面介绍一下在Centos 5.5下的安装,以及和nginx结合的问题。

 

1. 先安装一些相关库

yum groupinstall "Development Tools"
yum install zlib-devel wget openssl-devel pcre pcre-devel make gcc gcc-c++ curl-devel

 

2. 既然是ruby写的,ruby总是要安装的了,ruby最新的是1.9.x版了,但是最新的redmine 1.1版也只是支持ruby1.8版,所以要安装ruby 1.8.x
wget ftp://ftp.ruby-lang.org//pub/ruby/ruby-1.8.7-p334.tar.gz
tar -xvzf ruby-1.8.7-p334.tar.gz
cd ruby-1.8.7-p334

./configure
make -j3
make install

 

3. 安装rubygems,这个东东应该类似perl的module了,我是这么理解的。

wget http://production.cf.rubygems.org/rubygems/rubygems-1.5.1.tgz
tar -zxvf rubygems-1.5.1.tgz
cd rubygems-1.5.1/
ruby setup.rb

 

4. 用gem安装一些redmine运行所需的库
gem install rails
gem update –system
gem install rake rack
gem install i18n
gem install RedCloth
gem install fastthread –no-rdoc –no-ri
gem install mysql –no-rdoc –no-ri — –with-mysql-dir=/usr/bin –with-mysql-lib=/usr/lib/mysql –with-mysql-include=/usr/include/mysql

 

5. 安装passenger,passenger是apache或nginx的一个模块,可以理解为用于apache或nginx和rails的交互的一个proxy。
gem install passenger
passenger-install-nginx-module

 

6. 下载redmine

svn co http://redmine.rubyforge.org/svn/branches/1.1-stable redmine-1.1
cp -rf redmine-1.1 /home/httpd/redmine

 

7. 建立数据库,我是用的mysql,redmine还支持其它的数据库。
mysql -h192.168.1.24 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 169105
Server version: 5.0.77 Source distribution

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.

mysql> create database redmine character set utf8;
Query OK, 1 row affected (0.03 sec)

mysql> quit
Bye

8. 配置redmine
cd /home/httpd/redmine/
cp database.yml.example database.yml

修改配置文件:
vi database.yml

production:
  adapter: mysql
  database: redmine
  host: 192.168.1.24
  username: root
  password: password
  encoding: utf8
 

然后跑下:

cd ..

rake generate_session_store
rake db:migrate RAILS_ENV="production"

如果提示哪些东西的版本不对,就安装哪些:

gem install -v=0.4.2 i18n
gem install -v=2.3.5 rails

然后再跑:
RAILS_ENV=production rake db:migrate

如果提示:
rake aborted!
undefined local variable or method `version_requirements’ for #<Rails::GemDependency:0x7f1bdb0f24d8>

就:
vi /home/httpd/redmine/config/environment.rb
在开头加入:
if Gem::VERSION >= "1.3.6"
    module Rails
        class GemDependency
            def requirement
                r = super
                (r == Gem::Requirement.default) ? nil : r
            end
        end
    end
end

启动redmine:
ruby script/server webrick -e production &

然后可以在浏览器内通过http://ip:3000访问redmine,redmine安装就完成了。

 

9. 用nginx运行redmine

虽然上面这种方式可以运行redmine,但是非常慢,经分析主要是慢在http处理这块,从上面的运行命令就可以看出来,redmine相当于是运行在一个用ruby写的web server上。能不慢嘛。。。

 

所以就需要用nginx运行redmine,配置也很简单:

vim nginx.conf

在http这块加入:

  http {
      …
      passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2;
      passenger_ruby /usr/bin/ruby;
      …
  }

然后加一虚拟主机:

    server {
      listen 80;
      server_name www.yourhost.com;
      root /home/http/redmine/public;   # 注意这边要配置redmine目录下的public目录
      passenger_enabled on;
   }

重启nginx,就可以通过域名访问redmine了。

本文转自:http://www.yoyotown.com/?tag=cfengine

前言:

系统管理员经常陷入一系列的重复任务中:如升级软件包、管理配置文件、系统服务、cron任务以及添加新的配置、修复错误等。这些任务通常是重复低 效的,解决这类任务的第一反应是让他们自动化,于是出现了定制脚本。由于环境复杂,定制脚本和应用程序一再被重复开发,并且很难适合多种平台,灵活性和功 能也很难保证,于是像Puppet这样的自动化配置管理工具便出现了。

在开源世界里,有很多配置工具可供选择,这个领域一些关键的产品有:

Puppet(http://puppet.reductivelabs.com/):

  • Ruby写成的配置管理工具,使用C/S架构,使用declarative language配置客户端。

Cfengine(http://www.cfengine.org):

  • 最先发布的开源配置工具之一,1993年发布,同样是C/S架构,通常应用于教育机构。

LCFG(http://www.lcfg.org/):

  • C/S架构的配置管理工具,使用XML定义配置。

Bcfg2

  • Python编写的C/S架构的配置管理工具,使用规格书和客户机响应配置目标主机。

SmartFrog(http://www.smartfrog.org/):

func(https://fedorahosted.org/func/)

本文档致力于描述使用Puppet管理你的主机、应用程序、后台程序和各种服务。

Puppet简介:

1. Puppet的用途

Puppet是开源的基于Ruby的系统配置管理工具,依赖于C/S的部署架构。主要开发者是Luke Kanies,遵循GPLv2版权协议。从1997年开始Kanies参与UNIX的系统管理工作,Puppet的开发源于这些经验。因为对已有的配置工 具不甚满意,从2001年到2005年间,Kanies开始在Reductive实验室从事工具的开发。很快,Reductive实验室发布了他们的旗舰 产品——Puppet。

2. Pupput的特性

许多系统配置管理工具工作的方式非常类似,如cfengine。是什么让Puppet与众不同?

Puppet的语法允许你创建一个单独脚本,用来在你所有的目标主机上建立一个用户。所有的目标主机会依次使用适用于本地系统的语法解释和执行这个 模块。举例:如果这个配置是在Red Hat服务器上执行,建立用户使用useradd命令;如果这个配置是在FreeBSD主机上执行,使用的是adduser命令。

Puppet另一个卓越的地方是它的灵活性。源于开源软件的天性,你可以自由的获得Puppet的源码,如果你遇到问题并且有能力的话,你可以修改 或者加强Puppet的代码去适用于你的环境。另外,社区开发者和捐献者还在不断增强Puppet的功能。一个大的开发者和用户社区也致力于提供 Puppet的文档和技术支持。

Puppet也是易于扩展的。定制软件包的支持功能和特殊的系统环境配置能够快速简单的添加进Puppet的安装程序中。

3. Puppet的工作模式

Puppet是一个C/S架构的配置管理工具,在中央服务器上安装puppet-server软件包(被称作Puppet master)。在需要管理的目标主机上安装puppet客户端软件(被称作Puppet Client)。当客户端连接上Puppet master后,定义在Puppet master上的配置文件会被编译,然后在客户端上运行。每个客户端默认每半个小时和服务器进行一次通信,确认配置信息的更新情况。如果有新的配置信息或 者配置信息已经改变,配置将会被重新编译并发布到各客户端执行。也可以在服务器上主动触发一个配置信息的更新,强制各客户端进行配置。如果客户端的配置信 息被改变了,它可以从服务器获得原始配置进行校正。

4. Puppet的未来

最后,Puppet是一个年轻的工具,仍然处于开发和发展中。Puppet社区快速壮大,并且许多新的想法不断融入,促使开发、更新和模块每天都在 呈现。

安装配置:

1. PuppetRedHat/CentOS系 统上安装

Puppet是基于Ruby写成的,所以安装前要准备好Ruby环境。在中心的Server上安装puppet-server包,并运行 puppetmasterd进程;在被管理机上安装puppet包,并运行puppetd进程。另外,在每台主机上配置好自己的hostname,之后每 台机器要以hostname区分。

1). 安装ruby环境:

yum install ruby ruby-rdoc

2). 安装puppet

Server端安装:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

yum install puppet-server

chkconfig –level 2345 puppetmaster on

修改hosts,添加下面行:

Vi /etc/hosts

172.16.228.30   puppet.sina.com.cn puppet

172.16.228.29   web1.sina.com.cn web1

客户端安装:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

yum install puppet

chkconfig –level 2345 puppet on

修改hosts,添加下面行:

Vi /etc/hosts

172.16.228.30   puppet.sina.com.cn puppet

172.16.228.29   web1.sina.com.cn web1

3). 启动puppet

Server端首次运行前,编辑/etc/puppet/manifests/site.pp文件,内容可以用最基本的:

# Create “/tmp/testfile” if it doesn’t exist.

class test_class {

file { “/tmp/testfile”:

ensure => present,

mode => 644,

owner => root,

group => root

}

}

# tell puppet on which client to run the class

node web1.sina.com.cn {

include test_class

}

启动Server端:

service puppetmaster start

启动客户端:

/etc/init.d/puppet once -v

这时客户机会去连server,但是由于连接是在ssl上的,而Server还没有sign过客户端的cert,客户机被断开。

到Server端执行:puppetca -list,会显示等待签名的客户端的主机名,执行:puppetca -sign <客户端主机名> 即可为其签名。

在Server端为web1.sian.com.cn授权:

puppetca -list

web1.sian.com.cn

puppetca -sign web1.sian.com.cn

这时再到客户机上启动puppetd,即可看到客户在正常地连接server,并且应用Server上为客户端定制的配置策略。

启动客户端:

/etc/init.d/puppet once -v

4). 测试:

也可以将日志直接打印到终端上进行测试:

Server端:puppetmasterd -d –no-daemonize -v –trace

客户端:puppetd –test –trace –debug

2. puppet配置文件

主配置文件(puppet.conf):

1). 配置文件命名空间:

main 通用配置选项

puppetd 客户端配置选项

puppetmasterd 服务端配置选项

2). main命名空间选项:

confdir 配置文件目录,默认在/etc/puppet

vardir 动态数据目录,默认在/var/lib/puppet

logdir 日志目录,默认在/var/log/log

rundir puppet PID目录,默认在/var/run/puppet

statedir state目录,默认在$vardir/state

statefile state文件,默认在$statedir/state.yaml

ssldir SSL证书目录,默认在$vardir/ssl

trace 发生错误时显示跟踪信息,默认false

filetimeout 检测配置文件状态改变的时间周期,单位秒,默认15秒

syslogfacility 指定syslog功能为user级,默认为daemon级

3). puppetmasterd命名空间选项:

user 后台进程执行的用户

group 后台进程执行的组

mainfestdir mainfests文件存储目录,默认为$confdir/mainfests

mainfest mainfest站点文件的名字,默认为site.pp

bindaddress 后台进程绑定的网卡地址接口

masterport 后台进程执行的端口,默认为8140

4). puppet命名空间选项:

server puppet puppet服务器名,默认为puppet

runinterval seconds puppet应用配置的时间间隔,默认1800秒(0.5小时)

puppetdlockfie file puppet lock文件位置,默认$statedir/puppetdlock

puppetport port 后台进程执行的端口,默认8139

文件服务配置文件(fileserver.conf):

[files]

path /var/lib/puppet/files

allow 121.14.1.*

allow 60.28.228.0/24

allow *.house.sina.com.cn

deny *.sina.com.cn

path定义文件存放路径,通过allow/deny来控制访问权限。

3. puppet命令集

1). puppet 用于执行用户所写独立的mainfests文件

# puppet -l /tmp/manifest.log manifest.pp

2). puppetd 运行在被管理主机上的客户端程序

# puppetd –server puppet.leju.com

3). puppetmasterd 运行在管理机上的服务器程序

# puppetmasterd

4). puppetca puppet认证程序

# puppetca -l

pclient.leju.com

# puppetca -s pclient.leju.com

5). puppetrun 用于连接客户端,强制运行本地配置文件

# puppetrun -p 10 –host host1 –host host2 -t remotefile -t webserver

6). filebucket 客户端用于发送文件到puppet file bucket的工具

# filebucket -b /tmp/filebucket /my/file

7). ralsh 转换配置信息到puppet配置代码

# ralsh user luke

user { ‘luke’:

home => ‘/home/luke’,

uid => ‘100′,

ensure => ‘present’,

comment => ‘Luke Kanies,,,’,

gid => ‘1000′,

shell => ‘/bin/bash’,

groups => [‘sysadmin’,’audio’,’video’,’puppet’]

}

8). puppetdoc 打印puppet参考文档

# puppetdoc -r type > /tmp/type_reference.rst

# puppetdoc –outputdir /tmp/rdoc –mode rdoc /path/to/manifests

# puppetdoc /etc/puppet/manifests/site.pp

(四)工作方式一

在完成了对工作方式二的配置之后,它的基础上我们来配置工作方式一,这种工作方式是由服务器运行cfrun连接远程客户端的cfservd,激活远程主机的cfagent程序。相比第二种方式而言,这种做法实现了集中控制.例如现在有个配置需要立刻更改,而现在还没到客户端定时运行的时间,如果我们一台台的登录到客户机来执行cfagent,显然是十分麻烦的,而且很费时间。有了cfrun就可以在中央机上对所有的客户发出指令让他们立即运行cfagent。

1.配置客户机上的cfservd.conf

在之前的update.conf里面,我们可以看到我们已经在远程客户端上开启了cfservd进程.只是并没有为它们写配置文件,要做也其实很简单,将服务器的cfservd.conf复制过来,然后做适当修改就可以了

# cfservd.conf

# yahoon 2007.11.1

control:

   cfrunCommand = ( "/var/cfengine/bin/cfagent" ) 只需要加入这一句就可以了

    domain = ( yahoon.org )

    AllowConnectionsFrom = ( 192.168.0.0/24 )

    TrustKeysFrom = ( 192.168.0.0/24 )

    AllowUsers = ( root )

    MaxConnections = ( 150 )

    MultipleConnections = ( true )

    #AllowMultipleConnectionsFrom = ( 192.168.0 )

############################################

admit:

#/var/cfengine/rpc_out *.$(domain) 128.39.73

#/file *.$(domain) 128.39.73

    /masterfile/inputs    192.168.0.

    /var/cfengine         192.168.0.

然后重启客户机的cfservd进程

2.编辑服务器上的cfrun.hosts客户端列表

在服务器上写配置文件cfrun.host,只需要把客户机的ip加进去,这里我们先只把115加进去

# This is the host list for cfrun

192.168.0.115

3.在服务器上运行cfrun

现在就可以在服务器上运行cfrun –v

…(部分略)…

Loaded /var/cfengine/ppkeys/localhost.priv

Loaded /var/cfengine/ppkeys/localhost.pub

Looking for a source of entropy in /var/cfengine/randseed

cfrun(0):         ………. [ Hailing 192.168.0.115 ] ……….

Connecting to server 192.168.0.115 to port 0 with options

Loaded /var/cfengine/ppkeys/root-192.168.0.115.pub

Connect to 192.168.0.115 = 192.168.0.115 on port 5308

Loaded /var/cfengine/ppkeys/root-192.168.0.115.pub

………………………………………………………

cfrun:yahoon.org: Strong authentication of server=192.168.0.115 connection confirmed

192.168.0.115 replies..

Connection with 192.168.0.115 completed

到客户机115上查看cfagent的日志文件cfengine.centos2.runlog

Sat Nov 3 07:06:37 2007:Lock removed normally :pid=24784:lock.cfagent_conf.centos2.copy._masterfile_inputs__var_cfengine_inp

uts_192_168_0_114_4831:

Sat Nov 3 07:06:39 2007:Lock removed normally :pid=24784:lock.cfagent_conf.centos2.processes.proc_cfservd__var_cfengine_bin_

cfservd_1704:

Sat Nov 3 07:06:39 2007:Lock removed normally :pid=24784:lock.cfagent_conf.centos2.processes.proc_cfenvd__var_cfengine_bin_c

fenvd__H_4223:

Sat Nov 3 07:06:39 2007:Lock removed normally :pid=24784:lock.cfagent_conf.centos2.tidy._var_cfengine_outputs_3686:

Sat Nov 3 07:06:39 2007:Lock removed normally :pid=24784:lock.cfagent_conf.centos2.shellcommand._bin_echo_Danger__Will_hello

_____Robison______2889:

Sat Nov 3 07:06:39 2007:Lock removed normally :pid=24784:no_active_lock:

按照115的方法将另外一台客户机116也配置好,并加入到cfrun.hosts文件里面,同样执行cfrun –v就可以看到两台主机都运行了.

4.注意:

1)cfrun是读取cfrun.hosts里面的主机列表,一个主机完成之后再连接下一台主机

2)如果现在有多台主机,我现在有紧急情况要运行其中一台的cfagent,例如115这台机,当然你可以ssh到这台主机上直接执行cfagent –v,但是有了cfrun,你只需要在服务器上执行cfrun 192.168.0.115 –v,注意输出的第一行显示Skipping host 192.168.0.116,很明显,它会跳过116来执行。

3)如果客户机的cfservd.conf从服务器拷贝过来后未增加cfrunCommand = ( "/var/cfengine/bin/cfagent" ),那么在服务器执行cfrun –v的时候会报错,同样以115为例,那么cfrun –v的输出会有:

Loaded /var/cfengine/ppkeys/root-192.168.0.115.pub

………………………………………………………

cfrun:yahoon.org: Strong authentication of server=192.168.0.115 connection confirmed

192.168.0.115 replies..

Host authentication failed. Did you forget the domain name or IP/DNS address registration (for ipv4 or ipv6)?cfrun:yahoon.org: Couldn’t recv

cfrun:yahoon.org: recv

Connection with 192.168.0.115 completed

五、小结

1、通过客户机本身的cfexecd 和 服务器的cfrun如果是同时执行cfagent会不会出现冲突?答案是不会,cfengine有很好的锁的机制来避免这种情况的发生.通常来说,客户机定时执行cfexecd来单独激活自己的cfagent和服务器执行cfrun集中激活客户机这两种方式在实际中都会使用,只是场合不同:

定时执行:作为客户机的一种例行的工作安排进行设置,属于日常任务。

集中执行:一般用于特殊情况,要临时激活某些或者所有的客户机执行cfagent,例如临时更改某个主机的配置等。

2、cfengine本身并没有客户机服务器的严格区分,每一台主机同时可以是服务器,也可以当作客户机.这与windows域的概念有些相似,只要客户端上安装了域管理工具,就可以进行域管理的工作.cfengine也是这种概念.当然,一般来讲方便于集中控制,我们会选定一台机作为服务器,例如本文的centos1,其余的机都用作客户机。

3、cfengine的日志系统:cfengine 的日志是相当丰富的,例如在centos1上,在/var/cfengine目录里面cfengine.centos1.runlog,这是cfagent进程的运行日志, cfengine.localhost.runlog这是cfenvd进程的日志.特别注意的是outputs这个目录下面,有很多文件,每次cfexecd运行一次,就会写入一个文件,文件的内容就是cfagent执行的结果.outputs这个目录包括下面的文件都是由cfexecd程序所产生的。

4、 inputs outputs 目录,这两个目录十分容易搞混,上面已经说了 outputs 目录的作用,inputs相对而言就重要得多,它是 cfengine 默认的当前有效配置文件所在的目录.我们之前创建的 *.conf 之类的文件都是在这个目录下。

5、cfengine 的所有程序都带有-v参数,用于详细的输出,这对我们排错调试带来了很大方便.而且对于cfagent程序,-n参数是十分有用的.对于一个刚刚建立的策略文件直接执行是十分危险的,-n参数是模拟执行,所以带上它来运行cfagent就给我们带来很大的安全性,特别是调试的时候.所以首先应该使用

cfagent –n –v

6、cfengine的文档是十分丰富的,我这里也只是仅仅安装上去,告诉大家基本的使用方法,更详细的使用说明可以查阅其官方网站的文档。

5.新加入一台客户机

现在新加入一台客户端机器名centos3 ip 地址 192.168.0.116;

在它上面安装好cfengine,好准备工作:禁用服务,拷贝程序;

要让它能连上服务器的cfservd,那么必须在服务器上添加它的dns记录,在服务器上

#Vi /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               centos1 localhost.localdomain localhost

::1             localhost6.localdomain6 localhost6

192.168.0.115   centos2.yahoon.org

192.168.0.116   centos3.yahoon.org 加上粗体的这行.

然后从centos2上拷贝update.conf到新客户端上,当然是使用sftp是最快的

先切换到inputs目录下

cd /var/cfengine/inputs

运行sftp(过程如下:粗体部分是输入的命令)

sftp 192.168.0.115

Connecting to 192.168.0.115…

The authenticity of host ‘192.168.0.115 (192.168.0.115)’ can’t be established.

RSA key fingerprint is 62:ef:31:0b:ee:89:74:f8:94:4d:ec:11:ee:fa:18:79.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘192.168.0.115’ (RSA) to the list of known hosts.

root@192.168.0.115’s password: 输入115的密码

sftp> cd /var/cfengine/inputs

sftp> dir

cfagent.conf             cfagent.conf.cfsaved     cfservd.conf             update.conf             

sftp> get update.conf

Fetching /var/cfengine/inputs/update.conf to update.conf

/var/cfengine/inputs/update.conf                      100% 774     0.8KB/s   00:00   

sftp> bye

现在就可以测试运行了

[root@centos3 inputs]# cfagent -v -n

输出报错

Checking copy from 192.168.0.114:/masterfile/inputs to /var/cfengine/inputs

Connect to 192.168.0.114 = 192.168.0.114 on port 5308

cfengine:centos3: BAD: keys did not match

cfengine:centos3: Authentication dialogue with 192.168.0.114 failed

cfengine:centos3: Unable to establish connection with 192.168.0.114 (failover)

看来是key的问题, 从服务器和客户端上删掉相关的公钥文件(/var/cfengine/ppkeys目录下)

服务器上删掉root-192.168.0.116.pub

客户端上删掉root-192.168.0.114.pub

重新执行cfagent –v –n

Checking copy from 192.168.0.114:/masterfile/inputs to /var/cfengine/inputs

Connect to 192.168.0.114 = 192.168.0.114 on port 5308

cfengine:centos3: Trusting server identity and willing to accept key from 192.168.0.114=192.168.0.114

Saving public key /var/cfengine/ppkeys/root-192.168.0.114.pub

cfengine:centos3: /var/cfengine/inputs/cfagent.conf wasn’t at destination (copying)

cfengine:centos3: Copying from 192.168.0.114:/masterfile/inputs/cfagent.conf

cfengine:centos3: Object /var/cfengine/inputs/cfagent.conf had permission 600, changed it to 700

cfengine:centos3: Object /var/cfengine/inputs had permission 755, changed it to 700

Performance(Copy(192.168.0.114:/masterfile/inputs > /var/cfengine/inputs)): time=0.4462 secs, av=0.4462 +/- 0.0316

Saving the setuid log in /var/cfengine/cfagent.centos3.log

运行成功!

接下来的工作就又很简单了,加入启动项,加入crontab等.

从加入第二台机器的排错过程,我们可以看到,在cfservd建立连接的时候,有一个交换key的过程

一般在安装好了后在/var/ppkey的目录下已经有了localhost.priv和localhost.pub

上面所说的客户端115连到服务器114的过程就是:

115将自己的localhost.pub给114,

114将其改名为root-192.168.0.115.pub;

同样:114将自己的localhost.pub给115,

115将其改名为root-192.168.0.114.pub

不信的话可以查看115上的localhost.pub与114上的root-192.168.0.115.pub,内容是一样的。

小结:

要跟cfservd建立连接需要两个过程:首先是交换和验证公钥(如果是第一次连接没有对方的公钥就要交换,以后的连接就只需要验证就可以了),然后是服务器对客户机做DNS反向查询(文档里面说的是两次)

2)测试运行

为了安全我们一般使用cfagent -v –n ,带上了-n参数的意思是只是测试,而不会真的执行.

…(部分略)…

Looking for an input file /var/cfengine/inputs/update.conf

Cfengine input file had no explicit version string

Finished with update.conf

———————————————————————

Looking for remote method collaborations

———————————————————————

Finished with RPC

Accepted domain name: yahoon.org

cfagent -n: Running in “All talk and no action” mode

LogDirectory = /var/cfengine

Loaded /var/cfengine/ppkeys/localhost.priv

Loaded /var/cfengine/ppkeys/localhost.pub

Checksum database is /var/cfengine/checksum_digests.db

Default binary server seems to be centos2

*********************************************************************

Update Sched: copy pass 1 @ Fri Nov 2 00:58:17 2007

*********************************************************************

Checking copy from 192.168.0.114:/masterfile/inputs to /var/cfengine/inputs

Connect to 192.168.0.114 = 192.168.0.114 on port 5308

Loaded /var/cfengine/ppkeys/root-192.168.0.114.pub

………………………………………………………

cfengine:centos2: Strong authentication of server=192.168.0.114 connection confirmed

Need this: /var/cfengine/inputs/cfagent.conf wasn’t at destination (copying)

Performance(Copy(192.168.0.114:/masterfile/inputs > /var/cfengine/inputs)): time=0.2393 secs, av=0.2927 +/- 0.1537

*********************************************************************

Update Sched: processes pass 1 @ Fri Nov 2 00:58:17 2007

*********************************************************************

cfengine:centos2: Running process command /bin/ps auxw

Defining classes

DoSignals(cfservd)

Existing restart sequence found (/var/cfengine/bin/cfservd)

cfengine:centos2: Executing shell command: /var/cfengine/bin/cfservd

Defining classes

DoSignals(cfenvd)

Existing restart sequence found (/var/cfengine/bin/cfenvd -H)

cfengine:centos2: Executing shell command: /var/cfengine/bin/cfenvd -H

*********************************************************************

Update Sched: tidy pass 1 @ Fri Nov 2 00:58:17 2007

*********************************************************************

…(部分略)…

说明整个的执行过程是没问题的.粗体部分是连接服务器复制文件的过程.

上面是测试 我们现在不带-n来执行cfagent –v

…(部分略)…

Accepted domain name: yahoon.org

LogDirectory = /var/cfengine

Loaded /var/cfengine/ppkeys/localhost.priv

Loaded /var/cfengine/ppkeys/localhost.pub

Checksum database is /var/cfengine/checksum_digests.db

Default binary server seems to be centos2

*********************************************************************

Update Sched: copy pass 1 @ Fri Nov 2 01:03:31 2007

*********************************************************************

Checking copy from 192.168.0.114:/masterfile/inputs to /var/cfengine/inputs

Connect to 192.168.0.114 = 192.168.0.114 on port 5308

Loaded /var/cfengine/ppkeys/root-192.168.0.114.pub

………………………………………………………

cfengine:centos2: Strong authentication of server=192.168.0.114 connection confirmed

Performance(Copy(192.168.0.114:/masterfile/inputs > /var/cfengine/inputs)): time=0.2774 secs, av=0.2847 +/- 0.1080

Saving the setuid log in /var/cfengine/cfagent.centos2.log

…(部分略)…

*********************************************************************

Main Tree Sched: shellcommands pass 1 @ Fri Nov 2 01:03:33 2007

*********************************************************************

cfengine:centos2:

Executing script /bin/echo Danger,Will Robison!…(timeout=0,uid=-1,gid=-1)

(Setting umask to 77)

cfengine:centos2:/bin/echo Dange: Danger,Will Robison!

cfengine:centos2: Finished script /bin/echo Danger, Will Robison!

Performance(Exec(/bin/echo Danger,Will Robison!)): time=0.0434 secs, av=0.0472 +/- 0.0217

———————————————————————

可以看到已经成功的下载了cfagent.conf文件,并成功运行了

查看这个目录ls /var/cfengine/inputs 确实已经有了cfagent.conf

如果我们立刻再执行一次cfagent –v ,会发现输出有这么一句

cfengine:centos2: Nothing promised for [shellcommand./bin/echo Danger, Will Robison!] (0/1 minutes elapsed)

这句话的意思是这个配置没超过1分钟就执行过,执行的频率太快,cfengine这次是不会执行的。

如果对服务器上的配置文件做了修改,例如

shellcommands:

"/bin/echo Danger, ======Will Robison!" 我只是在这个地方加了几个等号输出.

然后在客户机上执行cfagent –v输出确实是多了===,不过细心的你会发现inputs目录下多了个文件

cfagent.conf.cfsaved

也就是说当cfagent成功下载了最新版本的配置文件后,会将原来的做个备份.

3.设为开机启动

最后我们需要做的就是将cfengine的程序设为自动启动。客户机和服务器上

#vi /etc/rc.d/rc.local    //加上下面这两行

/var/cfengine/bin/cfservd

/var/cfengine/bin/cfenvd –H

然后让cfagent定期执行,也就是定期到服务器上去下载最新的配置文件来执行。运行

#crontab -e

加上下面这句话

0,15,30,45 * * * * /var/cfengine/bin/cfexecd -F

4.排错:

1).原来我想的是本地子网没有域名,以为用ip就够了,就没有给出domain,在客户端运行cfagent –v输出如下

*********************************************************************

Update Sched: copy pass 1 @ Thu Nov 1 21:52:20 2007

*********************************************************************

Checking copy from 192.168.0.114:/masterfiles/inputs to /var/cfengine/inputs

Connect to 192.168.0.114 = 192.168.0.114 on port 5308

cfengine:centos2: Undefined domain name

cfengine:centos2: Id-authentication for centos2.undefined.domain failed

cfengine:centos2: Unable to establish connection with 192.168.0.114 (failover)

Saving the setuid log in /var/cfengine/cfagent.centos2.log

可以看到连接是失败的.因为cfservd要求连接上来的机器必须有DNS记录.

2)如果设置了domain,但是在/etc/hosts中没有连接的客户机的记录的话(也就是说只是在配置文件里面定义了域,而实际查不到dns记录)那么会有下面的错误

*********************************************************************

Update Sched: copy pass 1 @ Thu Nov 1 22:49:42 2007

*********************************************************************

Checking copy from 192.168.0.114:/masterfiles/inputs to /var/cfengine/inputs

Connect to 192.168.0.114 = 192.168.0.114 on port 5308

Loaded /var/cfengine/ppkeys/root-192.168.0.114.pub

………………………………………………………

cfengine:centos2: Strong authentication of server=192.168.0.114 connection confirmed

cfengine:centos2: Server returned error: Host authentication failed. Did you forget the domain name or IP/DNS address registration (for ipv4 or ipv6)?

cfengine:centos2: Can’t stat /masterfiles/inputs in copy

Saving the setuid log in /var/cfengine/cfagent.centos2.log

另外在cfservd.conf和update.conf中,服务器上用于拷贝的目录路径必须正确,否则也会报这个错误的我这里是:/masterfiles/inputs

四、配置过程

(一)下载安装

cfengine的文档里面都是采用源码安装的,经本人测试后发现源码安装经常会出现莫名奇妙的错误,而使用rpm包则是省时省力的方式。

装 cfengine 需要 openssl 和 Berkely DB 这两个依赖性的包,所以在正式安装cfengine前,必须确认你的系统已经安装了db4, db4-devel,一般来说都是系统自带安装好的.然后就可以下载cfengine了, 下载地址http://dag.wieers.com/rpm/packages/cfengine/cfengine-2.2.2-1.el5.rf.i386.rpm

安装也很简单,rpm –ivh cfengine-2.2.2-1.el5.rf.i386.rpm即可,接下来我们就要着手配置了

(二) 准备工作

在服务器和客户端将cfengine安装完成后,要做下面一些准备工作:

为了完全使用源码方便控制,将服务都禁用掉.

[root@centos1 inputs]# chkconfig cfservd off

[root@centos1 inputs]# chkconfig cfenvd off

[root@centos1 inputs]# chkconfig cfexecd off

然后查看会看到所有cfengine的相关服务都禁用了

[root@centos1 inputs]# chkconfig –list|grep cf

将cfengine的程序复制到bin目录下

mv /var/cfengine/bin/cfagent /var/cfengine/bin/cfagent.link///将原来的链接文件重命名///

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

cp /usr/sbin/cfenvd /var/cfengine/bin

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

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

(三)工作方式二

我这里先说工作方式二的原因是它的过程简单,而且很能体现cfengine的本质工作流程时需要的条件是:

服务器运行cfservd (这里当然是需要有cfservd.conf配置文件)。然后还有一个正确的策略文件cfagent.conf供客户机下载

客户机使用cfagent运行update.conf的配置,连接到服务器的cfservd进程,下载cfagent.conf来运行。所以我们接下来要在服务器和客户端上创建所需的配置文件:

服务器上:cfservd.conf cfagent.conf

客户端上:update.conf

我们这里将centos1作为服务器(192.168.0.114,为了简洁,文中会简称为114),centos2作为客户端,文中简称为115

1.对服务器端进行配置

1)创建配置文件cfservd.conf

在/var/cfengine/inputs下创建cfservd.conf

# cfservd.conf

# yahoon 2007.11.1

control:

    domain = ( yahoon.org )

    AllowConnectionsFrom = ( 192.168.0.0/24 )

    TrustKeysFrom = ( 192.168.0.0/24 )

    AllowUsers = ( root )

    MaxConnections = ( 150 )

    MultipleConnections = ( true )

    #AllowMultipleConnectionsFrom = ( 192.168.0 )

############################################

admit:

#/var/cfengine/rpc_out *.$(domain) 128.39.73

#/file *.$(domain) 128.39.73

    /masterfile/inputs    192.168.0.

    /var/cfengine         192.168.0.

然后我们就可以启动cfservd服务,执行

/var/cfengine/bin/cfservd –v

同样带上-v参数来查看详细的输出,利于排错

…(部分略)…

Listening for connections …

cfservd: cfservd starting Fri Nov 2 18:54:49 2007

显示是成功的,进一步查看fservd监听的tcp 5308端口

[root@centos1 inputs]# netstat -an|grep 5308

tcp        0      0 :::5308                     :::*                        LISTEN

2)创建策略文件cfagent.conf

这就是我们即将要发布给客户机运行的策略文件,路径同样是在/var/cfengine/inputs下创建,内容如下

control:

actionsequence = ( shellcommands )

shellcommands:

"/bin/echo Danger, Will Robison!"

3)测试

执行cfagent –v (如果不需要真正执行,可以加上-n参数)

…(部分略)..

cfengine:centos1:

Executing script /bin/echo Danger, Will Robison!…(timeout=0,uid=-1,gid=-1)

(Setting umask to 77)

cfengine:centos1:/bin/echo Dange: Danger, Will Robison!

cfengine:centos1: Finished script /bin/echo Danger, Will Robison!

Performance(Exec(/bin/echo Danger, Will Robison!)): time=0.0529 secs, av=0.0536 +/- 0.0231

———————————————————————

Alerts

———————————————————————

++++++++++++++++++++++++++++++++++++++++

Summary of objects involved

++++++++++++++++++++++++++++++++++++++++

    global

    update

    main

cfengine:centos1: Outcome of version (not specified): Promises still kept 0%, Promises repaired 100%, Promises not kept 0%

运行完全正常,那么就可以将其复制到要发布的目录里面/masterfile/inputs

4)DNS解析

cfservd在做文件传输的时候需要对连接上来的客户机做DNS解析,所以必需要有域名,如果是内部网没有dns服务,就利用/etc/hosts,将客户端加入进来.这里我们选用的域名为yahoon.org,编辑/etc/hosts文件

[root@centos1 inputs]# vi /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               centos1 localhost.localdomain localhost

::1             localhost6.localdomain6 localhost6

192.168.0.115   centos2.yahoon.org

粗体的部分即为加上的对客户机115的解析,要测试是否成功解析了centos2.yahoon.org十分简单,服务器上ping这个域名就可以了..

[root@centos1 inputs]# ping centos2.yahoon.org

centos2.yahoon.org (192.168.0.115) 56(84) bytes of data.

64 bytes from centos2.yahoon.org (192.168.0.115): icmp_seq=1 ttl=64 time=3.74 ms

64 bytes from centos2.yahoon.org (192.168.0.115): icmp_seq=2 ttl=64 time=1.61 ms

2.对客户端进行配置

1)创建配置文件update.conf

在/var/cfengine/inputs下创建 update.conf

# update.conf

# yahoon 2007.11.1

control:

    actionsequence = ( copy processes tidy )

    domain = ( yahoon.org )

    #policyhost = ( my_policy_host )

    policyhost = ( 192.168.0.114 )

    master_cfinput = ( /masterfile/inputs )

    workdir = ( /var/cfengine )

copy:

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

                      r=inf

                      mode=700

                      type=binary

                      server=$(policyhost)

                      trustkey=true

processes:

#    "cfservd" restart /var/cfengine/bin/cfservd

#    "cfenvd" restart "/var/cfengine/bin/cfenvd"

    "cfservd" signal=term restart /var/cfengine/bin/cfservd

    "cfenvd" signal=kill restart "/var/cfengine/bin/cfenvd -H"

tidy:

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

# End

之前我写了一篇nagios监控软件的文章,得到大家的关注,能够将自己的知识分享给大家确实十分高兴。这篇文 章是我最近使用的一个软件cfengine,如果说nagios主要是监控的监(监视)的话,那么cfengine则着重于控。很遗憾国内相关的文章很 少,我就自己尝试写了这篇,希望得到大家的建议。

目录

一、概述
二、工作环境

三、理论知识
(一)cfengine的程序结构及配置文件
(二)cfengine的工作方式

四、配置过程

(一)下载安装
(二) 准备工作
(三)工作方式二

1.对服务器端进行配置
2.对客户端进行配置
3.设为开机启动
4.排错:
5.新加入一台客户机

(四)工作方式一

1.配置客户机上的cfservd.conf
2.编辑服务器上的cfrun.hosts客户端列表
3.在服务器上运行cfrun
4.注意:

五、小结

正文内容:

一、概述

cfengine是一个功能强大的自动化系统管理工具.引用其官网的说法"cfengine是一种 UNIX 管理工具,其目的是使简单的管理的任务自动化,使困难的任务变得较容易。它的目标是使系统从任何状态收敛到一种理想状态。依照它的作者 Mark Burgess 所说,cfengine 总是使您的系统更接近于您所定义的配置; 它决不会使系统变得更糟。

“确实十分的拗口,也难以理解.简单的跟大家说说我的理解,很简单,就是你想你的系统应该是十分样子,你就可以使用cfengine来实现,它可以 保证你的系统总是维持你所希望的那个状态。也就是说有黑客进来了修改了某个重要的配置文件的内容或者权限,也会被cfengine自动修复!

还有一种经常遇到的情况,有少则几台多则成千上万台机器,现在需要临时的改变其一个配置,例如删掉某个帐号,停掉某个服务,一般我们只能不厌其烦的登到每一台机器上重复的完成这些动作,但是有了cfengine,一个命令就可以搞定了.是不是很诱人?

cfengine大概的功能有:

·检查和配置网络接口
·编辑系统和用户的文本文件
·维护符号链接
·检查和设置文件的权限
·删除垃圾文件
·检查重要文件和文件系统的存在
·控制用户脚本和shell命令的执行
·基于类的判定结构
·进程管理

为了节省篇幅,我这里就不一一介绍了,大家可以访问它的官方网站,里面的文档十分丰富

http://www.cfengine.org/

而且它还十分的人性化,给出了中文主页

http://www.cfengine.org/china.phtml

二、工作环境

主机名

操作系统

ip地址

centos1

centos 5

192.168.0.114

centos2

centos 5

192.168.0.115

centos3

centos 5

192.168.0.116

注:centos5 是redhat enterprise 5的重编译开源版本.功能使用与企业版几乎一样.

三、理论知识(一)cfengine的程序结构及配置文件

Cfengine是一个用于设置和维护计算机系统的工具,包含了以下几个组件:

·cfagent 自动配置代理(必须),其配置文件为cfupdate.conf和 cfagent.conf

·cfservd 文件服务和远程激活服务(推荐),其配置文件为cfservd.conf

·cfexecd 计划和报告服务(建议)

·cfenvd 异常检测服务(强烈建议)

·cfrun 远程激活cfagent的方法(需要的时候用这个),其配置文件为cfrun.hosts

·cfshow 检查有帮助的数据库的内容的方法(辅助)

·cfenvgraph 异常检测服务cfenvd的附属工具(辅助)

·cfkey 密匙生成工具(每台主机运行一次)。

在下一节分析cfengine的工作方式的时候会解释几个关键程序及其配置文件的作用

(二)cfengine的工作方式

cfengine有两种工作方式:

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

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

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

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

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

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

客户端自主激活方式:相比上一种要简单一些,客户机独立执行cfagent (可以是定期执行,例如加入cron中)。样的情况下,客户机就不需要有cfservd程序了,整个流程也简化为图中的第3,4步。