How can I automate running commands remotely over SSH to multiple servers in parallel?

前端 未结 20 1610
温柔的废话
温柔的废话 2020-12-12 20:03

I\'ve searched around a bit for similar questions, but other than running one command or perhaps a few command with items such as:

ssh user@host -t sudo su -         


        
相关标签:
20条回答
  • 2020-12-12 20:29

    You can pipe the local script to the remote server and execute it with one command:

    ssh -t user@host 'sh' < path_to_script
    

    This can be further automated by using public key authentication and wrapping with scripts to perform parallel execution.

    0 讨论(0)
  • 2020-12-12 20:29

    Creates hostname ssh command of all machines accessed. by Quierati http://pastebin.com/pddEQWq2

    #Use in .bashrc
    #Use "HashKnownHosts no" in ~/.ssh/config or /etc/ssh/ssh_config 
    # If known_hosts is encrypted and delete known_hosts
    
    [ ! -d ~/bin ] && mkdir ~/bin
    for host in `cut -d, -f1 ~/.ssh/known_hosts|cut -f1 -d " "`;
      do
        [ ! -s ~/bin/$host ] && echo ssh $host '$*' > ~/bin/$host
    done
    [ -d ~/bin ] && chmod -R 700 ~/bin
    export PATH=$PATH:~/bin 
    

    Ex Execute:

    $for i in hostname{1..10}; do $i who;done
    
    0 讨论(0)
  • 2020-12-12 20:32

    Have you looked at things like Puppet or Cfengine. They can do what you want and probably much more.

    0 讨论(0)
  • 2020-12-12 20:32

    For those that stumble across this question, I'll include an answer that uses Fabric, which solves exactly the problem described above: Running arbitrary commands on multiple hosts over ssh.

    Once fabric is installed, you'd create a fabfile.py, and implement tasks that can be run on your remote hosts. For example, a task to Reload Apache might look like this:

    from fabric.api import env, run
    
    env.hosts = ['host1@example.com', 'host2@example.com']
    
    def reload():
        """ Reload Apache """
        run("sudo /etc/init.d/apache2 reload")
    

    Then, on your local machine, run fab reload and the sudo /etc/init.d/apache2 reload command would get run on all the hosts specified in env.hosts.

    0 讨论(0)
  • 2020-12-12 20:34

    Often, I'll just use the original Tcl version of Expect. You only need to have that on the local machine. If I'm inside a program using Perl, I do this with Net::SSH::Expect. Other languages have similar "expect" tools.

    0 讨论(0)
  • 2020-12-12 20:34

    You want DSH or distributed shell, which is used in clusters a lot. Here is the link: dsh

    You basically have node groups (a file with lists of nodes in them) and you specify which node group you wish to run commands on then you would use dsh, like you would ssh to run commands on them.

    dsh -a /path/to/some/command/or/script
    

    It will run the command on all the machines at the same time and return the output prefixed with the hostname. The command or script has to be present on the system, so a shared NFS directory can be useful for these sorts of things.

    0 讨论(0)
提交回复
热议问题