awscli + jq + peco + tmux-cssh를 사용하여 여러 EC2 인스턴스에 쉽게 SSH
TL;DR
필요한 것 (awscli, jq, peco, tmux, tmux-cssh)을 모두 넣은 상태에서
$ sh -c "tmux-cssh -i <ssh_key> -u <ssh_user> $(aws ec2 describe-instances | jq -r '.Reservations[] | .Instances[] | select(.State.Name != "terminated") | select(has("PublicIpAddress")) | [.PublicIpAddress,.PrivateIpAddress,.State.Name,(.Tags[] | select(.Key == "Name") | .Value // "")] | join("\t")' | peco | awk '{ print $1 }' | tr '\n' ' ')"
이렇게하면 peco에서 EC2 인스턴스를 선택하여 동시에 SSH 액세스 할 수 있습니다.
tmux 에서 생활하고 있는 분은, 한 번
tmux detach
하고 tmux 밖에 나오지 않으면 tmux-cssh 를 실행할 수 없습니다.또한 터미널을 시작할 때 자동으로 tmux를 시작하는 설정을 비활성화해야합니다.
awscli + jq + peco로 인스턴스 선택
먼저 peco를 사용하여 SSH를 원하는 인스턴스를 선택합니다.
$ aws ec2 describe-instances | jq -r '.Reservations[] | .Instances[] | select(.State.Name != "terminated") | select(has("PublicIpAddress")) | [.PublicIpAddress,.PrivateIpAddress,.State.Name,(.Tags[] | select(.Key == "Name") | .Value // "")] | join("\t")' | peco | awk '{ print $1 }' | tr '\n' ' '
길기 때문에 각각 분해해 봅시다.
awscli
$ aws ec2 describe-instances
EC2 인스턴스 목록을 JSON으로 검색
jq
$ jq -r
-r
로 인용하지 않고 출력이하의 쿼리 부분에 대해서는,
.Reservations[] | .Instances[]
select(.State.Name != "terminated")
== "running"
select(has("PublicIpAddress"))
[
"54.65.201.60",
"172.31.10.134",
"running",
"web-01"
]
[
"54.65.201.225",
"172.31.10.130",
"running",
"web-02"
]
...
[.PublicIpAddress,.PrivateIpAddress,.State.Name,(.Tags[] | select(.Key == "Name") | .Value // "")]
54.65.201.60 172.31.10.134 running web-01
54.65.201.225 172.31.10.130 running web-02
...
peco
지금까지 얻은 정보를 잘 좁혀 선택하십시오.
QUERY>
54.65.201.60 172.31.10.134 running web-01
54.65.201.225 172.31.10.130 running web-02
54.65.205.189 172.31.10.131 running web-03
54.65.230.123 172.31.10.132 running worker-01
54.65.202.2 172.31.10.133 running worker-02
awk
$ awk '{ print $1 }'
탭으로 구분 된 문자열 중 첫 번째 항목 (이번에는 Public IP)을 추출합니다.
54.65.201.60
54.65.201.225
tr
$ tr '\n' ' '
1행 1 인스턴스 형태로 출력되는 것을 공백으로 구분
54.65.201.60 54.65.201.225
tmux-cssh로 선택한 인스턴스에 동시 SSH
tmux-cssh은 tmux를 사용하여 여러 호스트에 동시 SSH하는 도구입니다. tmux-cssh의 입력은 모든 호스트에 반영되므로 여러 호스트에서 동일한 작업을 수행하고 싶을 때 유용합니다 (구성 관리 도구의 이야기는 우선 두고 ...).
tmux-cssh
$ tmux-cssh -i <ssh_key> -u <ssh_user> <host01> <host02>
join("\t")
로 개인 키를 지정하고 -i
로 사용자를 지정합니다.이번은 모든 호스트에서 키 페어와 유저가 같은 경우만 유효합니다.
-u 있니?
sh -c
를 단순히 변수 전개등으로 건네주면(자), 이 부분은 tmux-cssh 의 복수 인수로 간주되지 않고, 1 개의 인수로서 해석됩니다. 호스트명으로서 스페이스 단락의 캐릭터 라인 1개 건네받는 형태입니다.$ tmux-cssh -i <ssh_key> -u <ssh_user> '<host01> <host02>'
이렇게 하면 실제로 실행되는 ssh 명령이 이상해집니다.
$ ssh -i <ssh_key> <ssh_user>@'<host01> <host02>'
그래서,
<host01> <host02>
의 부분도 포함해 1개의 캐릭터 라인으로서 간주한 다음에, 자신을 eval 할 필요가 있는 것입니다.이것이라면
$ ssh -i <ssh_key> <ssh_user>@<host01>
$ ssh -i <ssh_key> <ssh_user>@<host02>
됩니다.
우선 생각해 낸 것이 이것이므로, 더 좋은 방법이 있을지도 모른다.
결론
최근 작업에서 복수(5개 이상) 인스턴스에 동시 SSH 하고 같은 커멘드를 흘려 넣고 싶다는 것이 있어 귀찮았으므로 이 방법을 생각했습니다.
이 기사에서는 최초로 원라이너로서 소개하고 있습니다만, 실제로 자신은 envchain (을)를 사용하고 있는 일도 있어 쉘 함수로서 정의한 것을 이용하고 있습니다. 뭐 원라이너가 긴 위에 SSH 유저와 열쇠를 지정할 필요가 있기 때문에 어느 쪽이든 함수 정의해 두는 편이 평상시 사용에 좋을 것입니다.
함께 보시기 바랍니다 : dtan4/dot.zsh/.zshrc.peco
Reference
이 문제에 관하여(awscli + jq + peco + tmux-cssh를 사용하여 여러 EC2 인스턴스에 쉽게 SSH), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/dtan4/items/88545bbd2dcdb590b5a7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)