[NetBox]Remote Data Sources機能を使ってGitデータ同期してみる

# はじめに

今更ですがNetBox v3.5.0で`Remote Data Sources`機能が[リリースされました](https://github.com/netbox-community/netbox/releases/tag/v3.5.0)。


[ドキュメント](https://docs.netbox.dev/en/stable/models/core/datasource/)では、以下説明があります。

> A data source represents some external repository of data which NetBox can consume, such as a git repository.
> Files within the data source are synchronized to NetBox by saving them in the database as data file objects.

簡潔に説明すると、`Local`,`Git`,`Amazon S3`のようなデータソースのファイル(とその中身)をNetBoxに同期して管理できるようです。

同期したファイルの活用方法や既存データとどう組み合わせるかはまだ検討段階のようですが
現状、`Scripts`機能で使うスクリプトファイルや`Config Contexts`のデータを管理することができるようになっています。

本記事では、`Remote Data Sources`の説明も兼ね
`Scripts`機能と連携してデータとスクリプトをGitで管理し、データ同期するような仕組みを作ってみました。

# 全体構成

構成は以下の図の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/dc6e34d3-97dd-298a-6199-6ae0844ccf4f.png)

GitHubレポジトリにNetBoxデータとスクリプトを配置します。

NetBox側では`Remote Data Sources`でGitHubからデータを同期し、
`Scripts`でPythonスクリプトを実行してNetBoxデータオブジェクトを作成・更新します。

今回は、Sitesオブジェクトのみを同期します。

## GitHub

今回作った構成用のレポジトリ。
同じレポジトリにスクリプトとデータファイルを配置しています。

https://github.com/miyuk/netbox-test-data

- スクリプトファイル: `scripts/load_data_sources.py`
- データファイル(Sites情報): `netbox_data.yml`

## NetBox

### Resource Data Sources

まずは、`Data Sources`より、GitHubに公開したレポジトリを登録します。

`Ignore rules`では、同期対象外のファイルを正規表現で指定することができます。
今回はすべてのファイルを同期対象にするため未記載です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/265d51cc-e23c-29aa-3bfa-3be447328a72.png)

プライベートレポジトリであればオプションでGitユーザ、パスワードも指定できます。
**パスワードは暗号化されず、Web上もマスクされないので注意**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/2ed42cc7-d523-658c-109e-63a7d0a50fad.png)

`Save`を押してオブジェクトを作成し、`Sync`ボタンよりデータを同期します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/d24d574f-d867-ae15-9a26-9fe99a6129c5.png)

数秒でファイルが同期され、NetBox上からファイルの中身や変更日が確認できます。

同期は、現状手動しか対応指定なさそうです。
そのため、定期的に自動同期をしたい場合は`Scripts`機能でスケジュール設定をした上で[API](https://demo.netbox.dev/api/schema/swagger-ui/#/core/core_data_sources_sync_create)を叩く必要がありそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/8469f81b-d6ba-3926-4eb4-fd945ad4396f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/2d80619b-8a30-3fbf-cf4f-f11b2a8a5a00.png)


### Scripts

次にスクリプトを登録します。

`Scripts`より、先ほど登録した`Data Sources`のスクリプトファイル(今回だと、`scripts/load_data_sources.py`)を選択します。

`Auto sync enabled`にチェックを入れると、`Remote Data Sources`の同期を行った際にスクリプト側のファイルも更新されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/15111521-7fe9-81bf-ec2d-118d11b29da1.png)

Scriptsオブジェクトができれば、選択してスクリプトを実行します。

`Data Source`, `Data File`で`netbox_data.yml`を選択して`Run`を押すとスクリプトが実行されてSiteデータが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/7e74128a-6cf3-9393-4dde-bfa90e1fbafc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/d433d800-7ef5-436d-f2bb-8761548ba5f5.png)

# おわりに

今まで、`Scripts`の機能はユースケースが見いだせずに使っていませんでしたが`Remote Data Sources`機能ができたことで、外部データ連携が容易になり色々と使えそうなので、今後も何か思いつき次第検証します。

また、Data Sources機能についても今後FTPやHTTPを外部ソースとして使えるようにしていくらしいのでそちらの動向も待ちたいと思います。


NetBoxから他のデータソースを統合して管理することができることにより、NetBoxがSSOTとして更に進化したと感じました。
まだデータの活用方法がスクリプトありきですが、開発が進まり抽象化したうえで万人には使いやすくなればと思います。

# 参考リンク
- https://github.com/netbox-community/netbox/issues/11558