awscli + jq + peco + tmux-cssh를 사용하여 여러 EC2 인스턴스에 쉽게 SSH

6460 단어 tmuxPecoEC2aws-clijq

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")
  • Terminate되지 않은 인스턴스


  • == "running"
  • Public IP가 할당된 인스턴스

  • select(has("PublicIpAddress"))
  • Public IP, Private IP, State, Name 태그의 값을 추출(없으면 빈 문자열)

  • [
      "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 // "")]
  • 추출한 정보를 하드 탭으로 결합 (TSV)

  • 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

    좋은 웹페이지 즐겨찾기