원격 서버에서 로컬 스크립트를 실행해야 합니다. 스크립트를 병렬로 실행하는 것이 중요합니다.
[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
-xargs
1개의 인수를 입력으로 사용하고 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-ids
ec2 인스턴스 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
추가 정보여기