すべてのマシンで手動でこれを行う必要がないように、これらの手順を自動化しようとしています。すべての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.gz
にmachine1
をインストールし、次にmachine2
にインストールして、次に進みます。このスクリプトはmachine0
からのみ実行したいと思います。
これを自動化する方法はありますか?
これには、 Fabric や Ansible などのプロビジョニングツールをお勧めします。どちらもセットアップが非常に簡単で、使用するツールに応じて最初のプレイブックまたはfabfileを作成できるため、この場合に必要なコマンドだけを実行できます。
ドキュメントのファブリックはここにあります: http://docs.fabfile.org/en/1.10/ Ansibleのドキュメントはここにあります: http://docs.ansible.com /ansible/intro_getting_started.html
両方のツールのSSHキーとSSH構成にある程度慣れている必要があります。これらは、ドキュメントにも記載されています。
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
は、puppet
、ansible
、cfengine
などとは異なる種類のツールです。これらは、マシンのグループ(クラスターやVMファームなど)に一貫した環境をインストールして維持するためのものです。 pdsh
は、同じグループのマシンで1回限りのコマンドやコピー(宛先またはコピー元)を実行するためのものです。
スクリプトに関しては、次のようなものを見ている可能性があります。
MACHINES = (
'machine1'
'machine2'
...
)
for machine in "${MACHINES[@]}"; do
# insert sequence of setup steps here.
done
これは、複数のマシンにスクリプトをデプロイするための迅速で汚い方法です。もちろん、このタスクを実行するためのより「専門的な」方法は他にもありますが、多くの場合、これで十分で保守可能です。
私はそのようなタスクにxargs
を使用することを好みます。例として
#/bin/sh
cat serverlist.txt | xargs -I % sh -c 'ssh root@% 'date';'echo test''
また、serverlist.txtには、改行で区切られたIP /ホスト名が含まれています。
より大きなサーバーパークの原因については、ansible
のようなツールを使用することをお勧めします。