複数のLinuxシステムで複数のコマンドを実行できませんか?

複数のLinuxシステムで複数のコマンドを実行できませんか?

私は約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(ホスト別にグループ化されたマルチホスト出力を表示)を含む - dshbakpdshがコマンドを順番に実行するのではなく、複数のホストで並列に実行するため、非常に便利です。私は、クラスタ、仮想マシン、クラウドサーバー、大小の物理デバイスで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

関連情報