Sunday, February 22, 2009

无人值守批量安装软件

因工作需要, 要在N台机器上安装nrpe, 就有了这样的要求:

知识背景:
1. ports包管理机制(man ports)
1. 脚本语言(此使用perl)
1. ssh的使用

前提:
* 每台机器应该有ssh的public key, 否则每次都输入密码人会晕的

无人值守,第一个是去掉需要人干涉的部分!这就是make包的过程!

有两种情况:
1. make过程出错了
2. configure需要人指定

第一种可以通过N多个if去处理,我是不想这样做的, 大不了登机手工安装,所谓的特殊案例特殊处理.出错记录一下就行了

第二种是可以通过ports的管理机制去处理的. 如下:

make install时有时会出现一个"对话框"的, 这个东西的是使用diaglog( 请man 1 diaglog )程序去产生的. 但是可以使用BATCH变量



#!/usr/bin/env perl

open LogFile, ">/tmp/install_nrpe.log";

my @HostList = (1..100);

for my $Host (@HostList){
$Host = "192.168.54." . $Host;
system "ssh", "-o ConnectTimeOut=1", $Host, "pkg_info|grep nrpe2" ;
if ( $? == 256 ){
print $Host . "\n";
system "ssh", $Host, "cd /usr/ports/net-mgmt/nrpe2/ && sudo make BATCH=yes install";
}else{
print LogFile "can't install at " . $Host . "\n";
}

}

脚本的一点说明:
1. ssh使用了-o ConnectTimeOut=1是表示, 在使用ssh连接时, 超时为1秒, 这样就不会让ssh一直在等待了.
2. $?为ssh运行远程命令的返回码.本例中为"pkg_info|grep nrpe2".

/var: create/symlink failed, no inodes free

还没有见过这样的问题:
/var: create/symlink failed, no inodes free

没有空间了吗?使用df -h 怎么看都还有空间!细看才体会到这里提的inodes的意义!

google了一把,才知道df命令有一个参数是显示partition的inodes的

[jessinio@demo2 /var/db/portsnap]$ df -hi
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/ad0s1a 496M 288M 168M 63% 3912 61878 6% /
devfs 1.0K 1.0K 0B 100% 0 0 100% /dev
/dev/ad0s2d 79G 38G 35G 52% 931619 9808091 9% /data0
/dev/ad0s1e 496M 15M 441M 3% 1146 64644 2% /tmp
/dev/ad0s1f 24G 19G 3.3G 85% 936629 2360649 28% /usr
/dev/ad0s1d 1.9G 1.3G 431M 76% 262862 19760 93% /var
/usr/ports 24G 19G 3.3G 85% 936629 2360649 28% /data0/jails/trac10/usr/ports
/usr/src 24G 19G 3.3G 85% 936629 2360649 28% /data0/trac11/usr/src
/usr/ports 24G 19G 3.3G 85% 936629 2360649 28% /data0/trac11/usr/ports
devfs 1.0K 1.0K 0B 100% 0 0 100% /data0/jails/trac10/dev


在/var目录下发现/var/db/portsnap/files有20000左右个文件:
ls /var/db/portsnap/files|wc -l

使用脚本去删除之:

opendir DIR,"/var/db/portsnap/files";
for (readdir DIR){
system "rm", "/var/db/portsnap/files/" . $_;
}
close DIR;

* BTW: 不知道当时为什么不使用rmdir去删除, SB了!!

Saturday, February 14, 2009

perl中的数据结构

开始学perl,是从<<learning perl >>一书开始的, 这样有个好处:初学者不用也不应该去知道perl太多的约定,不然,perl还没有学到人就怕了.

learning perl一书内容比较简单.感觉很自在.大概浏览了后,发现提到perl两种数据结构:
1. array
1. hash

但是没有提到:
1. 多维array
1. array与hash的混合引用.

这最觉得不爽了, 对于算法不强的人来说这无疑是个灾难!

google了一把, 原来这方面的知识在<<programming perl>>一书中讲到:
* http://docstore.mik.ua/orelly/perl/prog3/ch09_01.htm

回顾一下简单的array和简单的hash的产生方法:
1. array的产生:
my @TiketNum = (1, 19, 20, 45, 56, 19, 42, 56);
2. hash的产生:
my %Person = (
jessinio => "SA",
jacke => "PE",
hyliker => "RP",
zoomq => "LD",
smallfish => "EA"
);

