NAME

Rex::Commands::Run - Execute a remote command

DESCRIPTION

With this module you can run a command.

SYNOPSIS

my $output = run "ls -l";
sudo "id";

EXPORTED FUNCTIONS

run($command [, $callback])

This function will execute the given command and returns the output.

task "uptime", "server01", sub {
  say run "uptime";
  run "uptime", sub {
    my ($stdout, $stderr) = @_;
    my $server = Rex::get_current_connection()->{server};
    say "[$server] $stdout\n";
  };
};

If you only want to run a command in special cases, you can queue the command and notify it when you want to run it.

task "prepare", sub {
  run "extract-something",
    command     => "tar -C /foo -xzf /tmp/foo.tgz",
    only_notified => TRUE;

  # some code ...

  notify "run", "extract-something";  # now the command gets executed
};

If you only want to run a command if an other command succeed or fail, you can use only_if or unless option.

run "some-command",
  only_if => "ps -ef | grep -q httpd";   # only run if httpd is running

run "some-other-command",
  unless => "ps -ef | grep -q httpd";    # only run if httpd is not running

If you want to set custom environment variables you can do this like this:

run "my_command",
  env => {
    env_var_1 => "the value for 1",
    env_var_2 => "the value for 2",
  };
can_run($command)

This function checks if a command is in the path or is available. You can specify multiple commands, the first command found will be returned.

task "uptime", sub {
  if( my $cmd = can_run("uptime", "downtime") ) {
    say run $cmd;
  }
};
sudo

Run a command with sudo. Define the password for sudo with sudo_password.

You can use this function to run one command with sudo privileges or to turn on sudo globaly.

user "unprivuser";
sudo_password "f00b4r";
sudo -on;  # turn sudo globaly on

task prepare => sub {
  install "apache2";
  file "/etc/ntp.conf",
    source => "files/etc/ntp.conf",
    owner  => "root",
    mode  => 640;
};

Or, if you don't turning sudo globaly on.

task prepare => sub {
  file "/tmp/foo.txt",
    content => "this file was written without sudo privileges\n";

  # everything in this section will be executed with sudo privileges
  sudo sub {
    install "apache2";
    file "/tmp/foo2.txt",
      content => "this file was written with sudo privileges\n";
  };
};

Run only one command within sudo.

task "eth1-down", sub {
 sudo "ifconfig eth1 down";
};