Category Archives: 运维

LSI MegaSAS RAID 驱动 BUG

表现为使用MegaCli工具在线创建或者移除VD时不更新linux的设备文件,只有重启后才能更新。 已知在内核驱动/drivers/scsi/megaraid/megaraid_sas.c的00.00.04.17.1-rc1版本修复。 另外,DELL、IBM等某些服务器上,不使用RAID卡会出现硬盘的slot编号和linux的设备文件顺序不一致的情况,据说创建单盘RAID0能够解决。

Posted in 运维 | Tagged , , , | 1 Comment

关于moosefs的changelog

如果metalogger和master的连接中断过,那么moosefs metalogger的changelog可能会丢失部分log,导致使用mfsmetarestore的时候失败。所以mfs迁移master不推荐使用metalogger进行restore。可以考虑rsync或者共享存储,如drbd。

Posted in moosefs | Tagged , , , | 3 Comments

puppet的generate函数

这个函数不能直接执行shell脚本,需要/usr/bin/env等做为第一个参数,如: $hostalias = generate(“/usr/bin/env”, “/tmp/genhname.sh”, “172.16.0.133″) 其次,这个函数的执行的是master上的脚本,它仅仅是将client上的变量拿回来,在本地执行;也就是说/tmp/genhname.sh要位于master的相应路径上,且有执行权限,不需要将脚本文件分发到client。

Posted in puppet, 运维 | Tagged , | 5 Comments

puppet dashboard的安装

以下过程基于debian: 系统要求: ruby >= 1.8.1 rake >= 0.8.3 (在lenny里版本不够,需要squeeze,不过我觉得使用gem应该也能装) mysql ruby mysql bindings(我个人觉得对应的包为libmysql-ruby,不过网上的另一个deb包依赖的是dbconfig-common libdbd-mysql-ruby) 安装过程: 1. 获得最新源码: git clone git://github.com/reductivelabs/puppet-dashboard.git 2. 设置数据库: cd puppet_dashboard/config cp database.yml.example database.yml 编辑database.yml,在development域中加入数据库用户名、密码,然后进行数据库初始化(确保mysql服务已经启动): rake install (中间可能需要运行rake gem:install) 3.设置puppetmaster: 部署lib文件:(在puppet 2.6版本中不再需要) cp puppet_dashboard/lib/puppet/puppet_dashboard.rb /usr/lib/ruby/1.8/puppet/reports/ 这点和readme中描述不符,不过作者的方法怎么实验都不成功。:( 然后在/etc/puppet/puppet.conf的puppetmasterd域中加入: … Continue reading

Posted in puppet, 运维 | Tagged , | 3 Comments

关于puppet的import

import “autofs” import “autofs/init.pp” import “autofs/util/stuff.pp” 第一句与第二句会在模块路径中寻找autofs/manifests/init.pp并载入。 第三句只载入autofs/util/stuff.pp文件。 puppet 0.23.1之后的版本,位于modulepath下(默认是/etc/puppet/modules)的模块会被自动载入,所以不需要手动载入此目录下的各个模块了。 当你引用autofs模块中的craziness类时,puppet会自动在autofs模块下寻找craziness.pp文件中的这个类。使用这个技巧就可以不在模块的init.pp中写入额外的import了。

Posted in puppet | Tagged , , | Leave a comment

Apache在子目录取消访问控制

Removing controls in subdirectories The following example shows how to use the Satisfy directive to disable access controls in a subdirectory of a protected directory. This technique should be used with caution, because it will also disable any access controls … Continue reading

Posted in 运维 | Tagged , , | 2 Comments

nginx的log

access_log的最小作用域是location,关闭方式是:access_log off; error_log的最小作用域是http,关闭方式是:error_log /dev/null; 如果一个请求是404之类的,则access_log中记录404,error_log同时会记录open filename failed等错误,如果不需要,可以改变http域error_log的记录等级,也可以直接关闭(还有log_not_found选项可以关闭记录open filename failed错误)。

Posted in nginx, 运维 | Tagged , , , | Leave a comment

nginx的rewrite

设置nginx的rewrite如果替换项是以http://开头,则起的是redirect的作用,即使最后的参数是last不是redirect,例如: rewrite ^(.*)$ http://aaa.bbb.com/ccc$1 last; 浏览器端会得到302。 nginx的文档里提到: redirect – returns temporary redirect with code 302; it is used if the substituting line begins with http:// 另外,rewrite后的host的使用顺序如下: 当请求的http头里的host匹配sever_name里的任一host时,使用此host 若不匹配,或者为空,使用server_name的第一个host 若没有设置server_name,则使用本机的hostname 若要一直使用http头里的host,则将server_name设置为:servername _ *;(下划线不能少,因为 * 不能做为sever_name第一项的开头)

Posted in nginx, 运维 | Tagged , | Leave a comment

apt-get与aptitude

aptitude install默认会安装recommends的包,etch中apt-get不会,而lenny中则和aptitude相同。两者都不会安装suggests。 aptitude remove会清除所有不需要的包,apt-get remove只会清除指定包,但是有autoremove选项。 如果希望只安装必要的包的话,可以用apt-get –no-install-recommends,aptitude可以在设置里取消Install recommended packages automatically。 或者,在/etc/apt/apt.conf中根据需要写入以下配置: [code] APT::Install-Recommends "false"; APT::Install-Suggests "false"; Aptitude::Recommends-Important "false"; Aptitude::Keep-Suggests "false"; [/code] 附录: 2.2.8 软件包依赖关系 Debian 软件包管理系统依赖声明,它描述了这一事实:一些软件包需要其它软件包被安装才能正常运行或运行得更好。 软件包 A 依赖(depends)软件包 B:要运行A必须安装 B。在有些情况下,A 不仅依赖 B,还要求 B 的特定版本。版本依赖通常有最低版本限制,A 更依赖于B的最新版而非某个特定版本。 软件包 A 推荐(recommends)软件包 B:软件包维护者认为所有用户都不会喜欢缺少某些功能的 … Continue reading

Posted in debian, 运维 | Tagged , , , | Leave a comment

cfengine的哲学

最近在做基于cfengine的二次开发,目前正在进行的是系统初始化的工作。 开始的时候我直接对现有的shell脚本进行cfengine化,然而随着工作的深入,越发疑惑这么做的意义,使用脚本逐句执行的方式来运用cfengine有什么优势呢?不就是相当于使用了cfengine语法的“脚本”么?而且系统初始化后,如何保证这个状态呢?难道要再写一套“脚本”? 随后和老大的一番讨论让我发现我还是没有理解透彻cfengine对于promise的定义。即,promise是为了保证一种状态的不变。用户需要定义的就是这个状态。当然,对于复杂的cfengine没有提供原生支持的状态,还需要定义修复方法。 所以,使用cfengine首先要确定的是要达到什么状态,其次是状态意外改变后如何修复。 对于系统初始化,首先用cfengine描述出系统应达到的状态,而第一次运行,整个系统明显是“偏离”这个状态的,于是修复过程开始。

Posted in cfengine, 运维 | Tagged , | 4 Comments