はじめに
Ansible からネットワーク機器に ansible.netcommon.network_cli コネクションプラグイン)で接続するに、内部的に paramiko を利用するか libssh を利用するかを ssh_type オプションで選択できます。
このうち、 libssh を利用する場合(ansible.netcommon.libssh)、変数で指定できる SSH クライアントの設定(KexAlgorithms など)が増えてきています。たとえば、ansible.netcommon コレクションの 8.2.0 の CHANGELOG では、key_exchange_algorithms の設定項目ができた旨の記述があります。
~/ssh/config に指定すれば手動の ssh コマンドでも反映されて共通化できてこれはこれでよいですが、もし ~/ssh/config ではなく Ansible で閉じた世界(変数)で指定したい場合に便利です。
試したら確かにできたので、簡単ですが変数のサンプルを掲載します。
- 検証環境
- ansible-core 2.16.15
- ansible-pylibssh 1.3.0
- ansible.netcommon 8.2.0
変数による KexAlgorithms などの指定
例えば、Ansible からネットワーク機器に対して接続したときに以下のエラーになった場合、 ~/ssh/config で KexAlgorithms を設定したりすると思います。
fatal: [ios01]: FAILED! => {"changed": false, "msg": "ssh connection failed: ssh connect failed: kex error : no match for method kex algos: server [diffie-hellman-group14-sha1], client [curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group18-sha512,diffie-hellman-group16-sha512,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256]"}
この手の設定を ~/ssh/config ではなく、変数でも指定できるという話です(厳密には ansible.cfg や環境変数でも)。
指定できる設定の一覧は ansible.netcommon.libssh のキュメントのパラメーター一覧で雰囲気がつかめます。
たとえば、 ~/ssh/config で以下の設定をする場合。
Host hogehoge KexAlgorithms diffie-hellman-group14-sha1 HostKeyAlgorithms ssh-rsa PubkeyAcceptedKeyTypes ssh-rsa
変数だと以下のような指定になります。
--- ansible_libssh_hostkeys: ssh-rsa ansible_libssh_key_exchange_algorithms: diffie-hellman-group14-sha1 ansible_libssh_publickey_algorithms: ssh-rsa
なお、上記の変数には含めていませんが、ansible_network_cli_ssh_type はデフォルトで auto です。ansible-pylibssh がインストールされていれば自動で libssh 扱いになります。逆に、ansible-pylibssh がインストールされていない場合は paramiko にフォールバックします(この場合は ansible_libssh_* 変数は利用できない)。
おわりに
「 ~/ssh/config じゃない方法で設定を指定したい」というケースはあまり多くないかもしれませんが、いざというときに便利そうです。