쉘 스크립트에서 여러 서버에 대한 선택 명령을 어떻게 실행할 수 있습니까?

쉘 스크립트에서 여러 서버에 대한 선택 명령을 어떻게 실행할 수 있습니까?

여러 서버의 인수에서 스크립트를 어떻게 실행할 수 있나요?

명령 목록을 작성한 다음 각 서버에서 명령을 실행하려고 합니다. eval각 서버에서 올바르게 'd 할 수 있는 방식으로 명령 목록을 생성할 수 없습니다 .

지금까지의 전체 스크립트는 다음과 같습니다. 기본적으로 저는 각 서버에 로그인하여 $server_array$script_arr의 모든 명령을 실행하거나 선택한 명령만 실행하고 싶습니다.

#!/bin/bash

# run-commands.sh [optional script name]
# ex. run-commands.sh
# ex. run-commands.sh date_script
# ex. run-commands.sh hostname_script

# declare -a server_arr=("a.local" "b.local")
declare -a server_arr=("localhost")

if [ $# -eq 0 ]
  then
    # Default Processes
    declare -a script_arr=("date_script" "hostname_script")
else
    declare -a script_arr=($1)
fi

build_cmds()
{

    script_arr=("${@}")
    declare -a cmds

    for script_name in "${script_arr[@]}"
    do

        case "$script_name" in
            "date_script")
                cmds+='printf "executing date command\n; "'
                cmds+='date'
                cmds+='printf "date command executed\n; "'
            ;;
            "hostname_script")
                cmds+='printf "executing date command\n; "'
                cmds+='date'
                cmds+='printf "date command executed\n; "'
            ;;
        esac

    done

}

build_cmds "${script_arr[@]}"

for cmd in "${cmds[@]}"
do
    ssh user@$server_name -T 'eval "$cmd"'
done

echo "Completed executing all commands"

답변1

카피스트라노,mssh, 그리고클러스터sh한 번에 여러 서버에 명령을 실행한다고 주장하는 도구입니다. 당신이 발견했듯이 그것은 충분히 복잡한 작업이므로 바퀴를 재발명하지 않는 것이 더 나을 것입니다.

답변2

나는 Puppet Bolt를 사용하여 이 작업을 수행할 것입니다. 이를 통해 옹호 명령을 원격으로 쉽게 실행할 수 있습니다. Puppet Bolt(무료)를 다운로드하고 이를 사용하여 제공된 호스트 목록에 명령을 실행하세요.

꼭두각시 볼트 정보/다운로드

Bolt를 설치하고 모든 호스트에 SSH 키가 설정되어 있는지 확인하십시오.

답변3

1). 필요한 모든 명령과 출력 리디렉션을 사용하여 서버 측 스크립트를 로그에 작성합니다. 예를 들어, 서버 이름과 이 서버의 여유 공간을 표시하는 "server-side.sh"는 다음과 같습니다.

#! /bin/bash
cat /etc/hostname > log.txt
date > log.txt
df -h > log.txt

2). 로컬 워크스테이션에서 실행될 두 번째 스크립트를 작성합니다. 예를 들어 서버에 스크립트를 보내는 "run-server-side.sh"는 실행하고 결과 로그를 반환합니다.

#! /bin/bash
SERVERS="server_1 server_2"

for ONE_SERVER in SERVERS
do
  scp server-side.sh $ONE_SERVER:path
  ssh $ONE_SERVER path/server-side.sh
  scp $ONE_SERVER:path/log.txt
  mv log.txt "log-$ONE_SERVER.txt"
done

노트:.ssh/config서버는 키로 인증 하여 구성해야 합니다 . 예를 들어:

Host server_1
HostName address_1
User user_name_1

Host server_2
HostName address_2
User user_name_2

이익.

  • 추가 소프트웨어 없이 "네이티브" 및 "내장" bash만 가능합니다.
  • 모든 원격 서버에는 항상 최신 버전의 스크립트가 있습니다.
  • 선호하는 편집기를 사용하여 로컬 워크스테이션에서 다소 복잡한 스크립트를 작성하고 편집할 수 있습니다.

진화를 위한 장소.

  • 대규모 서버 측 스크립트는 여러 개의 작은 작업 == 하나의 스크립트로 나누어 rsync.
  • 콘솔의 깔끔한 출력을 위해 모든 서버 또는 작업에 대해 서로 다른 색상을 사용할 수 있습니다.http://misc.flogisoft.com/bash/tip_colors_and_formatting

답변4

당신이 할 수 있는 일이 몇 가지 있습니다.

명령이 병렬로 실행되는 것을 선호하는지 아니면 직렬로 실행되는 것을 선호하는지 모르겠습니다.

직렬로 실행하는 것을 선호한다면 다음과 같이 할 수 있습니다.

  1. 명령을 실행할 모든 서버의 목록을 만듭니다.
  2. 달리다:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done

명령을 병렬로 실행하려면 CentOS/Ubuntu 버전 OS 모두에 설치할 수 있는 Parallel-Ssh 도구를 사용할 수 있습니다.

원하신다면 Parallel-ssh 명령을 래핑하고 사용자가 서버 목록과 명령을 제공할 수 있도록 하는 쉘 스크립트를 작성했습니다. 그러면 스크립트는 모든 서버에서 명령을 병렬로 실행합니다.

스크립트를 찾을 수 있습니다내 Github에서.

제가 제안할 수 있는 마지막 방법은 인벤토리와 함께 Ansible을 사용하는 것입니다.

관련 정보