環境
KVMを使って仮想のゲストサーバを立てたが、
ゲストサーバはホストサーバと通信する用の(外に出る場合にはNAT通信)IPアドレスしか持っていない状況で、
Ansibleの実行対象としたかったのが背景。
ホストサーバに直接Ansibleをインストールして実行するわけにもいかず、ホストサーバを踏み台にして、 Ansibleを実行することがやりたかったこと。
SSHの設定ファイルを作る
"Ansibleで" と書いたが要はSSHです。Ansibleのコネクションの方法はいくつかありますが、SSHを使っている。
まずはSSHで踏み台サーバを経由してAnsible実行対象サーバへ接続できるように準備しました。
技術を検証するときの重要なポイントですが、その仕組みが何で実現されているかわかると、このように検証項目を分解することができてデバッグなどにも役立ちますね。
これはいわゆる「多段SSH」というやつで、以下のブログの最後にも書いた内容です。
一般的には~/.ssh/config
にこういった設定は書いたりもしますが、
Ansible実行の場合、特定の端末に依存したくなかったので、
ansible-playbookのレポジトリに別途ファイルを作るって管理することにしました。
なぜ特定の端末に依存したくなかったかというと、一人で利用する場合には良いのですが、複数人での運用環境の場合、ことなる環境でAnsibleのplaybookを実行しなければいけないことがあったからです。
## sshconfigという名前のファイルにした
Host ansible-target
HostName 192.168.33.10
User xxxxx
ProxyCommand ssh -W %h:%p yyyyy@hostserver
上記のファイルを使って多段SSHできることを確認します。 こちらで、問題なくターゲットのホストにSSH接続できれば問題なしです。
$ ssh -F sshconfig ansible-target
Ansible実行時にSSH設定ファイルを利用する
ここまで来たらとても簡単です。
Ansibleには、Ansible実行時の設定を管理するansible.cfgという設定ファイルを利用することができます。非常に便利なので活用方法は覚えておくといいです。
そのansible.cfgに下記を追記し、ansible実行時に上記のsshconfigを読み込まれるようにすることで踏み台越しにAnsibleを実行することができます。
# ansible.cfg
[ssh_connection]
ssh_args = -F sshconfig
まとめ
Ansibleを使った自動化をどんどん進めていくといろんな場面に遭遇します。 その1つとしてAnsibleを実行する端末からネットワーク的に直接届かないサーバへのプロビジョニングです。今回は、いわゆる多段SSHを使った踏み台サーバ越しでのAnsibleの実行方法について解説しました。
Ansibleの設定自体も重要ですが、その機能が実現している方法がわかると、仕組みの理解やデバッグの手助けになるでしょう。