はじめに
最近のバージョンの Ansible で Cisco IOS などのネットワーク機器に操作する Playbook を実行すると、以下のような警告(WARNING)を見かけたことはないでしょうか、
[WARNING]: ansible-pylibssh not installed, falling back to paramiko
エラーではないので、実行できるといえばできるのですが気になることもあると思います。
この警告の意味と表示させない対処方法についてまとめます。
意味
ネットワークモジュールが長らく内部的に利用している SSH クライアントライブラリとして、paramiko があります。
最近は ansible-pylibssh というもの新しいものもあります。登場した経緯は Ansible の公式ブログの記事に書かれています。
そして、各ネットワークモジュールが内部的に利用している ansible.netcommon コレクションの 3.0.0 から、デフォルトでは以下の動作になりました(該当 changelog))。Ansible Community Package の正式バージョンとしては 6.0.0 からです。
- 条件1:
ansible-pylibsshがインストールされている場合はansible-pylibsshを優先的で利用 - 条件2:
ansible-pylibsshがインストールされていない場合はparamikoを利用(フォールバック)
これは、ansible.netcommon.network_cli コネクションプラグインでいうと、ssh_type パラメーターのデフォルトが auto になったことによる動作です。
例の警告は、条件2のときに「ansible-pylibssh がインストールされていない場合は paramiko を利用するよ」というメッセージです。
明示的に paramiko や ansible-pylibssh を使うと設定していなくて、自動的に動作をこうしたよ、と伝えてくれる形です。
発生条件
分かっている範囲の発生条件をまとめると以下の通りです。
ansible.netcommonコレクション 3.0.0 以上を利用ansible-pylibsshは未インストール- ansible.netcommon.network_cli
コネクションプラグインのパラメーターで、ssh_typeが デフォルトのauto` のまま
対処
ssh_type が デフォルトの auto のままで、paramiko にフォールバックする動作をさせなければ、警告は表示されなくなります。
つまり、大きく分けて2つの対処方法があります。
ansible-pylibsshをインストールしつつautoに任せるparamikoかansible-pylibsshか明示指定する
それぞれの設定方法は以下のとおりです。
対処方法1: ansible-pylibssh をインストールしつつ auto に任せる
あらかじめ ansible-pylibssh をインストールすれば paramiko にフォールバックすることはありません。
このアプローチにする場合は、pip で ansible-pylibssh をインストールします。
pip install ansible-pylibssh
これで ansible-pylibssh を使うことになります。paramiko と挙動が変わってくる部分もあります。
対処方法2: paramiko を使うことを明示指定する
paramiko を使うよ、と明示的に指定しても警告が表示されなくなります。
変数で指定する場合:
ansible_network_cli_ssh_type: paramiko
ansible.cfg で指定する場合:
[persistent_connection] ssh_type = paramiko
環境変数で指定する場合:
ANSIBLE_NETWORK_CLI_SSH_TYPE=paramiko
補足
もちろん、ansible-pylibssh をインストールしたうえで、ansible-pylibssh を使うと明示指定しても大丈夫です。
ansible-pylibssh を使うと明示指定する場合の設定値は ansible-pylibssh ではなく libssh である点に注意が必要です(ssh_type パラメーターのドキュメントはここちら)。
変数で指定する場合:
ansible_network_cli_ssh_type: libssh
ansible.cfg で指定する場合:
[persistent_connection] ssh_type = libssh
環境変数で指定する場合:
ANSIBLE_NETWORK_CLI_SSH_TYPE=libssh
なお、どっちが使われたのかは、ansible-playbook で -vvvv をつけると確認できます。詳細は以下の記事を参照してください。
おわりに
最近では、AAP のデフォルトの Execution Environment (実行環境コンテナ)にも ansible-pylibssh が入っていたりするので、知らず知らずのうちに ansible-pylibssh を使っているというケースも増えてくるかなともいます。