如何在少数服务器上远程执行多个命令?

如何在少数服务器上远程执行多个命令?

我正在尝试自动化这些步骤,这样我就不需要在每台机器上手动执行此操作。我需要在所有 UNIX 机器上安装最新的应用程序服务器软件 (abc.tar.gz)。

我需要在大约 12 台机器上执行此操作 - "machine1" ... "machine12"。我有一台"machine0"有文件的主机abc.tar.gz,所以我想只从这台机器运行我的脚本,并abc.tar.gz按照以下步骤在所有这 12 台机器中一一安装软件。我的 unix 帐户 ID 是david,我的进程以golden用户身份运行。

abc.tar.gz如果我在“machine1”中安装,这是我遵循的步骤:

david@machine1:~$ sudo scp david@machine0:/home/david/abc.tar.gz .
david@machine1:~$ sudo stop test_server
david@machine1:~$ sudo su - golden
golden@machine1:~$ cd /opt/process
golden@machine1:/opt/process$ rm -rf *
golden@machine1:/opt/process$ exit
david@machine1:~$ sudo cp abc.tar.gz /opt/process
david@machine1:~$ sudo chown -R golden /opt/process
david@machine1:~$ sudo su - golden
golden@machine1:~$ cd /opt/process
golden@machine1:/opt/process$ tar -xvzf abc.tar.gz
golden@machine1:/opt/process$ exit
david@machine1:~$ sudo start test_server

我怎样才能自动执行此操作,以便它可以在所有 12 台机器上一一执行相同的步骤?我的意思是先安装abc.tar.gzmachine1然后安装machine2并继续..我只想运行这个脚本machine0

有什么办法可以自动化执行此操作吗?

答案1

我会推荐一个配置工具,例如织物或者安西布尔为了这。两者都相当容易设置,并且允许您执行在这种情况下所需的更多命令,因为您可以根据您使用的工具构建初始剧本或 fabfile。

Fabric 的文档可以在这里找到:http://docs.fabfile.org/en/1.10/ Ansible 的文档可以在这里找到:http://docs.ansible.com/ansible/intro_getting_started.html

您需要熟悉这两个工具的 SSH 密钥和 SSH 配置,您也可以在文档中找到它们。

答案2

PDSH可以做你想做的事。默认情况下,它将同时在多台计算机上并行运行,但-f如果需要,您可以使用该选项将其限制为一次在每台计算机上运行。

例如

# copy abc.tar.gz to /home/david on machine1..machine12
pdcp -w machine[1-12] abc.tar.gz /home/david

# run a bunch of commands on machine1..machine12
# be careful of quoting
pdsh -w machine[1-12] 'sudo stop service ; do something ; do something else ;
                       sudo start service'

pdsh或者,您可以将pdcpshell 脚本发送到远程计算机并使用单个命令运行它,而不是在命令行上将所有命令放在单引号或双引号中。

pdcp -w machine[1-12] abc.tar.gz /home/david
pdcp -w machine[1-12] ./my-script.sh /tmp
pdsh -w machine[1-12] sh -c '/tmp/my-script.sh'

sh -c(仅在/tmp安装 noexec 的情况下使用)

如果您想避免因多层嵌套引号而感到困惑(例如,如果您需要使用sudoor运行某些命令su,或者嵌入awkorsed或其他脚本),这尤其有用。通常,只需编写一个普通的 shell(awkperl其他)脚本,将其复制到需要的位置,然后在那里运行它,通常要简单得多。

pdsh还允许您使用一个名为 的文件/etc/genders来定义机器以及您分配给它们的(任意)属性。例如

machine0        master,all
machine[1-12]   machines,all
web[1-4]        webservers,all
db[1-2]         mysql,db,all

pdsh您可以在或pdcp命令行上按属性选择机器-g,例如pdcp -g machines abc.tar.gz /home/davidpdsh -g all uname -apdsh -g web,db,master uptime

pdsh是为在 HPC 集群上使用而编写的,但我发现它对于批量管理任何机器组同样有用。

顺便说一句,pdsh是一种不同类型的工具puppetansiblecfengine- 它们用于在一组机器(例如集群或虚拟机场等)上安装和维护一致的环境。 pdsh更多的是在同一组机器上运行一次性命令和/或副本(往返)。

答案3

就脚本而言,您可能会看到类似以下内容的内容:

MACHINES = (
  'machine1'
  'machine2'
  ...
)
for machine in "${MACHINES[@]}"; do
  # insert sequence of setup steps here.
done

这是一种跨多台机器部署脚本的快速而肮脏的方法。当然,还有其他更“专业”的方法来完成这项任务,但通常这已经足够并且可维护。

答案4

我更喜欢用于xargs此类任务。举个例子

#/bin/sh
cat serverlist.txt | xargs -I % sh -c 'ssh root@% 'date';'echo test''

serverlist.txt 包含以换行符分隔的 IP/主机名。

为了获得更大的服务器公园,最好使用ansible.

相关内容