Openstackの要塞の背後でいくつかのテストサーバーを実行しています。テストスタックは頻繁に削除および作成されます。スタックが作成された後、Ansibleスクリプトのセットを実行してサーバーをインストールおよび構成します。プロセスはほぼ完全に自動化されていますが、リモートホストが踏み台インスタンスの背後にある場合、ssh-keyscan
を機能させることができません。
これが私の~/.ssh/config
にあります
Host bastion
HostName 1.2.3.4
User myuser
IdentityFile ~/.ssh/private_key.pem
Host remote-Host1
HostName 192.168.0.123
User myuser
IdentityFile ~/.ssh/private_key.pem
ProxyCommand ssh -W %h:%p bastion
ssh-keyscan remote-Host1
を実行しようとすると、
getaddrinfo remote-Host1: Name or service not known
ssh remote-Host1
の実行は機能しますが、プロンプトが表示されます
The authenticity of Host '192.168.0.123 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)?
これを避けようとしています。
SSHオプション-o StrictHostKeyChecking=no
があり、ssh_args
構成オプションを使用してこれをAnsibleに渡すことは可能です。私はそれを使いたくありませんが。指紋を確認せずにssh-keyscanを使用すると、中間者攻撃が可能になることも知っています。このテスト環境のシナリオでは、自分のIPのみがアクセス用のホワイトリストに登録されているので、リスクを冒してもかまいません。
クイックグーグル suggests ssh-keyscanはssh設定ファイルと他のすべてのsshトリックを尊重しません。 (このスレッドはかなり古いですが)。
Ansibleを使用すると、キースキャンタスクを踏み台インスタンスに委任して、known_hostsファイルをローカルに追加できます。
- hosts: localhost
gather_facts: no
tasks:
- command: "ssh-keyscan {{ new_Host }}"
register: new_Host_fingerprint
delegate_to: bastion
- lineinfile:
dest: /root/ssh/known_hosts
line: "{{ item }}"
with_items: "{{ new_Host_fingerprint.stdout_lines }}"
どこ new_Host
は、作成されたホストのIPアドレスです(例では192.168.0.123)。
要塞にSSH接続し、そこからssh-keyscan
を実行します。
ssh bastion ssh-keyscan remote-Host1