話題の記事

多段SSHをAnsibleで設定する

2015.09.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

セキュリティを高めるなどの理由で対象インスタンスにEIPを付与しない場合、SSHは踏み台(Bastion)経由となります(参考: Amazon VPC環境にメンテナンス用の踏み台サーバを構築する)。 踏み台サーバのある構成でAnsibleを利用する場合、ansible.cnfのssh_connectionでssh_argsを設定しましょう。

ssh_configの準備

はじめにsshのconfigファイルを作成します。 これは、~/.ssh/configに設定するファイルの一部と考えて良いでしょう。 Ansibleのファイルと一緒にバージョン管理する方が良いと思うので、Ansibleのプロジェクトルートにおくことをおすすめします。

Host bastion
  HostName 52.52.xxx.xxx
  User ec2-user
  IdentityFile ~/.ssh/prd.pem

Host web1a
  HostName 10.0.11.100
  User ec2-user
  IdentityFile ~/.ssh/prd.pem
  ProxyCommand ssh -W %h:%p bastion

作成したならば、次のようなコマンドで動作確認をしておきます。

$ ssh -F ssh_config web1a

ssh_configに問題がなければ、これで多段SSHが成功します。

ansible.cnfの修正

ansible.cnfを修正し、AnsibleがSSH接続する時のオプションを修正します。 例えば次のように変更してください。

[ssh_connection]
control_path = %(directory)s/%%h-%%r
ssh_args = -o ControlPersist=15m -F ssh_config -q

ポイントは、Fオプションでssh_configファイルを指定している部分です。

動作確認

最後にAnsibleで疎通確認を行います。

$ ansible all -m ping 
web1a | success >> {
    "changed": false,
    "ping": "pong"
}

まとめ

SSHの多段ログイン設定をconfigに書けば簡単に踏み台経由でAnsibleを利用できます。

なお、現時点ではまだリリースされていませんが、Ansible のVersion2以降では、Group Varsの「ansible_ssh_extra_args」を利用する方がスマートになりそうです。