Rex中使用参数以及获取server的名称

用了一段时间rex, 感觉还是相当好用的.

之前有这样一个需求: 远程有若干台机器, 每台机器上部署了一个程序, 这个程序需要加载一个特定的文件. 现在问题来了: 本地有这个程序的若干个版本, 同时有若干个对应机器程序需要加载的文件. 如何通过rex来升级指定的版本? 如何将不同的文件传输到不同的机器上呢?

最简单的一个办法是通过命令行参数来传递升级的版本, 然后在task中获取当前的server名称, 通过server名称来传输对应的文件.

传递参数

之前看文档和搜索都没有找到, 偶然在浏览谷歌讨论组时发现了这个帖子. 在执行task时, 可以直接使用@ARGV变量. 例如执行rex -E test task_name param1 param2时, rex的参数会从@ARGV中被移除. 因此$ARGV[0], $ARGV[1]分别对应task_name, param1. 这个好;)

获取当前server

可以直接在task中使用connection. 该方法返回当前的连接对象. 然后可以通过该对象获取server的名称.

来段简单的代码测试下:

Rexfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use DDP;

environment fun => sub {
    user "foo";
    password "oof";
    pass_auth;

    group servers => "127.7.2.1";
};

desc "have a simple test";
task "dd", group => 'servers', sub {
    my $current_connection = connection;

    p $current_connection->{server};

    p @ARGV;
    print "hello world\n";
};

Comments