DockerにSSH-AgentをフォワードしてAnsibleを実行する
M1 Mac(Monterey 12.6)で特定バージョンのAnsibleを動かすためのDockerを構築したらSSHで大変に苦労した。
以前にこちらで特定バージョンが稼働するDocker環境を構築したことがあった。以前は作りかけだったが、端末を新調することを機会に整理した結果、思わぬところではまってしまった。
特定のAnsibleが稼働するためのDocker環境
|
|
|
|
|
|
おおよそこのような形となる。(結局、docker-composeである必要がないのはご愛嬌)
ホストマシンではSSHできるのに、Docker環境からSSHできない
AnsibleスクリプトをDockerで実行しようとすると、Playbookの途中でパスワード訊かれることに気がついた。Ansibleの場合、パスワードを正しく打ち込んでも、ループして認証されないため、秘密鍵(鍵認証)の情報をDockerコンテナにフォワードして上げる必要がある。
ところが、この鍵情報がフォワードされているにもかかわらず、DockerからAnsible実行時に認証されないのである。
切り分け
ホストマシンから、(Ansibleで)接続するサーバーにSSHしてみる
|
|
Dockerから、SSHしてみる
|
|
~/.ssh
のディレクトリと、~/.ssh/private.rsa
のパーミッションの確認
こういう場合、最も問題となりがちなのは、パーミッションである。そこで ~/.ssh
のディレクトリと、~/.ssh/private.rsa
のパーミッションを確認してみる
tree -pgu
コマンドのホストマシンとDockerコンテナ上の結果は同じであった。
Dockerコンテナ上での再現
コンテナの何かが誤っているかもしれないので、シンプルなUbutuコンテナを構築してSSHできるかを確認する
|
|
結果は・・・ パスワードを聞かれる。つまり、DockerコンテナでSSH-Agentが正しく起動できていないか、パーミッションがやはり間違っている(と考えたところが問題でこれから先かなりの時間悩む羽目になった)
結論
いろいろと切り分けをつづけていった結果、
ssh user@sever -i ~/.ssh/private.rsa -F /dev/null
と実行するとパスワード認証されずにSSHできるのに、ssh user@sever -i ~/.ssh/private.rsa
と実行するとパスワードの確認が入ることに気がついた。
つまり~/.ssh/config
が何かおかしい。SSH時にオプションvを利用して確認していったが、正常時のログとパスワードを聞かれる際のログでエラーやワーニングの差が存在していない。
仕方がないので、sshconfigを1行ずつ消したり書いたり別ファイルを指定していった結果
- sshconfigのパーミッションを600に
IdentitiesOnly yes
を削除する
ことで解決した。前者は(ホストマシンであるMacでは)パーミッションがゆるゆるでも動作していたので、見落としていた。後者は若干、理由がわからないが、もしかするとMac側でvirtiofsを一時期ONにしていたことが問題かもしれない)
注:ssh user@sever -i ~/.ssh/private.rsa -F /dev/null -vvv
で詳細ログが確認できる