Perl集群配置管理系统Rex简明手册

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'} %>

这样才行。

(0)

相关推荐

  • 护卫神 主机管理系统使用说明(用户前台设置)

    感谢大家使用[护卫神·主机管理系统]V3.1,该版本支持在Windows Server 2003/2008/2012,含32位和64位,直接开设配置WEB站.FTP站,以及SQL Server和MySQL,是您开设和管理虚拟主机的绝好帮手. 但是对于新用户可能在使用上有一些困难,因此请仔细阅读如下说明文档. 本文讲述 护卫神·主机管理系统 第四部分:[用户前台] 1.登录用户前台,在服务器上可以用 http://localhost:6588登录,其他地方可以用自行绑定域名,或者IP+端口的方式登

  • ASP.NET网站管理系统退出 清除浏览器缓存,Session的代码

    1.在系统登陆成功时记录登陆的用户名.密码等信息(登陆功能的部分代码) 复制代码 代码如下: Session["id"] = user.id.ToString(); Session["name"] = user.name.ToString(); Session["pwd"] = user.password.ToString(); Session["time"] = user.LoginTime.ToString(); Sess

  • 虚拟主机管理系统DirectAdmin、Websitepanel和Cpanel功能对比评测

    DirectAdmin Websitepanel Cpanel 安装环境 LINUX Windows 2008 R2 Linux 空间类型 PHP+MYSQL 全能 PHP+MYSQL 实时开通 √ √ √ 实时监控 √ √ √ API √ √ √ IP管理 √ √ √ FTP管理 √ √ √ DNS管理 √ √ √ 邮件管理 √ √ √ Mysql管理 √ √ √ Mssql管理 X √ X 域名管理 √ √ √ 代理下线 √ √ √ 错误页面设置 √ √ √ 在线文件管理器 √ √ √ 网站

  • php小型企业库存管理系统的设计与实现代码

    双专业毕业论文做了一个小型企业库存管理系统,使用PHP&mysql组合进行开发.头一次开发稍微大一点的东西,php也是自学的.这里想跟大家一起分享一下 check_login 模块 复制代码 代码如下: <!--用户登陆检验模块--> <?php session_start(); $workid=$_GET['wid'];//获取工作号 if($workid!=$_SESSION['$workid']||$workid==''){ echo "<script la

  • Android实现学生管理系统

    本文实例为大家分享了Android实现学生管理系统的关键性代码,供大家参考,具体内容如下 局部效果图: 实现代码: 1.布局 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima27.sutdentmanager&qu

  • CentOS VPS安装Kloxo免费虚拟主机管理系统

    对于不想学命令而直接使用centos vps的新手来说,我们推荐一款傻瓜式的虚拟主机管理系统Kloxo,且是免费的,无限绑定域名. Kloxo简介 Kloxo的前身是lxadmin,是一款免费的虚拟主机管理系统,安装简单,功能强大,可以快速地在red hat,centos系列linux系统的主机上搭建LAMP(Linux+Apache+Mysql+Perl/PHP/Python)环境. 安装kloxo Kloxo安装后会搭建LAMP环境,所以需要一个没有安装有php.mysql.apache等服

  • CentOS服务器下安装Webmin管理系统的步骤

    上一次我们介绍了如何安装和使用Kloxo控制面板,但Kloxo只是Web服务器方面的管理,如果你想管理linux系统,还需登录SSH,用一行行命令的管理.如果你想像windows图形化管理系统,Webmin无疑是最好的选择. 什么是Webmin Webmin是目前功能最强大的基于Web的Unix系统管理工具.管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作. 安装Webmin 1.下载Webmin RPM包 复制代码 代码如下: wget http://prdownloads.

  • NPOINT免费虚拟主机管理系统windows2003的安装方法【图文】第1/2页

    NPOINT虚拟主机管理系统下载地址http://www.jb51.net/softs/2219.html 注: 使用 SERV-U FTP软件的用户 安装方法 只要 第一步 至 第八步 就可以了.第一步:注册组件 复制npointdll文件夹到C盘根目录,然后点"开始"-"运行",输入:regsvr32 c:\npointdll\npoint.dll  系统提示: 表示注册成功 第二步:配置运行帐户 新建一个系统帐户(如:npointhost),并设置该帐户属于&

  • Perl集群配置管理系统Rex简明手册

    Rex 是 Perl 编写的基于 SSH 链接的集群配置管理系统,语法上类似 Puppet DSL.官网中文版见 http://rex.perl-china.com .本文仅为本人在部门 Wiki 上编写的简介性文档. 常用命令参数 rex 命令参数很多,不过因为我们的环境是 krb 认证的,所以有些参数只能写在 Rexfile 里.所以一般固定在存放了 Rexfile 的 /etc/puppet/webui 下执行命令,很多配置就自动加载了.那么还需要用到的命令参数基本就只有下面几个:-Tv:

  • MySQL的集群配置的基本命令使用及一次操作过程实录

    1. 先了解一下你是否应该用MySQL集群. 减少数据中心结点压力和大数据量处理,采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据做出共享数据,例如购物车,用户对象等等,存在数据结点里面.其他不共享的数据还维持在各自分布的MySQL数据库本身中. 2. 集群MySQL中名称概念.(如上图) 1)Sql结点(SQL node--上图对应为MySQLd):分布式数据库.包括自身数据和查询中心结点数据. 2)数据结点(Data node

  • 集群配置中IP端口转发

    集群配置中IP端口转发 IP端口转发是集群配置中最为关键的一步,用户要根据自己的情况进行灵活处理.这里分为配置内容和配置过程两部分来讲解. 配置内容 这里将模拟从客户端访问私网中主机的Web服务和FTP服务,验证是否能访问不同的机器.IPVS的使用规则见表1. /sbin/depmod -a/sbin/modprobe ip_masq_ftp/sbin/modprobe ip_masq_portfw.oecho "1" > /proc/sys/net/ipv4/ip_forwar

  • Java应用服务器之tomcat会话复制集群配置的示例详解

    会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来:常用的会话保持有绑定会话,就是前边我们聊的在代理上通过算法或通过给客户端响应首部加cookie这种方式来保持同一cookie或同一ip地址的请求始终发送到同一后端server进行响应:但是这样的会话绑定的方式存在一个问题,就是当后端某一server宕机,那么之前上面的所有会话信息将消失,那么后续的客户端来请求,代理是否要把请求调度到后端宕机的server呢?

  • MySQL5.7 集群配置的步骤

    本次针对的MySQL版本为5.7,首先分别在A服务器和B服务器上安装MySQL,可以通过yum安装也可以通过wget下载直接编译安装.安装方式可以多种多样,但必须要确保安装成功. 1.修改A服务器的my.cnf文件 vim /etc/my.cnf 并添加如下内容: server-id=1 auto_increment_offset=1 auto_increment_increment=2 gtid_mode=on enforce_gtid_consistency=on log-bin=mysql

  • sentinel支持的redis高可用集群配置详解

    目录 一.首先配置redis的主从同步集群 二.sentinel高可用 一.首先配置redis的主从同步集群 1.主库的配置文件不用修改,从库的配置文件只需增加一行,说明主库的IP端口.如果需要验证的,也要加多一行,认证密码. slaveof 192.168.20.26 5268 masterauth hodge01 一主多从的话,就启用多个从库.其中,从库都是一样的方案.本次有两个slave. 2.命令检查 /usr/local/redis/bin/redis-cli -p 5257 -a h

  • Redhat 6.5下MySQL5.6集群配置方法完整版

    1.准备三台服务器 2.为三台机器分别安装Linux操作系统(Oracle Linux / RHEL 6.5 x86_64bit) 3.分别IP地址 管理节点      192.168.1.110        (负责管理整个集群) SQL节点      192.168.1.111        (负责操作数据库) SQL节点      192.168.1.112        (负责操作数据库) 数据节点      192.168.1.111        (负责存储数据) 数据节点     

  • Squid集群做CDN全网加速配置分享

    主服务器群,然后在利用Squid逆向缓存web80端口来加速自己的网站.各大门户网站象163,sina,chinaitlab之类基本都是使用的这种技术,好处是大大的有.比如加速了网络和可以防黑客(因为他们见到的都是CDN的主机)这是利用Squid逆向集群模式做的一种应用 网络环境: 主服务器群:源Web服务器群 位于公网ip:220.XXX.XXX.X port:80(后台才是WEB的服务器) 注: 要保证TCP80,UDP3130在防火墙上是开的(供icp_port通讯使用,多台Squid集群

  • Quartz集群原理以及配置应用的方法详解

    1.Quartz任务调度的基本实现原理 Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基于Java实现.作为一个优秀的开源调度框架,Quartz具有以下特点: (1)强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求: (2)灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式: (3)分布式和集群能力,Terracotta收购后在原来功能基础上作了进一步提升.本文将对该部分相加阐述. 1.1 Quartz 核心元素

  • 以示例讲解Clickhouse Docker集群部署以及配置

    目录 写在前面 环境部署 Zookeeper集群部署 Clickhouse集群部署 1.临时镜像拷贝出配置 2.修改config.xml配置 3.拷贝到其他文件夹 4.分发到其他服务器 配置集群 1.修改配置 2.新增集群配置文件metrika.xml 集群运行及测试 写在前面 抽空来更新一下大数据的玩意儿了,起初架构选型的时候有考虑Hadoop那一套做数仓,但是Hadoop要求的服务器数量有点高,集群至少6台或以上,所以选择了Clickhouse(后面简称CH).CH做集群的话,3台服务器起步

随机推荐