このループは、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
完璧