常见问题
这里我们将维护一个常见问题列表和答案.
为什么 run 命令不格式化输出
run 命令在数组上下文里将返回一个数组。
如果你只是想打印标准输出的内容到终端,你可以强制在标量上下文中调用 run 命令。
my $output = run "df -h";
say $output;
怎么获取当前任务运行在哪台服务器上?
my $current_server = connection->server;
怎么给任务传递参数?
task 'mytask', sub {
my $parameters = shift;
my $parameter1_value = $parameters->{parameter1};
my $parameter2_value = $parameters->{parameter2};
};
然后你就可以在命令行上这么运行任务:
rex -H hostname mytask --parameter1=value1 --parameter2=value2
怎么运行一大段代码构成的单个命令?
可以用 ShellBlock 模块。这个模块可通过运行下面命令安装:
$ rexify --use Rex::Misc::ShellBlock
然后你就可以这样远程运行多行 shell 代码了:
use Rex::Misc::ShellBlock;
task "myexec", sub {
shell_block <<EOF;
echo "hi"
EOF
};
查看上面链接中的文档,学习如何用这个模块运行 Perl, Python 和其他语言的代码。
如何在远程执行一个本地脚本?
如果你有一个本地脚本 'files/script',你可以用上面提到的 ShellBlock 模块在远端 运行它。向上面说的那样安装好模块后,用下面这样命令即可:
use Rex::Misc::ShellBlock;
task "myexec", sub {
shell_block template('files/script');
};
如何在远程用其他用户执行一个本地脚本?
在上例基础上,加上一个其他用户的要求,解决办法如下:
task "myexec", sub {
sudo {
command => sub {
shell_block template('files/script');
},
user => 'root'
};
};
怎么检查远程运行命令的退出值?
Rex 会把远程运行的 run
或者 shell_block
语句的退出值存入 $?
变量。
如何利用 Rex 内置的日志记录器来标记 ERROR/WARN/INFO/DEBUG 消息?
Rex::Logger::info("some message"); # for INFO (green)
Rex::Logger::info("some message", "warn"); # for WARN (yellow)
Rex::Logger::info("some message", "error"); # for ERROR (red)
comments powered by Disqus