루프에 서버 목록이 있는 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하고 어떤 서버(서버 목록)도 두 번 완료되지 않도록 할 수 있나요?

답변1

실제로 pssh더 나은 솔루션처럼 들립니다. 꼭 사용해야 한다면 parallel매우 간단해야 합니다. 한 줄에 하나의 호스트 이름을 {}자리 표시자 역할을 하는 단일 명령으로 연결하면 됩니다. 예를 들어:

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

완벽한

관련 정보