SSH를 통해 원격으로 실행중인 명령을 동시에 여러 서버로 자동 자동으로 자동화하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/243750

  •  04-07-2019
  •  | 
  •  

문제

비슷한 질문을 검색했지만 하나의 명령을 실행하거나 다음과 같은 항목이있는 몇 가지 명령을 실행하는 것 외에는 다음과 같습니다.

ssh user@host -t sudo su -

그러나 본질적으로 15 서버를 한 번에 스크립트를 실행 해야하는 경우 어떻게해야합니까? 이것은 배쉬에서 가능합니까? 완벽한 세상에서는이 문제를 해결할 수있는 경우 응용 프로그램을 설치하지 않아야합니다. 논쟁을 위해 10 개 호스트에서 다음을 수행해야한다고 가정 해 봅시다.

  1. 새 Tomcat 컨테이너를 배포하십시오
  2. 컨테이너에 응용 프로그램을 배포하고 구성합니다.
  3. Apache Vhost를 구성하십시오
  4. Reload Apache

나는 그 모든 것을 수행하는 스크립트가 있지만 모든 서버에 로그인하고 저장소에서 스크립트를 끌어 내고 실행하는 데 의존합니다. 이것이 Bash에서 할 수 없다면 어떤 대안을 제안합니까? Perl과 같은 더 큰 망치가 필요합니까 (Python은 yum/up2date 덕분에 Python이 Rhel 환경의 모든 상자에 있음을 보장 할 수 있기 때문에 선호 될 수 있습니까?)? 누군가가 유용한 정보를 나에게 지적 할 수 있다면, 특히 Bash에서 가능하다면 큰 감사를드립니다. 나는 Perl 또는 Python에 정착 할 것이지만, 나는 그것들도 모른다 (그것에 대해서도). 감사!

도움이 되었습니까?

해결책

종종 원래 TCL 버전의 기대를 사용하겠습니다. 로컬 컴퓨터에만 사용하면됩니다. Perl을 사용하는 프로그램 내부에 있다면이 작업을 수행합니다. net :: ssh :: 기대. 다른 언어에는 비슷한 "기대"도구가 있습니다.

다른 팁

Che and Yang에서 표시된대로 로컬 스크립트를 실행하거나 여기에 문서를 사용할 수 있습니다.

ssh root@server /bin/sh <<\EOF  
wget http://server/warfile    # Could use NFS here  
cp app.war /location  
command 1  
command 2  
/etc/init.d/httpd restart  
EOF 

한 번에 많은 서버에서 명령을 실행하는 방법에 대한 문제는 다른 날 Perl 메일 링리스트에 나타 났으며 동일한 권장 사항을 알려 드리겠습니다. 나는 거기에 주었다, 사용하는 것입니다 gsh:

http://outflux.net/unix/software/gsh

GSH는 "와 유사합니다.for box in box1_name box2_name box3_name" 해결책 이미 주어졌습니다 그러나 나는 GSH가 더 편리하다는 것을 알았습니다. Web, DB, RHEL4, X86_64 등 그룹에 서버가 포함 된 /etc /ghosts 파일을 설정 한 다음 GSH를 호출 할 때 해당 그룹을 사용합니다.

[pdurbin@beamish ~]$ gsh web "cat /etc/redhat-release; uname -r"
www-2.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-2.foo.com: 2.6.9-78.0.1.ELsmp
www-3.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-3.foo.com: 2.6.9-78.0.1.ELsmp
www-4.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-4.foo.com: 2.6.18-92.1.13.el5
www-5.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-5.foo.com: 2.6.18-92.1.13.el5
[pdurbin@beamish ~]$

예를 들어 Web+DB 또는 Web-Rhel4를 사용하여 유령 그룹을 결합하거나 분할 할 수도 있습니다.

또한 Shmux를 사용한 적이 없지만 언급하겠습니다. 웹 사이트 많은 서버에서 한 번에 명령을 실행할 수있는 소프트웨어 목록 (GSH 포함)이 포함되어 있습니다. Capistrano 이미 언급되었으며 (내가 이해 한 것)도 그 목록에있을 수 있습니다.

기대를 살펴보십시오 (man expect)

나는 과거에 기대를 사용하여 비슷한 작업을 수행했습니다.

로컬 스크립트를 원격 서버에 파이프하고 하나의 명령으로 실행할 수 있습니다.

ssh -t user@host 'sh' < path_to_script

