이 루프를 통해 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
완벽한