Rex 是 Perl 編寫的基于 SSH 鏈接的集群配置管理系統(tǒng),語法上類似 Puppet DSL。官網(wǎng)中文版見 http://rex.perl-china.com 。本文僅為本人在部門 Wiki 上編寫的簡介性文檔。
常用命令參數(shù)
rex 命令參數(shù)很多,不過因為我們的環(huán)境是 krb 認證的,所以有些參數(shù)只能寫在 Rexfile 里。所以一般固定在存放了 Rexfile 的 /etc/puppet/webui 下執(zhí)行命令,很多配置就自動加載了。那么還需要用到的命令參數(shù)基本就只有下面幾個:
-Tv: 查看當前 Rexfile 里定義了哪些 Task 任務,以及服務器組。
-H: 指定 Task 將在哪些 Host 上執(zhí)行。這里比較方便的地方是支持 10.5.16.[95..110] 這樣的寫法。
-G: 指定 Task 將在哪些 Group 上執(zhí)行。Group 的定義方式很多,Rex 默認支持的有直接在 Rexfile 里通過 group 指令指定,通過 ini 配置文件設定等等。目前我是實現(xiàn)了一個 groups_db 指令,來從我們的 sqlite 里獲取。groups_db('cdnbj::nginx') 就會自動生成一個名叫 ‘cdnbj::nginx' 的服務器組,包括 cdnbj 里所有部署了 nginx 的服務器。
-e: 指定一個臨時任務。通常是'say run “ipconfig”‘這樣的簡單命令形式。如果需要復雜邏輯,還是在 Rexfile 里書寫 Task。
-q:指定運行日志級別,有 -q 和 -qq。
-d:指定運行日志級別,有 -d 和 -dd。
Rexfile 介紹
參數(shù)設置部分:
復制代碼 代碼如下:
set connection => "OpenSSH";
user "root";
krb5_auth;
parallelism 10;
這四行指定采用 kerberos 認證,并發(fā) 10 個進程執(zhí)行 ssh 命令。
復制代碼 代碼如下:
desc "install puppet agent";
task "puppet_install", sub {
}
before "puppet_install", sub {
}
after "puppet_install", sub {
}
這幾行就是 Rexfile 的任務定義主體格式。task 指令定義任務,任務會在具體的 -H 或者 -G 服務器上執(zhí)行。其他都是可選項,desc內(nèi)容會在 -Tv 的時候顯示;before 和 after 定義的任務會在執(zhí)行對應 task 之前或之后,在'''rex命令執(zhí)行處,即10.4.1.21本地'''執(zhí)行。
常用指令介紹
run
運行命令。如果有回調函數(shù),那么會把 stdout 和 stderr 傳給回調函數(shù);如果沒有,直接把 stdout 作為返回值。
比如:
復制代碼 代碼如下:
say run "uptime";
run "nginx -v", sub { my ($out, $err) = @_; say $err };
file
分發(fā)文件。語法類似 Puppet 的 file。支持 source、template、ensure、on_change 等操作。注意:rex 是順序執(zhí)行 Rexfile 的,所以不用設置 Puppet 的 require 指令。
比如:
復制代碼 代碼如下:
file "/etc/yum.repos.d/xiaonei-private.repo",
source => "repos/xiaonei-private.repo";
file "/etc/nginx/nginx.conf",
content => template("templates/etc/nginx/nginx.conf.tpl"),
owner => "nginx",
group => "nginx",
mode => 644,
ensure => 'file',
on_change => sub { service nginx => "restart"; };
file "/etc/nginx/conf.d",
ensure => "directory",
pkg
安裝軟件包,在早期版本命令寫作 install package => "nginx" ,最近改成 pkg 了,更像 Puppet 語法了。
也支持傳遞數(shù)組作為 pkg 內(nèi)容。另外,rex 還 提供了一個 update_package_db 指令,用于執(zhí)行 yum clean all 或者 apt-get update 操作。這點是 Puppet 欠缺的。
比如:
復制代碼 代碼如下:
update_package_db();
my $packages = case operating_system,
Debian => ["apache2", "libphp5-apache2"],
CentOS => ["httpd", "php5"],
pkg $packages,
ensure => "present";
ensure 也支持 present、absent、latest 等幾種含義。同 Puppet。
account
用戶管理原先用 create_user 和 create_group 指令,最近把 create_user 更新為 account 指令。
比如:
復制代碼 代碼如下:
create_group 'puppet';
account "puppet",
ensure => "present",
uid => 509,
home => '/home/puppet',
comment => 'Puppet Account',
expire => '2015-05-30',
groups => ['puppet'],
password => 'puppet',
system => 1,
no_create_home => TRUE,
ssh_key => "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQChUw...";
tail
用來同時觀測多臺主機的日志的最新追加情況。應該是比較有用的一個小功能。代碼如下:
復制代碼 代碼如下:
tail "/var/log/syslog", sub {
my ($data) = @_;
my $server = Rex->get_current_connection()->{'server'};
print "$server>> $data\n";
};
遠程主機詳情相關變量
Puppet 有專門的 Facts 變量來判定遠程主機的詳情。Rex 因為走 SSH 連接,不會在遠程主機上跑一個 agent 來收集這些信息,所以還是通過遠程執(zhí)行命令的方式來提供相關內(nèi)容。目前常用的幾個函數(shù)(也可以認為是變量)有:
is_redhat
這個用來判斷操作系統(tǒng)是否是 RedHat 系列。之前因為有一批 Debian 的機器,所以 Rexfile 里一直有這么個操作邏輯:
復制代碼 代碼如下:
if ( is_debian ) {
} elsif ( is_redhat ) {
} else {
}
operating_system_version
這個用來判斷具體的操作系統(tǒng)版本號。比如 CentOS5 跟 CentOS6 應該應用的操作就不一樣,甚至 CentOS6.5 和 CentOS6.2 也有可能不一致。
比如 Rexfile 里的 1w10 任務:
復制代碼 代碼如下:
if ( is_redhat and operating_system_version >= 64 )
}
route
rex 可以收集的信息比 puppet 要多很多,比如網(wǎng)絡相關、sysctl 相關等等。Rexfile 里的 1w10 任務用到了 route 信息來獲取默認網(wǎng)關和網(wǎng)卡接口。
復制代碼 代碼如下:
my ($default_route) = grep {
$_->{"flags"} =~ m/UG/ (
$_->{"destination"} eq "0.0.0.0" ||
$_->{"destination"} eq "default" )
} route;
if ($default_route) {
my $default_gw = $default_route->{"gateway"};
my $default_if = $default_route->{"iface"};
run "ip route change default via ${default_gw} dev ${default_if} initcwnd 10 initrwnd 10";
};
connection
在多臺主機執(zhí)行任務的時候,大多希望在輸出的時候看到某條結果是哪個主機返回的。前面 tail 任務就用到了,不過寫起來非常復雜的樣子。其實 rex 提供給更簡潔一點的寫法。就是 connection->server。
復制代碼 代碼如下:
task 'tellmewhoyouare', sub {
say connection->server;
}
當前連接的服務器的整個信息,也可以通過 get_system_information 指令來獲取,這兩個指令其實是等同的。不過根據(jù)字面意思一般用來不同語境下。
這些信息如果要完整查看,可以通過 dump_system_information 指令來查看。這個命令跟 print Dumper get_system_information() 不一樣的是,會把每個鍵作為單獨變量。而這些變量就是可以直接用于 rex 的 template 里的內(nèi)嵌變量。比如:
復制代碼 代碼如下:
listen %= $eth0_ip %>:80;
visible_hostname %= $hostname %>
不在 dump_system_information 清單里的變量,也想在 template 里使用的,就必須顯式傳遞。這點和 Puppet 不一致,puppet 在 template 里可以通過 scope.lookupvar() 指令獲取任意pp類里設定的變量,這一點完全無視詞法作用域的存在==!
比如:
復制代碼 代碼如下:
file '/etc/elasticsearch/elasticsearch.yml',
content => template('files/es.yml.tmpl', conf => {
clustername => 'logstash'
});
對應的 es.yml.tmpl 里寫作:
復制代碼 代碼如下:
clustername: %= $conf->{'clustername'} %>
這樣才行。
您可能感興趣的文章:- 南方數(shù)據(jù)企業(yè)網(wǎng)站管理系統(tǒng) V9.0全屏版完整版
- 萬博企業(yè)網(wǎng)站管理系統(tǒng)V2006多語完整版 破解版 下載
- NPOINT免費虛擬主機管理系統(tǒng)windows2003的安裝方法【圖文】
- CentOS服務器下安裝Webmin管理系統(tǒng)的步驟
- CentOS VPS安裝Kloxo免費虛擬主機管理系統(tǒng)
- php小型企業(yè)庫存管理系統(tǒng)的設計與實現(xiàn)代碼
- ASP.NET網(wǎng)站管理系統(tǒng)退出 清除瀏覽器緩存,Session的代碼
- 虛擬主機管理系統(tǒng)DirectAdmin、Websitepanel和Cpanel功能對比評測
- 護衛(wèi)神 主機管理系統(tǒng)使用說明(用戶前臺設置)
- Android實現(xiàn)學生管理系統(tǒng)