Perl叢集組態管理系統Rex簡明手冊_perl

來源:互聯網
上載者:User

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

這樣才行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.