공개 키 인증을 사용하고 스크립트로 래핑하여 병렬 실행을 수행하여 추가로 자동화 할 수 있습니다.

당신은 시도 할 수 있습니다 파라 미코. 순수한 파이썬 SSH 클라이언트입니다. SSH 세션을 프로그래밍 할 수 있습니다. 원격 기계에 설치할 것이 없습니다.

이것 좀 봐 훌륭한 기사 그것을 사용하는 방법에.

실제 코드없이 구조를 제공합니다.

  1. SCP를 사용하여 설치/설정 스크립트를 대상 상자에 복사하십시오.
  2. SSH를 사용하여 원격 상자에서 스크립트를 호출하십시오.

PSSH 여기에 언급 된 대부분의 솔루션과 달리 명령은 병렬로 실행되기 때문에 흥미로울 수 있습니다.

(내 자신의 용도로, 나는 Gavincattell과 매우 유사한 간단한 작은 스크립트를 썼습니다. 여기에 문서화 - 프랑스어로).

당신은 같은 것을 보셨습니까? 인형 또는 cfengine. 그들은 당신이 원하는 것을 할 수 있으며 아마도 훨씬 더 할 수 있습니다.

이 질문을 우연히 발견하는 사람들은 사용하는 답을 포함하겠습니다. 구조, 위에서 설명한 문제를 정확하게 해결합니다. SSH를 통해 여러 호스트에서 임의 명령을 실행합니다.

패브릭이 설치되면 a fabfile.py, 그리고 구현 작업 원격 호스트에서 실행할 수 있습니다. 예를 들어, 작업입니다 Reload Apache 다음과 같이 보일 수 있습니다.

from fabric.api import env, run

env.hosts = ['host1@example.com', 'host2@example.com']

def reload():
    """ Reload Apache """
    run("sudo /etc/init.d/apache2 reload")

그런 다음 로컬 기계에서 실행하십시오 fab reload 그리고 sudo /etc/init.d/apache2 reload 명령은 지정된 모든 호스트에서 실행됩니다. env.hosts.

이전과 같은 방식으로 수행 할 수 있습니다. 수동으로 수행하는 대신 스크립트를 작성하십시오. 다음 코드는 'loca'라는 기계로의 리모콘이며 두 개의 명령을 실행합니다. 당신이해야 할 일은 단순히 거기에서 실행하려는 명령을 삽입하는 것입니다.

che@ovecka ~ $ ssh loca 'uname -a; echo something_else'
Linux loca 2.6.25.9 #1 (blahblahblah)
something_else

그런 다음 모든 기계를 반복하려면 다음과 같은 작업을 수행하십시오.

for box in box1_name box2_name box3_name
do
   ssh $box 'commmands_to_run_everywhere'
done

이 SSH를 항상 암호를 입력하지 않고 작동하려면 주요 인증을 설정해야합니다. 당신은 그것에 대해 읽을 수 있습니다 IBM DeveloperWorks.

다음과 같은 도구로 여러 서버에서 동일한 명령을 한 번에 실행할 수 있습니다. 클러스터 SSH. 링크는 Debian Package of the Day 블로그에서 Cluster SSH에 대한 토론입니다.

1 단계와 2 단계의 경우 Tomcat Manager 웹 인터페이스가 없습니다. libwww 플러그인을 사용하여 Curl 또는 Zsh를 사용하여 스크립트 할 수 있습니다.

SSH의 경우 1) 비밀번호 (Keys 사용)에 대한 프롬프트를받지 않으면 SSH의 명령 라인에서 명령을 전달하십시오. 이는 유사합니다. rsh 신뢰할 수있는 네트워크에서.

다른 게시물은 당신에게 무엇을 해야하는지 보여 주었을 것입니다. sh 너무나도 사용하려는 유혹을 받았습니다 perl 처럼 ssh tomcatuser@server perl -e 'do-everything-on-one-line;' 또는 이것을 할 수 있습니다 :

어느 하나 scp the_package.tbz tomcatuser@server:the_place/.
ssh tomcatuser@server /bin/sh <<\EOF
같은 것을 정의하십시오 TOMCAT_WEBAPPS=/usr/local/share/tomcat/webapps
tar xj the_package.tbz 또는 rsync rsync://repository/the_package_place
mv $TOMCAT_WEBAPPS/old_war $TOMCAT_WEBAPPS/old_war.old
mv $THE_PLACE/new_war $TOMCAT_WEBAPPS/new_war
touch $TOMCAT_WEBAPPS/new_war 일반적으로 Tomcat을 다시 시작할 필요가 없습니다
mv $THE_PLACE/vhost_file $APACHE_VHOST_DIR/vhost_file
$APACHECTL restart 파일을 이동하고 다시 시작하려면 Apache 사용자로 로그인해야 할 수도 있습니다.
EOF

