여러 원격 서버에서 로컬 셸 스크립트를 병렬로 실행하고 상태를 가져옵니다.

여러 원격 서버에서 로컬 셸 스크립트를 병렬로 실행하고 상태를 가져옵니다.

원격 서버에서 로컬 스크립트를 실행해야 합니다. 스크립트를 병렬로 실행하는 것이 중요합니다.

[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt
             [email protected]
             [email protected]
             [email protected]
             [email protected]
             [email protected]
[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt  | xargs -I {} ssh {} -T 'bash -s' < ./file.sh
ssh: Could not resolve hostname #!/bin/sh: Name or service not known
xargs: ssh: exited with status 255; aborting
[ec2-user@ip-172-31-43-140 ~]$

답변1

나는 이 작업을 할 때 다음 형식을 좋아합니다.

$ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh

또는 {}필요한 경우:

$ cat hosts.txt | xargs -n1 -P8 -I{} sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh {}

hello.bash
$ cat hello.bash
#!/bin/bash

echo "hi from server: $(hostname)"
SSH xargs
$ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh
hi from server: mulder.mydom.com
hi from server: skinner.mydom.com
hi from server: manny.mydom.com

세부 사항:

  • -n1 -P8- xargs1개의 인수를 입력으로 사용하고 8개의 인스턴스를 실행하도록 지시합니다.ssh
  • sh -c 'ssh -T "$1"
    • 이는 쉘을 호출한 다음 명령을 실행합니다.-c "..."
    • $1여기서는 주입 공격을 피하기 위해 전달한다는 점에 유의하세요 .
    • -T의사 터미널을 비활성화합니다. 편집 중인 파일의 내용입니다 $1.cat
  • bash -s < ./hello.bash'- 전달될 명령ssh
  • sh- 꼬리는 sh호출할 셸, 매개변수 #0( )으로 전달되는 것입니다.xargs$0

인용하다

답변2

hello.bash:

doit() {
  echo Define
  echo what you want done in a
  echo function
}
export -f doit

그런 다음 다음을 수행하십시오.

. hello.bash
parallel --env doit --slf hosts.txt --tag --nonall doit

답변3

예, AWS Systems Manager를 사용하면 이 작업을 수행할 수 있습니다. AWS Systems Manager Run Command를 사용하면 EC2 및 온프레미스 서버에서 명령 세트를 원격으로 안전하게 실행할 수 있습니다. 이 목표를 달성하기 위한 개략적인 단계는 다음과 같습니다.

연결된 인스턴스 IAM 역할: ec2 인스턴스에는 AmazonSSMFullAccess 정책이 포함된 IAM 역할이 있어야 합니다. 이 역할을 통해 인스턴스는 Systems Manager API와 통신할 수 있습니다.

SSM 에이전트 설치: SSM 에이전트는 EC2 인스턴스에 설치되어야 합니다. SSM 에이전트는 명령 실행 요청을 처리하고 명령을 기반으로 인스턴스를 구성합니다.

실행 명령: AWS CLI를 통한 사용 예: --instance-idsec2 인스턴스 ID 목록을 제공합니다. 다음 명령을 실행하여 인스턴스에서 실행 중인 서비스를 검색합니다. Instance-ID를 ec2 인스턴스 ID로 바꿉니다.

aws ssm send-command --document-name "AWS-RunShellScript" --comment "listing services" --instance-ids "Instance-ID" --parameters commands="service --status-all" --region us-west-2 --output text

추가 정보여기

관련 정보