てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 「ansible-pylibssh not installed, falling back to paramiko」という警告の意味と対処

はじめに

最近のバージョンの 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 を利用するよ」というメッセージです。

明示的に paramikoansible-pylibssh を使うと設定していなくて、自動的に動作をこうしたよ、と伝えてくれる形です。

発生条件

分かっている範囲の発生条件をまとめると以下の通りです。

  • ansible.netcommon コレクション 3.0.0 以上を利用
  • ansible-pylibssh は未インストール
  • ansible.netcommon.network_cliコネクションプラグインのパラメーターで、ssh_typeが デフォルトのauto` のまま

対処

ssh_type が デフォルトの auto のままで、paramiko にフォールバックする動作をさせなければ、警告は表示されなくなります。

つまり、大きく分けて2つの対処方法があります。

  • ansible-pylibssh をインストールしつつ auto に任せる
  • paramikoansible-pylibssh か明示指定する

それぞれの設定方法は以下のとおりです。

対処方法1: ansible-pylibssh をインストールしつつ auto に任せる

あらかじめ ansible-pylibssh をインストールすれば paramiko にフォールバックすることはありません。

このアプローチにする場合は、pipansible-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 をつけると確認できます。詳細は以下の記事を参照してください。

tekunabe.hatenablog.jp

おわりに

最近では、AAP のデフォルトの Execution Environment (実行環境コンテナ)にも ansible-pylibssh が入っていたりするので、知らず知らずのうちに ansible-pylibssh を使っているというケースも増えてくるかなともいます。