Fabricで多段SSHをやる
詳しくないので適切な用語を把握していませんが、
ローカルからサーバー1を経由してサーバー2にログインして操作をしたいときに必要になります。
今回は、AWSでVPC内にパブリックサブネットとプライベートサブネットを用意しており、プライベートサブネットに対してfabricで操作をしたかったのでパブリックサブネット内のinstanceを経由してプライベートサブネット内のinstanceを操作します。
前提条件
面倒だったので、ゲートウェイとして扱うサーバーもトンネル先のサーバーも
- 同じ秘密鍵
- 同じユーザー・グループ名
とします。。。
スクリプト
サンプルなので、ls -al
だけにします...
host1はパブリックサブネットにおいてあるinstanceのIPアドレスとします。
host2はプライベートサブネットにおいてあるinstanceのIPアドレスとします。
処理対象をいつものhostにし、env.gateway
にトンネル先のエンドポイントを書きます。それだけですw
fabfile.py
from fabric.api import env, run
from fabric.decorators import task, hosts
# サーバーの設定
env.user = "ユーザー名"
env.group = "グループ名"
env.key_filename = "秘密鍵へのパス"
env.use_ssh_config = True
@task
@hosts("host1")
def sample_task():
env.gateway = "host2"
run("ls -al")
おわり