클러스터에 많이 사용되는 DSH 또는 분산 쉘을 원합니다. 여기 링크가 있습니다: DSH

기본적으로 노드 그룹 (노드 목록이있는 파일)이 있으며 명령을 실행하려는 노드 그룹을 지정하면 SSH를 사용하여 명령을 실행하는 것처럼 DSH를 사용합니다.

dsh -a /path/to/some/command/or/script

모든 컴퓨터에서 동시에 명령을 실행하고 호스트 이름으로 접두사를 접두사로 반환합니다. 명령 또는 스크립트는 시스템에 있어야하므로 공유 NFS 디렉토리는 이러한 종류의 것들에 유용 할 수 있습니다.

액세스 된 모든 기계의 호스트 이름 SSH 명령을 만듭니다. Quierati에 의해http://pastebin.com/pddeqwq2

#Use in .bashrc
#Use "HashKnownHosts no" in ~/.ssh/config or /etc/ssh/ssh_config 
# If known_hosts is encrypted and delete known_hosts

[ ! -d ~/bin ] && mkdir ~/bin
for host in `cut -d, -f1 ~/.ssh/known_hosts|cut -f1 -d " "`;
  do
    [ ! -s ~/bin/$host ] && echo ssh $host '$*' > ~/bin/$host
done
[ -d ~/bin ] && chmod -R 700 ~/bin
export PATH=$PATH:~/bin 

Ex Execute :

$for i in hostname{1..10}; do $i who;done

라는 도구가 있습니다 FLATT (유연한 자동화 및 문제 해결 도구) 이를 통해 버튼을 클릭하여 여러 Unix/Linux 호스트에서 스크립트를 실행할 수 있습니다. Mac 및 Windows에서 실행되는 데스크탑 GUI 앱이지만 명령 줄 Java 클라이언트도 있습니다.
배치 작업을 만들고 여러 호스트에서 재사용 할 수 있습니다.
Java 1.6 이상이 필요합니다.

복잡한 주제이지만 강력히 추천 할 수 있습니다. Capistrano.

이 방법이 원하는 모든 것에 대해 작동하는지 확실하지 않지만 다음과 같은 것을 시도 할 수 있습니다.

$ cat your_script.sh | ssh your_host bash

원격 서버에서 스크립트 (로컬에있는)를 실행합니다.

다문자 이 작업을 수행하는 데 시원하며 N 기계에서 1을 쉽게 순서대로 올릴 수 있습니다.

새로운 것을 읽으십시오 블로그 사용 setsid 주류 커널 외에 추가 설치/구성없이. Ubuntu14.04에 따라 테스트/검증.

저자는 매우 명확한 설명과 샘플 코드를 가지고 있지만 다음은 간단한 한 눈에 마법의 부분이 있습니다.

#----------------------------------------------------------------------
# Create a temp script to echo the SSH password, used by SSH_ASKPASS
#----------------------------------------------------------------------
SSH_ASKPASS_SCRIPT=/tmp/ssh-askpass-script
cat > ${SSH_ASKPASS_SCRIPT} <<EOL
#!/bin/bash
echo "${PASS}"
EOL
chmod u+x ${SSH_ASKPASS_SCRIPT}

# Tell SSH to read in the output of the provided script as the password.
# We still have to use setsid to eliminate access to a terminal and thus avoid
# it ignoring this and asking for a password.
export SSH_ASKPASS=${SSH_ASKPASS_SCRIPT}
......
......
# Log in to the remote server and run the above command.
# The use of setsid is a part of the machinations to stop ssh 
# prompting for a password.
setsid ssh ${SSH_OPTIONS} ${USER}@${SERVER} "ls -rlt"

다음은 여러 시스템에서 SSH 명령을 수행하는 스크립트입니다. 도움이 될 수 있습니다.

#!/bin/bash
MACHINES="machine1 machine2 machine3 machine4 machine5 machine6"
for m in $MACHINES
do
        cmd="ssh $m '$*'"
        eval $cmd
done

당신은 이것을 당신의 경로에 넣고 sshall과 같은 것을 부르고 sshall 명령을 입력 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top