Perl集群配置管理系统Rex简明手册
作者:junjie 发布时间:2023-07-15 20:00:34
Rex 是 Perl 编写的基于 SSH 链接的集群配置管理系统,语法上类似 Puppet DSL。官网中文版见 http://rex.perl-china.com 。本文仅为本人在部门 Wiki 上编写的简介性文档。
常用命令参数
rex 命令参数很多,不过因为我们的环境是 krb 认证的,所以有些参数只能写在 Rexfile 里。所以一般固定在存放了 Rexfile 的 /etc/puppet/webui 下执行命令,很多配置就自动加载了。那么还需要用到的命令参数基本就只有下面几个:
-Tv: 查看当前 Rexfile 里定义了哪些 Task 任务,以及服务器组。
-H: 指定 Task 将在哪些 Host 上执行。这里比较方便的地方是支持 10.5.16.[95..110] 这样的写法。
-G: 指定 Task 将在哪些 Group 上执行。Group 的定义方式很多,Rex 默认支持的有直接在 Rexfile 里通过 group 指令指定,通过 ini 配置文件设定等等。目前我是实现了一个 groups_db 指令,来从我们的 sqlite 里获取。groups_db('cdnbj::nginx') 就会自动生成一个名叫 ‘cdnbj::nginx' 的服务器组,包括 cdnbj 里所有部署了 nginx 的服务器。
-e: 指定一个临时任务。通常是'say run “ipconfig”‘这样的简单命令形式。如果需要复杂逻辑,还是在 Rexfile 里书写 Task。
-q:指定运行日志级别,有 -q 和 -qq。
-d:指定运行日志级别,有 -d 和 -dd。
Rexfile 介绍
参数设置部分:
set connection => "OpenSSH";
user "root";
krb5_auth;
parallelism 10;
这四行指定采用 kerberos 认证,并发 10 个进程执行 ssh 命令。
desc "install puppet agent";
task "puppet_install", sub {
}
before "puppet_install", sub {
}
after "puppet_install", sub {
}
这几行就是 Rexfile 的任务定义主体格式。task 指令定义任务,任务会在具体的 -H 或者 -G 服务器上执行。其他都是可选项,desc内容会在 -Tv 的时候显示;before 和 after 定义的任务会在执行对应 task 之前或之后,在'''rex命令执行处,即10.4.1.21本地'''执行。
常用指令介绍
run
运行命令。如果有回调函数,那么会把 stdout 和 stderr 传给回调函数;如果没有,直接把 stdout 作为返回值。
比如:
say run "uptime";
run "nginx -v", sub { my ($out, $err) = @_; say $err };
file
分发文件。语法类似 Puppet 的 file。支持 source、template、ensure、on_change 等操作。注意:rex 是顺序执行 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 语法了。
也支持传递数组作为 pkg 内容。另外,rex 还 提供了一个 update_package_db 指令,用于执行 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 来收集这些信息,所以还是通过远程执行命令的方式来提供相关内容。目前常用的几个函数(也可以认为是变量)有:
is_redhat
这个用来判断操作系统是否是 RedHat 系列。之前因为有一批 Debian 的机器,所以 Rexfile 里一直有这么个操作逻辑:
if ( is_debian ) {
} elsif ( is_redhat ) {
} else {
}
operating_system_version
这个用来判断具体的操作系统版本号。比如 CentOS5 跟 CentOS6 应该应用的操作就不一样,甚至 CentOS6.5 和 CentOS6.2 也有可能不一致。
比如 Rexfile 里的 1w10 任务:
if ( is_redhat and operating_system_version >= 64 )
}
route
rex 可以收集的信息比 puppet 要多很多,比如网络相关、sysctl 相关等等。Rexfile 里的 1w10 任务用到了 route 信息来获取默认网关和网卡接口。
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
在多台主机执行任务的时候,大多希望在输出的时候看到某条结果是哪个主机返回的。前面 tail 任务就用到了,不过写起来非常复杂的样子。其实 rex 提供给更简洁一点的写法。就是 connection->server。
task 'tellmewhoyouare', sub {
say connection->server;
}
当前连接的服务器的整个信息,也可以通过 get_system_information 指令来获取,这两个指令其实是等同的。不过根据字面意思一般用来不同语境下。
这些信息如果要完整查看,可以通过 dump_system_information 指令来查看。这个命令跟 print Dumper get_system_information() 不一样的是,会把每个键作为单独变量。而这些变量就是可以直接用于 rex 的 template 里的内嵌变量。比如:
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'} %>
这样才行。
猜你喜欢
- 本文实例为大家分享了java模拟ATM功能的具体代码,供大家参考,具体内容如下有三个类:Test.java、Customer.java、Cu
- 近来学习炒股,免不了上班时间看盘,总不能光明正大的用电脑看行情,一直盯着手机影响也不好,容易引起“关注”。所以就想自己做一个网页来达到看盘的
- 树莓派没有显示器,而不想设置固定IP,因为要随身携带外出,每个网络环境可能网段不一样。因此想用python写个脚本,让树莓派开机后自动获取本
- 前言最近在写nuxt项目时候每次新建页面都要去新建然后引入各种需要的依赖很是麻烦,所以想写一个脚本自动生成文件 省去手动新建现写下实现方法
- tkinter的锚点(anchor)问题tkinter中anchor参数(注意,参数的英文都是小写)字母方位n北s南w西e东center中心
- <% Rem Rem ## 在线升级类声明 Class Cls_oUpdate
- 前言Python一般使用Matplotlib制作统计图形,用它自己的说法是‘让简单的事情简单,让复杂的事情变得可能'。用它可以制作折
- 定位色块常用到hsv色彩空间下的颜色阈值,笔者曾经用openmv时,其IDE有自带一个阈值编辑器,使用起来非常方便,现在在linux上跑cv
- php获取 checkbox复选框值的方法 <html xmlns="https://www.aspxhome.net/19
- V5.0之后,我们总结了一些得失。首先要说的是改版的动力。产品设计或产品升级的驱动力只有两个:用户需求和网站目标。之前的我们的多次改版,其驱
- 这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵);这会儿难得有点儿空闲时间,想把前段时间开发微
- SQL Server 2005备份的数据库还原到SQL Server 2012失败,错误信息如下:解决方法由于是还原完整数据库备份,因此删除
- 插入数据MySQL 表中使用 INSERT INTO SQL语句来插入数据。你可以通过 mysql> 命令提示窗口中向数据表中插入数据
- Vue3 新的发展方向(来源于尤大知乎)Vue 3 将在 2022 年 2 月 7 日 成为新的默认版本基于 Vite 的极速构建工具链&l
- 做计算机视觉方向,除了流行的各种深度学习算法,很多时候也要会基础的图像处理方法。记录下opencv的一些操作(图像映射变换),日后可以方便使
- 新闻系统、blog系统等都可能用到将动态页面生成静态页面的技巧来提高页面的访问速度,从而减轻服务器的压力,本文为大家搜集整理了ASP编程中常
- 一、利用xpath进行(全程使用)driver.find_element_by_xpath()二、代码部分与图片内容打开淘宝网站,点击登录,
- 源代码:# dict1 是 字典 , 用来对应相应元素的下标,我们将文件转成列表,对应的也就是文件的下标,通过下标来找文件元素dict1 =
- 1.安装step1step 2 首先是更改安装地址,推荐安装在D盘,如果和我一样C盘容量大的话,也可以不改,直接点击【Next】😄step3
- 一、ASP的平反想到ASP 很多人会说 “asp语言很蛋疼,不能面向对象,功能单一,很多东西实现不了” 等等诸如此类。 以上说法都是错误的,