Ansibleプロジェクトにssh設定を保存し、相対パスを使用してトンネルの問題を解決する

Ansibleは優れたサーバー管理ツールです。 gitとともに、コードレビュー、マージ(プル)変更要求などの付属機能をすべて備えたコードパラダイムとしてデプロイすることができます。 これは、チームが唯一の人ではなく、それに取り組んでいる場合に特に当てはまります。







この観点から、インベントリ/ホストファイルに加えて、管理対象ホストに直接接続するための設定を同じリポジトリに保存することは明らかに便利になります(一般に、CMDBuildなどのサービスに配置する方が適切です)。 つまり、ホスト、たとえば接続ポートまたはIPアドレスが変更された場合、チームの他のメンバーは、次回リポジトリから変更をプルするときに取得し、〜/ .ssh / configファイルに変更を加えないでください。







さらに、ほとんどのパラメータは労力をかけなくても適切に機能しますが、sshトンネルを使用する場合はそれほど単純ではありません。

そのため、設定をinventory / ssh.configファイルに保存したとします。

メイン接続と基本設定を登録しました:







Host * IdentityFile /secret/id_rsa User wheel Host host.one HostName 1.2.3.4 User ant Host host.two HostName 2.3.4.5 Port 2022
      
      





まあなど、すべてが標準です。通常、ユーザーレベルの構成で指定します。







Ansible.cfgは、-Fオプションを使用して相対パスを指定することを提案します。







 ssh_args = -o ControlMaster=auto -o ControlPersist=60s -F inventory/ssh.config
      
      





これにより、誰もがリポジトリを複製し、マシンとアクセスを設定せずにすぐに作業を開始できるようになります(もちろん、プライベートアクセスキーを取得する価値がある場合、ここに保存することは一般的に推奨されませんが、チーム内のリポジトリがプライベートである場合、これも考慮できます) 。







ただし、次のようなトンネルを使用しようとすると、ほとんどのオプションが機能します。







 Host organization.gateway HostName 1.2.3.4 Host inner.host HostName 2.3.4.5 ProxyCommand ssh organization.gateway -W %h:%p
      
      





inner.hostホストに接続できないというエラーがすぐに表示されます!







どうして?

実際、すべてがシンプルです。 Ansible on connectionは単にsshバイナリファイルを呼び出し、指定されたオプションをそれに渡します。 次に、トンネルがここに示されます。これは、sshが指定されたコマンドをそのままフォークして呼び出します。 ちなみに、ncまたはiptables(firewalld)を使用したポート転送が可能です。 つまり、解釈は行われません。 そして、これはコマンドが呼び出されることを意味します:







 ssh organization.gateway -W %h:%p
      
      





そして一般に、sshはorganization.gatewayが何であるかを知らないため、接続を確立できません。







もちろん、ファイルへのパスをここに示すことで、この状況を修正できます。







 Host inner.host HostName 2.3.4.5 ProxyCommand ssh -F /path/to/same/ssh.config organization.gateway -W %h:%p
      
      





それは機能しますが、特定のマシン上のパスにアタッチしたくはありませんでしたが、すべての人に普遍的なファイルを保存したいのです!

この問題の部分的な解決策は相対パスを示すことですが、別のディレクトリから絶対パスでansibleを呼び出したい場合にのみ部分的に解決します。







なぜなら sshはbashの構成の継承を提供しません(shでも機能するはずです。他の構成では少し変更することができます)。これを単純にエミュレートできます。







 Host inner.host HostName 2.3.4.5 ProxyCommand ssh $( egrep -z -A1 '^-F$' /proc/$PPID/cmdline ) organization.gateway -W %h:%p
      
      





変更したものすべて、「 $(egrep -z -A1 '^ -F $' / proc / $ PPID / cmdline) 」を入力すると、すべての魔法がここで発生します。 そのため、「メインのsshプロセスが呼び出されるのと同じ構成」です。







これは単純に機能します。生成されたプロセスの場合、-Fオプションの値が置き換えられ、呼び出し元のオプションから抽出されます。








All Articles