여러 서버의 인수에서 스크립트를 어떻게 실행할 수 있나요?
명령 목록을 작성한 다음 각 서버에서 명령을 실행하려고 합니다. 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
답변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
당신이 할 수 있는 일이 몇 가지 있습니다.
명령이 병렬로 실행되는 것을 선호하는지 아니면 직렬로 실행되는 것을 선호하는지 모르겠습니다.
직렬로 실행하는 것을 선호한다면 다음과 같이 할 수 있습니다.
- 명령을 실행할 모든 서버의 목록을 만듭니다.
- 달리다:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done
명령을 병렬로 실행하려면 CentOS/Ubuntu 버전 OS 모두에 설치할 수 있는 Parallel-Ssh 도구를 사용할 수 있습니다.
원하신다면 Parallel-ssh 명령을 래핑하고 사용자가 서버 목록과 명령을 제공할 수 있도록 하는 쉘 스크립트를 작성했습니다. 그러면 스크립트는 모든 서버에서 명령을 병렬로 실행합니다.
스크립트를 찾을 수 있습니다내 Github에서.
제가 제안할 수 있는 마지막 방법은 인벤토리와 함께 Ansible을 사용하는 것입니다.