我正在尝试自动化这些步骤,这样我就不需要在每台机器上手动执行此操作。我需要在所有 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.gz
,machine1
然后安装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
或者,您可以将pdcp
shell 脚本发送到远程计算机并使用单个命令运行它,而不是在命令行上将所有命令放在单引号或双引号中。
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 的情况下使用)
如果您想避免因多层嵌套引号而感到困惑(例如,如果您需要使用sudo
or运行某些命令su
,或者嵌入awk
orsed
或其他脚本),这尤其有用。通常,只需编写一个普通的 shell(awk
或perl
其他)脚本,将其复制到需要的位置,然后在那里运行它,通常要简单得多。
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/david
或pdsh -g all uname -a
或pdsh -g web,db,master uptime
。
pdsh
是为在 HPC 集群上使用而编写的,但我发现它对于批量管理任何机器组同样有用。
顺便说一句,pdsh
是一种不同类型的工具puppet
或ansible
等cfengine
- 它们用于在一组机器(例如集群或虚拟机场等)上安装和维护一致的环境。 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
.