はじめに
近年、ネットワーク機器への作業を自動化するOSS のツールやライブラリが増えてきています。この記事では、こんな観点でツールを検討するのが良いのでは、という自分の案をまとめてみます。
例示するツールとしては、Python で実装されている Ansible、Netmiko、NAPALM、Nornir を取り上げています。標準で利用できる機能を想定しています。
※ 2019/01/08 時点のバージョン、Ansible 2.7.5、Netmiko 2.3.0、NAPALM 2.3.3、Nornir 2.0.0 を対象
■ 検討ポイント
[1] 対象プラットフォームに対応しているか
まず気になるのが、そのツールが操作対象のプラットフォーム(Cisco IOS、Juniper Junos、Arista EOS など)に対応しているか、ということだと思います。
各ツールの対応状況が分かるリンクを掲載します。
Ansible の対応数は中くらい
https://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html
Netmiko は多め
https://github.com/ktbyers/netmiko#supports
NAPALM は少なめ
https://napalm.readthedocs.io/en/latest/support/index.html
Nornir は他に依存
実際の接続部分に netmiko、NAPALM のどちらを選択するかに依存します。
[2] コードを書くか、書かないか
仕組みを作る人、使う人、メンテナンスする人のスキルセットなどによって、コード(プログラム)を書くか書かないかという方針も変わってくると思います。
コードを書くという場合は、netmiko、NAPALM、Nornir といった、Python ライブラリとして提供されてものが利用できます(Ansible も Python API あり)。
一方で、コードを書かないという場合は、 Ansible のような YAML で構成を定義していくタイプが候補に挙げられます。
[3] シンプルか、高機能か
シンプルなツールは、それに特化して覚えることが少ないですが、自前で処理を作る部分が多くなります。 高機能なツールは逆に、覚えることが多いですが、自前処理は少なります。
Python ライブラリでは、シンプルな順に netmiko、NAPARLM、Nornir ではないかと思います。
[4] すでに利用しているツールがあるか
例えば、すでにサーバーチームが Ansible を利用している、といった状況であれば、相乗りで導入しやすくなるのではないでしょうか。 他にも、既存のスクリプトがあるのであれば、同じツールを利用すると統一感がとれます。
[5] どのくらい操作を抽象化したいか
TeraTerm マクロのように show run
等のコマンドをそのまま実行するタイプに対して、get_config
のような関数を介してコマンドを実行することをここでは抽象化と呼びます。抽象化は、コマンドやベンダー意識しなくてよい(程度はものによります)、パラメータ化しやすいといったメリットがあります。
Ansible
コマンドそのまま実行する、ios_commmand
や ios_config
のようなモジュールのほかに、ios_system
のような、コマンドを抽象化したモジュールもあります。プラットフォームによって、まちまちです。
Netmiko
コマンドそのまま実行するタイプです。抽象化したい場合は、テンプレート化などで対応する必要があります。
NAPALM
get_config
や get_interfaces
などのコマンドを抽象化した関数があります。コマンドそのまま実行することもできます。
Nornir
実際の接続部分に Netmiko、NAPALM のどちらを選択するかに依存します。
[6] インベントリ・変数管理機能が必要か
ツールによっては操作対象の機器をグループ定義して管理したり、それらが利用する変数を定義したりする機能が、あらかじめ備わっているものがあります。
Ansible
接続対象を管理する Inventory や、ホストやグループ単位で変数を管理する仕組みがあります。
netmiko
特に接続対象や変数を管理する仕組みはありません。
NAPALM
特に接続対象や変数を管理する仕組みはありません。
Nornir
接続対象を管理する Inventoryや、ホストやグループ単位で変数を管理する仕組みがあります。
■ まとめ
ポイント | Ansible | Netmiko | NAPALM | Nornir |
---|---|---|---|---|
[1] 対応プラットフォーム数 | 中 | 多い | 少ない | 接続部分に依存 |
[2] コード? | YAML | Python | Python | Python |
[3] シンプル/高機能 | 高機能 | シンプル | 高機能 | 高機能 |
[4] すでに利用しているか | - | - | - | - |
[5] 抽象化レベル | ◬ | × | 〇 | 接続部分に依存 |
[6] インベントリ・変数管理機能 | 〇 | × | × | 〇 |
どんな観点でネットワーク自動化のツールを検討するのという案をまとめました。考え方や状況によって選び方は変わってくると思います。参考になれば幸いです。
なにかご意見ございましたら @akira66592 までご連絡いただければと思います。
参考
www.slideshare.net tekunabe.hatenablog.jp tekunabe.hatenablog.jp