私は約50台のUbuntuマシンを持っており、そのマシンで次のコマンドを実行する必要があります。
sudo apt-get install htop
sudo scp -r [email protected]:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r [email protected]:/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 [email protected]:/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
そのため、上記のコマンドを使用してシェルスクリプトファイルを生成commands.sh
し、50台のコンピュータをすべて含む別のファイルを作成しましたmachines.text
。
マイコンピュータのリストは次のファイルにありますmachines.text
。
somemachineA
somemachineB
私のコマンドは次のファイルにありますcommands.sh
。
#!/bin/bash
sudo apt-get install htop
sudo scp -r [email protected]:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r [email protected]:/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 [email protected]:/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"
上記を実行すると、以下のエラーが表示され、次のコマンドは実行されませんsomemachineA
。
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
私が間違っていて、複数のLinuxシステムで複数のLinuxコマンドをどのように実行できますか?
答え1
交換しよう
ssh -t $line 'script /dev/null . /tmp/commands.sh'
渡す
ssh $line 'bash /tmp/commands.sh'
- /dev/nullにスクリプトを書いていますか?
- コマンドを対話的に実行すると、ttyが割り当てられます。
答え2
目的のタスクを実行するために使用できるいくつかのツールがあります。私が一番好きなのはPDSHpdcp
(マルチホストscp)、pdsh
(マルチホストssh)、およびdshbak
(ホスト別にグループ化されたマルチホスト出力を表示)を含む - dshbak
pdshがコマンドを順番に実行するのではなく、複数のホストで並列に実行するため、非常に便利です。私は、クラスタ、仮想マシン、クラウドサーバー、大小の物理デバイスでpdshを何度も使用してきました。作業をうまく行い、設定も簡単です。
pdsh はほとんどのディストリビューションにあらかじめパッケージ化されています。
これを使用するには、コンマで区切られたホスト名のリストとそのホストが属する「グループ」名を含むホストファイル(デフォルトでは/ etc / genders)を作成する必要があります。各ホストは1つ以上のグループに属することができます。たとえば、一部のホストは「webserver」グループに属し、一部のホストは「dbserver」グループに属し、すべてのホストは「all」グループに属します。たとえば、
somemachineA all
somemachineB all
その後、pdcpを使用して "all"グループのすべてのホストにスクリプトをコピーできます。
pdcp -g all commands.sh /tmp/
(注:リモートホストの/ tmpはexec privsを使用してマウントする必要があります。これはほとんどのファイルシステムのデフォルトですが、セキュリティのためにnoexecを使用して/ tmpをマウントすることはまれではありません。この場合、pdcpは別の場所にあります。としてスクリプトするか、例えば、bash /tmp/commands.sh
ちょうど/tmp/commands.sh
?
次に、すべてのホストでスクリプトを実行します。
pdsh -g all /tmp/commands.sh >& /tmp/commands.log
(注:これはパスワードなしのログイン用にすべてのホストにsshが設定されていると仮定します。つまり、パスワードの代わりにsshキーを使用します。そうでない場合は対話型であるため、出力をログファイルにリダイレクトしないことをお勧めします。 )SSHキーアクセス用にリモートホストを設定し、パスワードログインを無効にする必要があります。)
完了したら、dshbakを使用してログを表示できます。
dshbak /tmp/commands.log | less
最後に、pdshなどについて知っておくと便利なのは、基本的にsshの代わりにrshを使用しようとすることです。もはやrshを使う人がいないので、なぜそうなのかわかりません...しかし、修正するのは簡単です。というファイルを/etc/pdsh/rcmd_default
作成しますssh
。