可以看到, array和hash都是使用了"("和")"与产生的.

仅仅利用"()"产生array和hash是不能构造出复杂的数据结构的.如下面的写法就出问题了:
my @TiketNum = ((1, 9), 19, 20, 45,56,19,42,56);
print $TiketNum[0][0]

或者:
my @TiketNum = (1, 19, 20, 45,56,19,42,56);
$TiketNum[0] = (1, 9);
print $TiketNum[0][0];

都是有问题的. hash也是有同样的问题



看了programming perl讲到的数据结构后, 知道了array和hash原来有其它的产生方法:
1. array 使用 "[]"
1. hash 使用"{}"

要想复杂的数据结构只能利用这两种产生方法, 如:

my %Person = (
name => "jessinio",
age => 26,
description => "System administrator",
location => "zhu hai",
LuckNumber => [8, 168, 88] #不是使用"()"的!!
);
print $Person{'LuckNumber'}[0];

* 当然, 可以把所有的"()"用"{}","[]"去代替
产生array和hash后, 去修改存在的array和hash, 使之成为复杂的数据结构, 要使用"[]"和"{}"

如:

my @TiketNum = (1, 19, 20, 45,56,19,42,56);
$TiketNum[0] = [1, 4, 0, 8]; #不是使用"()"的!!
print $TiketNum[0][3];

还可以array的成员为hash:
my @TiketNum = (1, 19, 20, 45,56,19,42,56);
$TiketNum[0] = {1 => 4, 0 => 8}; #不是使用"()"的!!
print $TiketNum[0]{1};


这样就有复杂的数据结构了.



BTW: 没有这两种数据结构真的不是滋味!shell就没有了!!!呃......所以学perl了(原因之一) ^_^

光棍的情人节

今天是2.14,西方情人节,对于我这种光棍来说,一早就接到电信公司打来开通ADSL的电话(为什么不是MM的电话呢? -_-!)。
一早就想在宿舍开通ADSL了,就是RMB的问题,今天终于把网络安装上了。好了,modem在跑了,就是没有router。反正今天不是光棍的节日,决定几个光棍一起去电脑城逛!

电脑城多了一个推销电脑的理由:把netbook送给她(他),呃。。。。。自己都还没有呢

真的很喜欢netbook了。为什么?我的notebook太奶奶的重了!

无事做又去体会了一把M8手机,感觉很好,不知道iphone使用起来是什么感觉。

逛了二三个小时,掏了个D-Link牌的router回。

然后。。。。回到宿舍还没有体会到wireless带来的宅男生活,就跑去hospital去了。。。。囧。。。。。

猜是抽烟抽到肺烂了。。。。。

结果。。。。X光片看不出。。。。总的感觉是:花钱买放心

总后,回宿舍做菜去:picasa照片:http://picasaweb.google.com/jessinio/214#


菜做了,也吃了,是时候搞宅男应该做的事了:玩系统!

玩什么? linux连接到WPA2 wireless network

结果。。。。。还是搞不掂!!!!!!算了,好男不吃眼前亏,有空再搞!

常用的linux无线命令行(WEP的)
http://wirelessdefence.org/Contents/LinuxWirelessCommands.htm

Friday, February 13, 2009

postgres学习之(4): 初步学习总结

在学习postgres时, 常常有些概念或者名词会容易搞错的. 下面总结一下.


pgsql
psql
role
superuser
psql或者createdb等等postgres-client带有的命令行中的--username参数.


在开始前, 应该使用DBMSs和database去区分数据库软件与数据库这两个概念. (^_^)

pgsql是一个用户名, 是安装DBMSs的操作系统中的一个常规用户. 这个常规用户作为操作系统本来的常规用户外, 还有一个特殊的身份: DBMSs软件管理中的root权限者!也就是说, pgsql在操作系统中是一个和nobody没有区别的用户. 但是当pgsql登陆入DMSs软件系统中时, 它就是superuser了! 因为DBMSs内有一套自身的权限机制.


psql是一个交互性命令行.它是用户与DBMSs软件系统交互的接口, 类似kernel与shell的关系.


role是认证系统中的角色, role包括有三个属性:用户名, 密码, 权限(自已总结的, 不是真的), linux操作系统与DBMSs软件系统使用不同的role系统, 但是当DBMSs软件系统使用了trust认证方式时, DBMSs软件系统会把存在于DBMSs中的role的"用户名/密码"与linux系统中的"用户名/密码"进行映射. 当使用非trust认证方式时, 这种映射就不存在.



