見出し画像

AnsibleをローカルからプライベートサブネットのEC2に対して直接実行する業

ssh接続で踏み台サーバーの存在が不要になった

今までAWS でプライベートサブネットのEC2に対してssh接続したりAnsibleを実行する為には、パブリックサブネットに置いた踏み台サーバーから行うのが従来の方法でした。

しかしこの方法だと当然踏み台サーバーの管理だけでなく、踏み台サーバーに接続可能なユーザーの制御もしなければならないので面倒臭いしリスクがあります。(あるあるなのが退職した人のユーザー情報消し忘れ)

最近現場でインフラ改善に関わっていて「そもそも踏み台サーバーの存在自体無くせないかな」と思って調査したら、AWSでSession Managerを使ってローカルからEC2に直接ssh接続出来る方法をちょうど見つけたので「こ・れ・だ!」と思わず小躍りしました。

じゃあAnsibleもローカルから直接実行出来るのでは・・?

と思うのはごく自然なこと。

試行錯誤した結果、実行に成功しましたのでその方法を以下に記載します!

前提条件

・上記のリンク等を参考にしてローカルからssh接続が可能になっていること
・ansibleが実行可能なこと(導入手順はこの記事では触れません)

実行方法

やることは簡単。Ansibleのインベントリファイルを以下のように修正するだけです。

[web]
web1 ansible_host=i-*********

[all:vars]
ansible_ssh_common_args=-o StrictHostKeyChecking=no -o ProxyCommand="sh -c \"aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'\""
ansible_user='ec2-user'
ansible_become=true
ansible_ssh_private_key_file='~/.ssh/****.pem'

今回web1というEC2インスタンスに対して実行します。
まずホストの指定はEC2のインスタンスIDとなりますのでご注意ください。

[web]
web1 ansible_host=i-*********


次にAWSのSSMを使う為の設定を`[all:vars]`に記載します。

[all:vars]
ansible_ssh_common_args=-o StrictHostKeyChecking=no -o ProxyCommand="sh -c \"aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'\""
ansible_user='ec2-user'
ansible_become=true
ansible_ssh_private_key_file='~/.ssh/****.pem'

`ansible_ssh_common_args`:
ssh,sftp,scpに共通で渡される引数を意味し、ここにssh接続設定時に`~/.ssh/config`ファイルに記載した内容を流用
`ansible_user`:ログインするユーザー名
`ansible_become`:root権限で実行したいかどうかなのでひとまずtrueで良し
`ansible_ssh_private_key_file`:ssh接続に使用しているpemファイルパスを指定

インベントリファイルの修正が終わったらweb1のホストを指定して実行してみましょう。対象にEC2インスタンスに対してAnsibleが実行されるはずです。

 ansible-playbook playbooks/***.yml -i sample -l web1 

ローカルから簡単にプライベートサブネットのEC2にAnsibleが実行出来るのは地味に便利ですね。
AWS Systems Manager Session Managerによって踏み台サーバーが不要になる時代が到来したなというのを実感した今日この頃です。

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
よろづ屋的エンジニアとして会社の技術を横断的にみてます。