はじめに
最近のバージョンの 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
を使っているというケースも増えてくるかなともいます。