ループ内のサーバーリストを持つGNUパラレルとsshpass

ループ内のサーバーリストを持つGNUパラレルとsshpass

このループは、consul members | grep awk {'print $2'} | cut -d ":" -f1すべてのサーバー(サーバーリスト=)でパッケージを順次更新しますconsul

for i in $(consul members | grep awk {'print $2'} | cut -d ":" -f1) ; do sshpass -p $PASSWORD ssh -oStrictHostKeyChecking=no -q root@$i "hostname && yum clean all && yum -y update consul && systemctl restart consul.service" ; done

sshpass私たちは1000台以上のサーバーを持っているので、10台のサーバーで並列に実行しようとしています。私が見つけたGNUパラレルこの仕事のために。

これをどのように使用sshpassし、どのサーバー(サーバーリスト)も2回完了しないようにできますか?

答え1

実際にはpsshより良い解決策のように聞こえます。使用する必要がある場合は、parallel非常に簡単でなければなりません。 1行に1つのホスト名をプレースホルダとして{}機能する単一のコマンドにリンクするだけです。たとえば、

consul members | ... awk {'print $2'} | cut -d ":" -f1 |
parallel -j 10 sshpass -p "$PASSWORD" ssh -oStrictHostKeyChecking=no -q root@{} "hostname && yum clean all && yum -y update consul && systemctl restart consul.service"

使用法にsshpass違いはありません。 justなどの簡単なコマンドを使用して最初にテストしますhostname

答え2

ホストキー認証は pssh と ssh でうまく機能します。

まず、ローカルコンピュータから接続するユーザーとして ssh-keygen を実行して公開鍵を作成します。

次に、ssh-copy-id を使用して、その公開鍵をすべてのリモートサーバーにコピーします。次に、次のようにします。

pssh -h <(consul members | grep awk {'print $2'} | cut -d ":" -f1) -o /tmp/update-consul-servers -i "yum clean all && yum -y update consul && systemctl restart consul.service"

答え3

すべて、これはスクリプトでパスワードを求めるプロンプトを表示し、requireコマンドを実行し、認証されていないサーバーを一覧表示するアクションシェルです。

私のためにcat /root/fahmi/up.list
sshpass -p 'Password' ssh -T -o StrictHostKeyChecking =ユーザーなし@ "$ i"; then echo "$i サーバーにアクセスできません。" fi sshpass -p 'Password' ssh -T -o StrictHostKeyChecking=ユーザーなし@ "$i" <./command.sh

完璧

関連情報