うさラボ

お勉強と備忘録

AnsibleでNetboxを触るときのTIPS

Netboxのおさらい

IPAM機能(IP/PREFIX/VLAN/VRF)とDCIM機能(Device/Rack/Power/Cable) を兼ねそろえたOSSのWebツール
できることは以下

  • IPアドレス管理(IPAM) -IPネットワークとアドレス、VRF、およびVLAN
  • 機器ラック-グループおよびサイトごとに整理
  • バイス-デバイスの種類とインストール場所
  • 接続-デバイス間のネットワーク、コンソール、および電源接続
  • 仮想化-仮想マシンクラスタ
  • データ回線-長距離通信回線およびプロバイダー
  • シークレット-機密性の高いクレデンシャルの暗号化されたストレージ

Netboxでできないこと

スコープ外の機能、ほかのツールと組み合わせて使うよいもの

  • 構成管理
  • DNSサーバー
  • RADIUSサーバー
  • 構成管理
  • 要員派遣

構成管理はlocal_contextなど使えばできないこともなさそうだなぁとは思ったり

リポジトリ
github.com

ドキュメント
netbox.readthedocs.io

環境

Netbox 2.10 (https://netboxdemo.com/)デモ環境
Ansible 2.10
pynetbox 5.3.1

準備

  • pynetboxのライブラリが必要なのでインストール pip install pynetbox 実施
  • netbox collectionのインストール ansible-galaxy collection install netbox.netbox 実施
  • netboxでAPIトークンを作成
    f:id:usage_automate:20210426215341p:plain

  • URLとTokenは変数として格納しておく(netbox_url/netbox_token)

自動払い出し機能付きモジュールの使い方

netbox_prefix

sampleのタスクを下記に記載
ポイントは parentfirst_available
親セグメントから余りのprefixを払い出してくれる。
(192.168.0.0/24から/28を払い出す)

- name: create prefix
  netbox.netbox.netbox_prefix:
    netbox_url: "{{ netbox_url }}"
    netbox_token: "{{ netbox_token }}"
    validate_certs: false
    data:
      parent: "{{ prefix }}"
      prefix_length: "{{ prefix_length }}"
    state: present
    first_available: true
  vars:
    prefix: 192.168.0.0/24
    prefix_length: 28

ちなみに払い出せない場合はSKIPになる

netbox_ip_address

sampleplaybookを下記に記載
こちらは state: new にすることでprefix内からipaddressを払い出してくれる

- name: "Address payout "
  netbox.netbox.netbox_ip_address:
    netbox_url: "{{ netbox_url }}"
    netbox_token: "{{ netbox_token }}"
    validate_certs: false
    data:
      prefix: "{{ prefix }}"
    state: new
  vars:
    prefix: 192.168.0.0/24

設定更新時に使えるquery_params

netbox_ip_addressは特に意識せずに使ってしまうと重複して登録ができてしまう場合があります
(VIPなど、複数DeviceにIPを紐付ける場合があったりするためそういった仕様なのかもしれないです)

それでは困る場合もありますが、そんな時に使えるのがquery_paramsです
ユニークなオブジェクトに対して処理を実行できます
使い方

- name: ip address assinge
   netbox.netbox.netbox_ip_address:
     netbox_url: "{{ netbox_url }}"
     netbox_token: "{{ netbox_token }}"
     data:
       address: "192.168.0.1/32"
       assigned_object:
          name: "Gi1/0/1"
          device: "device_a"
     query_params:
       - address

便利なnb_lookup

netboxのcollectionにはlookup pluginも用意されています
めちゃめちゃ便利なnb_lookupを紹介します

使い方

- name: fetch prefixes
   set_fact:
      prefixes: "{{ q('netbox.netbox.nb_lookup', 'prefixes',
                             api_endpoint=netbox_url,
                             api_filter=filter_value,
                             token=netbox_token)}}"
    vars:
      filter_value: 'mask_length=24'

prefixes の部分は使えるkeywordが決まっている、書き換えるといろいろなリソースにアクセスすることができる
`api_filter‘はクエリする際のパラメータ部分になります

上記例では/24のPrefixのみを取得できる
ちなみに、パラメータを増やす際はスペースで区切る

実行するとkeyとvalueが返ってくる、valueの中に細かい情報が入っています
f:id:usage_automate:20210426213527p:plain

nb_lookupで使えるkeyword

  • aggregates
  • circuit-terminations
  • circuit-types
  • circuits
  • circuit-providers
  • cables
  • cluster-groups
  • cluster-types
  • clusters
  • config-contexts
  • console-connections
  • console-ports
  • console-server-port-templates
  • console-server-ports
  • device-bay-templates
  • device-bays
  • device-roles
  • device-types
  • devices
  • export-templates
  • front-port-templates
  • front-ports
  • graphs
  • image-attachments
  • interface-connections
  • interface-templates
  • interfaces
  • inventory-items
  • ip-addresses
  • manufacturers
  • object-changes
  • platforms
  • power-connections
  • power-outlet-templates
  • power-outlets
  • power-port-templates
  • power-ports
  • prefixes
  • rack-groups
  • rack-reservations
  • rack-roles
  • racks
  • rear-port-templates
  • rear-ports
  • regions
  • reports
  • rirs
  • roles
  • secret-roles
  • secrets
  • services
  • sites
  • tags
  • tenant-groups
  • tenants
  • topology-maps
  • virtual-chassis
  • virtual-machines
  • virtualization-interfaces
  • vlan-groups
  • vlans
  • vrfs

github.com

まとめ

何かと便利なNetboxですがAnsibleで操作するさいに忘れがちなことをまとめてみました。

※ダイナミックインベントリは試せてないのでまたいつか・・