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

2019-10-01 11:23:20刘景俊


    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 里写作: