我有大约50台ubuntu机器,我需要在上面运行以下命令:
sudo apt-get install htop
sudo scp -r todd@machineA.host.com:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r todd@machineA.host.com:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp todd@machineA.host.com:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core现在有一种方法是,我可以直接登录到所有50台机器,并手动运行这些命令,这将是肯定的。我不想那样做,因为这很乏味。
假设在这50台机器中,我可以在一个machine1上手动运行超过命令的命令来安装该框上的所有东西,现在从这个machine1中,我可以在剩下的49台机器上运行所有上面的命令,这些机器可以为我安装所有这些东西吗?如果需要,我可以继续输入密码。
以下是机器信息:
machine1.host.com to machine50.host.com我的用户名是todd,而且我还需要确保某些目录对golden用户有权限,所以这就是我要做chown -R golden的原因。
我可以把上面的所有命令都保存在文件中,机器名也可以保存在文件中?做这件事最好的方法是什么?
更新:-
我的机器列表在这个文件machines.txt中
somemachineA
somemachineB我的命令在这个文件commands.sh中
#!/bin/bash
sudo apt-get install htop
sudo scp -r todd@machineA.host.com:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r todd@machineA.host.com:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp todd@machineA.host.com:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core我有一个类似于这个execute.sh的脚本,我以这个./execute.sh machines.txt的方式运行它
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "###################################################"
echo "Machine Name: $line"
scp commands.sh $line:/tmp/commands.sh
ssh -t $line 'script /dev/null . /tmp/commands.sh'
echo "###################################################"
done < "$1"在上面运行之后,我看到下面的错误:
todd@testMachine:~$ ./execute.sh machines.text
###################################################
Machine Name: somemachineA
todd@somemachineA's password:
commands.sh 100% 104 0.1KB/s 00:00
Pseudo-terminal will not be allocated because stdin is not a terminal.
todd@somemachineA's password:
Script started, file is /dev/null
Script done, file is /dev/null
todd@somemachineA:/home/todd$ somemachineB: command not found发布于 2015-09-02 03:08:53
使用这些命令创建一个脚本,然后将脚本放到每台计算机上并运行它。
例:
for x in `cat list-of-hosts.txt`
do
scp command-script $x:/tmp/command-script
ssh -t $x 'script /dev/null . /tmp/command-script'
done或者允许脚本并行运行:
for x in `cat list-of-hosts.txt`
do
scp command-script $x:/tmp/command-script
xterm -e ssh -t $x '/dev/null . /tmp/command-script' &
done发布于 2015-09-02 03:09:46
以下是我的建议:
golden.sh)ssh $user@machine$number 'bash -s' < golden.sh (您需要手动提供$user和$number,或者如果是另一个脚本的一部分)。如果您需要不时地登录到这些机器,您可能会考虑从这些主机导入公共ssh密钥。在这种情况下,整个工作可以完全自动化,因为提供密码将不再需要。
https://stackoverflow.com/questions/32343863
复制相似问题