소수의 서버에서 원격으로 여러 명령을 실행하는 방법은 무엇입니까?

소수의 서버에서 원격으로 여러 명령을 실행하는 방법은 무엇입니까?

각 컴퓨터에서 수동으로 이 작업을 수행할 필요가 없도록 이러한 단계를 자동화하려고 합니다. 모든 UNIX 컴퓨터에 최신 응용 프로그램 서버 소프트웨어(abc.tar.gz)를 설치해야 합니다.

약 12대의 컴퓨터에서 이 작업을 수행해야 합니다 "machine1" ... "machine12". "machine0"파일이 있는 호스트가 하나 있으므로 abc.tar.gz이 시스템에서만 스크립트를 실행하고 abc.tar.gz아래 단계에 따라 12개 시스템 모두에 소프트웨어를 하나씩 설치하려고 합니다. 내 유닉스 계정 ID는 david이고 내 프로세스는 golden사용자로 실행 중입니다.

abc.tar.gz"machine1"에 설치하는 경우 다음 단계를 따르세요.

david@machine1:~$ sudo scp david@machine0:/home/david/abc.tar.gz .
david@machine1:~$ sudo stop test_server
david@machine1:~$ sudo su - golden
golden@machine1:~$ cd /opt/process
golden@machine1:/opt/process$ rm -rf *
golden@machine1:/opt/process$ exit
david@machine1:~$ sudo cp abc.tar.gz /opt/process
david@machine1:~$ sudo chown -R golden /opt/process
david@machine1:~$ sudo su - golden
golden@machine1:~$ cd /opt/process
golden@machine1:/opt/process$ tar -xvzf abc.tar.gz
golden@machine1:/opt/process$ exit
david@machine1:~$ sudo start test_server

12개 컴퓨터 모두에서 동일한 단계를 하나씩 수행하도록 이를 자동화하려면 어떻게 해야 합니까? 먼저 설치 abc.tar.gzmachine1다음 설치 machine2하고 계속하세요. 이 스크립트를 실행하고 싶습니다 machine0.

이것을 자동화할 수 있는 방법이 있나요?

답변1

다음과 같은 구성 도구를 추천합니다.구조또는안시푸르이를 위해. 두 가지 모두 설정이 매우 쉽고 사용 중인 도구에 따라 초기 플레이북이나 fabfile을 구축할 수 있으므로 이 상황에서 필요한 것보다 더 많은 명령을 수행할 수 있습니다.

Fabric에 대한 문서는 여기에서 찾을 수 있습니다.http://docs.fabfile.org/en/1.10/ Ansible에 대한 문서는 여기에서 찾을 수 있습니다.http://docs.ansible.com/ansible/intro_getting_started.html

두 도구 모두에 대한 SSH 키와 SSH 구성에 대해 잘 알고 있어야 하며, 이에 대한 내용은 설명서에서도 확인할 수 있습니다.

답변2

PDSH너가 원하는 것을 할수있어. 기본적으로 여러 시스템에서 동시에 병렬로 실행되지만 -f원하는 경우 옵션을 사용하여 각 시스템에서 동시에 실행되도록 제한할 수 있습니다.

예를 들어

# copy abc.tar.gz to /home/david on machine1..machine12
pdcp -w machine[1-12] abc.tar.gz /home/david

# run a bunch of commands on machine1..machine12
# be careful of quoting
pdsh -w machine[1-12] 'sudo stop service ; do something ; do something else ;
                       sudo start service'

pdshpdcp또는 명령줄의 모든 명령을 작은따옴표나 큰따옴표로 묶는 대신 원격 컴퓨터에 쉘 스크립트를 보내고 단일 명령으로 실행할 수 있습니다 .

pdcp -w machine[1-12] abc.tar.gz /home/david
pdcp -w machine[1-12] ./my-script.sh /tmp
pdsh -w machine[1-12] sh -c '/tmp/my-script.sh'

sh -c( /tmpnoexec가 설치된 경우에만 사용됨)

이는 여러 수준의 중첩된 따옴표와의 혼동을 피하려는 경우에 특히 유용합니다(예를 들어 , 또는 포함 또는 기타 스크립트를 sudo사용하여 일부 명령을 실행 해야 하는 경우). 일반적 으로 일반 쉘( 또는 기타) 스크립트를 작성하여 필요한 곳에 복사하고 실행하는 것이 훨씬 간단합니다.suawksedawkperl

pdsh또한 이름이 지정된 파일을 사용하여 /etc/genders기계 및 해당 기계에 할당하는 (임의) 속성을 정의할 수 있습니다. 예를 들어

machine0        master,all
machine[1-12]   machines,all
web[1-4]        webservers,all
db[1-2]         mysql,db,all

pdshpdcp또는 명령줄의 속성 -g(예: pdcp -g machines abc.tar.gz /home/david또는 pdsh -g all uname -a또는) 으로 시스템을 선택할 수 있습니다 pdsh -g web,db,master uptime.

pdshHPC 클러스터에서 사용하기 위해 작성되었지만 모든 시스템 그룹을 일괄 관리하는 데에도 마찬가지로 유용합니다.

그건 그렇고, pdsh다른 유형의 도구 등입니다. puppet이는 ansible클러스터 cfengine또는 가상 공항 등과 같은 시스템 그룹에 일관된 환경을 설치하고 유지하는 데 사용됩니다. pdsh동일한 머신 세트에서 일회성 명령 및/또는 복사본(왕복)을 실행하는 것에 관한 것입니다.

답변3

스크립트 측면에서 다음과 같은 내용을 볼 수 있습니다.

MACHINES = (
  'machine1'
  'machine2'
  ...
)
for machine in "${MACHINES[@]}"; do
  # insert sequence of setup steps here.
done

이는 여러 시스템에 스크립트를 배포하는 빠르고 더러운 방법입니다. 물론 이 작업을 수행하는 보다 "전문적인" 다른 방법이 있지만 일반적으로 이 방법으로도 충분하고 유지 관리가 가능합니다.

답변4

나는 그러한 작업을 선호합니다 xargs. 예를 들어

#/bin/sh
cat serverlist.txt | xargs -I % sh -c 'ssh root@% 'date';'echo test''

serverlist.txt에는 줄 바꿈으로 구분된 IP/호스트 이름이 포함되어 있습니다.

대규모 서버 파크의 경우 ansible.

관련 정보