少数のサーバーでリモートで複数のコマンドを実行するには?

少数のサーバーでリモートで複数のコマンドを実行するには?

各コンピュータで手動でこれを行う必要がないように、これらの手順を自動化したいと思います。すべてのUNIXコンピュータに最新のアプリケーションサーバーソフトウェア(abc.tar.gz)をインストールする必要があります。

約12台のコンピュータでこれを行う必要があります"machine1" ... "machine12""machine0"ファイルがあるホストが1つあるため、abc.tar.gzこのシステムでのみスクリプトを実行し、abc.tar.gz以下の手順に従って12のシステムすべてにソフトウェアを1つずつインストールしようとします。私のUnixアカウントIDはdavid、私のプロセスはgoldenユーザーとして実行されています。

abc.tar.gzmachine1にインストールする場合は、次の手順に従ってください。

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台のコンピュータで同じ手順を1つずつ実行するように自動化するにはどうすればよいですか?まずインストールabc.tar.gzしてmachine1からインストールmachine2して続行してください。このスクリプトを実行したいですmachine0

これを自動化する方法はありますか?

答え1

次の設定ツールをお勧めします。構造またはアンシプールこのために。どちらも設定が非常に簡単で、使用しているツールに応じて初期のプレイブックまたはfabfileを構築できるため、この状況で必要なものよりも多くのコマンドを実行できます。

ファブリックに関するドキュメントはここにあります。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'

pdshpdcpまたは、コマンドラインのすべてのコマンドを一重引用符または二重引用符で囲むのではなく、リモートコンピュータにシェルスクリプトを送信して単一のコマンドで実行することもできます。

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/tmpnoexecがインストールされている場合にのみ使用されます)

これは、複数のレベルのネストされた引用符との混同を避けたい場合に特に便利です(たとえば、組み込みまたは他のスクリプトをsudo使用していくつかのコマンドを実行する必要がある場合)。通常、通常のシェル(または他の)スクリプトを作成して必要な場所にコピーして実行する方がはるかに簡単です。suawksedawkperl

pdsh名前付きファイルを使用して、マシンと/etc/gendersそのマシンに割り当てる(任意の)属性を定義することもできます。例えば

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

pdshpdcpまたは、コマンドラインの属性-g(または、pdcp -g machines abc.tar.gz /home/davidまたはpdsh -g all uname -a)としてシステムを選択できますpdsh -g web,db,master uptime

pdshHPCクラスタで使用するために作成されていますが、すべてのシステムグループを一括管理するのにも同様に役立ちます。

ところで、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

関連情報