web-dev-qa-db-ja.com

少数のサーバーで複数のコマンドをリモートで実行するにはどうすればよいですか?

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

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

これは、「machine1」にabc.tar.gzをインストールする場合に従う手順です。

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.gzmachine1をインストールし、次にmachine2にインストールして、次に進みます。このスクリプトはmachine0からのみ実行したいと思います。

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

4
user1950349

これには、 FabricAnsible などのプロビジョニングツールをお勧めします。どちらもセットアップが非常に簡単で、使用するツールに応じて最初のプレイブックまたはfabfileを作成できるため、この場合に必要なコマンドだけを実行できます。

ドキュメントのファブリックはここにあります: http://docs.fabfile.org/en/1.10/ Ansibleのドキュメントはここにあります: http://docs.ansible.com /ansible/intro_getting_started.html

両方のツールのSSHキーとSSH構成にある程度慣れている必要があります。これらは、ドキュメントにも記載されています。

5
cgutshal

pdsh あなたがやりたいことをすることができます。デフォルトでは、複数のマシンで同時に並行して動作しますが、必要に応じて、-fオプションを使用して、各マシンで一度に1つずつ実行するように制限できます。

例えば.

# 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して、単一のコマンドで実行することもできます。

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がnoexecにマウントされている場合に備えて、/tmpを使用してください)

これは、複数レベルのネストされた引用符を使用して混乱を避けたい場合(たとえば、Sudoまたはsuを使用してコマンドを実行する必要がある場合、またはawkまたはsedなどのスクリプトを埋め込む必要がある場合)に特に役立ちます。通常のシェル(または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は、puppetansiblecfengineなどとは異なる種類のツールです。これらは、マシンのグループ(クラスターやVMファームなど)に一貫した環境をインストールして維持するためのものです。 pdshは、同じグループのマシンで1回限りのコマンドやコピー(宛先またはコピー元)を実行するためのものです。

2
cas

スクリプトに関しては、次のようなものを見ている可能性があります。

MACHINES = (
  'machine1'
  'machine2'
  ...
)
for machine in "${MACHINES[@]}"; do
  # insert sequence of setup steps here.
done

これは、複数のマシンにスクリプトをデプロイするための迅速で汚い方法です。もちろん、このタスクを実行するためのより「専門的な」方法は他にもありますが、多くの場合、これで十分で保守可能です。

1
Dennis Chen

私はそのようなタスクにxargsを使用することを好みます。例として

#/bin/sh
cat serverlist.txt | xargs -I % sh -c 'ssh root@% 'date';'echo test''

また、serverlist.txtには、改行で区切られたIP /ホスト名が含まれています。

より大きなサーバーパークの原因については、ansibleのようなツールを使用することをお勧めします。

0
Lev Bystritskiy