superuser是超级管理员, 这分为DBMSs软件系统中的superuser和操作系统的superuser, 此superuser非彼superuser


psql或者createdb等等postgres-client带有的命令行中的--username参数, 是指连接到DMBSs软件系统时, 指定使用DBMSs中的role的名字.




个人屁笔记.

postgres学习之(3): database管理之用户认证

postgres有多个认证方式, 如:LDAP, Kerberos, md5, trust等等, 因为本人工作环境中, 会使用到两种:
1. md5
2. trust

现在只记录这两种方式, 其它的到使用到再记录.

postgres的认证方式配置在于: /usr/local/pgsql/data/pg_hba.conf

如下是本人的postgres认证配置:

# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust



trust与md5的区别.

在上篇学习笔记中, 知道了, jessinio用户连接到数据库是无需使用密码的, 再看一下例子, 了解两种认证方式的区别:
[jessinio@study ~]$ psql --host 127.0.0.1 -d jessinio -U pgsql
Welcome to psql 8.2.9, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

jessinio=#


可以连接.

为什么呢? 条件有二:
1. 127.0.0.1是使用了trust认证
1. jessinio在createuser时设置用户的密码!



把pg_hba.conf的trust修改为md5后:
host all all 127.0.0.1/32 trust

重新连接:

[jessinio@study ~]$ psql --host 127.0.0.1 -d jessinio -U jessinio
Password for user jessinio:

要求输入输入密码了! 在createuser时没有指定密码, 现在怎么重新设置密码呢? 答案是使用pgsql这个superuser去干!

# psql -d jessinio -U pgsql
# alter user jessinio with password 'pgsql_password';


这样就重置密码了.

DBMSs都是建议不使用trust的.

在initdb的手册中写得:

--auth=authmethod
This option specifies the authentication method for local users
used in pg_hba.conf. Do not use trust unless you trust all local
users on your system. Trust is the default for ease of installa-
tion.

postgres学习之(2): database管理之用户与DB

为方便日后数据迁移. 一定要学会postgres的管理, 不然, 处于被动环境.

信息来源: <> 和 伟大的man手册
postgres的管理都可以通过交互前端psql命令去完成.

但是为了方便, 还有几个细化的命令(这此命令实际上就是SQL的wrapper!):
1. createdb
注: 一旦创建了一个数据库, 创建者就是该数据库的拥有者和管理员. 一般情况下为用户pgsql, linux下应该为postgres, 因为pgsql一般是数据库管理员使用的帐号, 当然, 不使用pgsql用户权限也可以正常使用createdb, 这取决于postgres的认证方式. 否则会出现下面的信息:

[jessinio@study ~]$ psql
psql: FATAL: database "jessinio" does not exist

[jessinio@study ~]$ createdb jessinio
createdb: could not connect to database postgres: FATAL: role "jessinio" does not exist

上面的主要信息是: jessinio无法使用createdb, 这是因为在postgres服务中, 没有jessinio这个role(角色)!

role表示了:要连接和使用数据库, 第一条件是要在postgres系统中存在相应的role才能登陆!
* 注意: 有了相应的role, 并不等于有了root权限(superuser)!
* 权限总的来说有两种: 对DBMSs的权限, 还有一种是对DB的权限

role如何去创建与修改, 新创建的role对DBMSs有哪些权限?

答案是:createuser

下面是一些选项和它们的默认值:
--superuser
--no-superuser: Ture
--createdb
--no-createdb: Ture
--createrole
--no-createrole: Ture
--login: Ture
--no-login
--inherit
--no-inherit: Ture
--connection-limit: no limit
--encrypted
--unencrypted: Ture
* Ture表示默认值.

下面是实际情况:

[pgsql@study /usr/home/jessinio]$ createuser jessinio
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
CREATE ROLE

好了, 现在有jessinio用户有了对DBMSs操作的role了, createdb吧:
[jessinio@study ~]$ createdb jessinio
CREATE DATABASE

一切顺利!!!!!

去哪里使用万能的SQL呢? 答案是: psql

[jessinio@study ~]$ psql
Welcome to psql 8.2.9, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

jessinio=>

进入了.

留意一下, 就可以知道, jessinio用户登陆是不用输入密码的. 为什么呢?

这与postgres的认证系统有关. postgres的认证方式写在下一篇blog中.