てくなべ (tekunabe)

ansible / network automation / 学習メモ

[NetBox] カスタムリンクでオブジェクト(obj)のどんな値を参照できるかの調べ方

はじめに

以前の記事で、NetBox にカスタムリンクを作成する方法をご紹介しました。

tekunabe.hatenablog.jp

この中で、TextURL の項目では、オブジェクトの名前などの情報を参照できることに触れました。

画面内の説明には Reference the object as {{ obj }} とあり、たしかに {{ obj }} とするとオブジェクト名(デバイスならデバイス名)を参照できました。

{{ obj.site }} のようにすると、名前だけでなくその他の値も参照できます。

この記事では、カスタムリンクの TextURL の項目で、どのようなオブジェクトの値が参照できるかを調べ方をご紹介します。

調べ方が分かった経緯

どのようなオブジェクトの値が参照できるかは、ドキュメントには掲載されていません。

どうやったら分かるかなと思ったときに、雰囲気で {{ obj }} の代わりに {{ obj.pk }} を試しました(NetBox が Django で作られいることは分かっていました)。すると、オブジェクトのID (PrimaryKey)的なものが参照できたので、ここで指定するのは View の一部のようなもなんだろうと解釈しました。

対応する model を探す

ということで、画面に対応する model を参照すれば、その obj がどのような値を持つのか分かりそうです。

バイスの場合は、netbox/dcim/models/__init__.py にデバイスの model の定義 class Device があります。(2.9系だとnetbox/dcim/models/devices.py

IPアドレスの場合は、netbox/ipam/models.pyです。

デバイスの model の定義の中身を見ていくと、name の他、platformstatus などのフィールドがあることが分かります。 これにより、カスタムリンク側から、obj.name のようにすれば良いと推測できます。

具体的な指定と値の例です。

指定 値の例
obj.platform ios
obj.status active
obj.primary_ip4 192.168.1.11/24
obj.primary_ip4.address.ip 192.168.1.11

なお、値が空になっている項目を Text にした場合はリンクが表示されません。例えば、カスタムリンクの Text で {{ obj.comments }} とだけ指定した場合、Comments が空のデバイスのを開いたときは、リンク字体が画面に表示されません。

テンプレートも参考に

View に仕様しているテンプレートも参考になります。

例えば、デバイス画面であれば、netbox/templates/dcim/device.htmlです。IPアドレスならnetbox/templates/ipam/ipaddress.htmlです。

デバイス画面のテンプレートを見ると、

{{ device.site }}

のような記載があります。カスタムリンクとしては

{{ obj.site }}

のように、deviceobj に置き換えれば参照できます。

おわりに

カスタムリンクの TextURL で、オブジェクトのどうのような値を参照できるかを調べる方法をご紹介しました。もっと効率がいい調べ方があるかもしれませんが、現在のところ私はこうやりました、という位置づけです。

なお、カスタムフィールドなど少し特殊な項目は、もうひと工夫必要そうです。

[2020/10/16 追記] カスタムフィールドは obj.cf.カスタムフィールド名 で参照できました。Export Templateの書式が参考になりました。