てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] NetBox のタグを定義する netbox_tag モジュールの使い方

はじめに

NetBox では、デバイスIPアドレスなど様々なオブジェクトにタグを付けることができます。

NetBox 2.8 までは、タグは予め定義は不要だったのですが、NetBox 2.9 から事前の定義が必要になりました。逆にいうと未定義のタグを適用できません。

こうなると、自動化してる場合は対策が必要です。タグの定義 uri モジュールで API を叩けばできるといばできるのですが、netbox.netbox collection1.2.0netbox.netbox.netbox_tag モジュールができました。(changelog はこちら

他のオブジェクトと同じように専用モジュールによって冪等性を保てるようになります。

この記事では、簡単なサンプルで netbox.netbox.netbox_tag モジュールの使い方をご紹介します。

  • 環境
    • ansible 2.10.4
    • netbox.netbox collection 1.2.0
    • Python 3.8.5
    • NetBox 2.10.2

サンプル Playbook

以下がサンプル Playbook です。

---
- hosts: netbox10
  gather_facts: false
  connection: local

  vars:
    ansible_python_interpreter: "{{ ansible_playbook_python }}"

  tasks:
    - name: create tags
      netbox.netbox.netbox_tag:
        netbox_url: "http://{{ ansible_host }}"
        netbox_token: "{{ token }}"
        data:
          name: "{{ item.name }}"                 # タグの名前(必須)
          description: "{{ item.description }}"   # 説明
          color: "{{ item.color }}"               # 色
        state: present
      loop:
        - name: mgmt
          description: management
          color: 4caf50  # Green
        - name: 2021
          description: 2021
          color: ff9800  # Orange

オプションの説明

今この記事を書いている時点では、ドキュメントが生成されていませんが、コード内に埋め込まれたドキュメント用の記載を見ると詳細がわかります。

github.com

いずれ、以下のドキュメントにも反映されると思います。

netbox-ansible-collection.readthedocs.io

netbox_urlnetbox_token オプションは、他の netbox_* モジュールと同じく、接続用のオプションです。

data の中のオプションがタグを定義するためのものです。

data 配下のオプション 説明
name タグの名前(必須)
description 説明
color カラーコード。省略時は 9e9e9e (画面上の名前は Grey)

color は画面で指定できる色のカラーコードにする

画面上は以下のように、指定できる色が決まっています。

f:id:akira6592:20201228133316p:plain:w400
選択できるタグの色
一方で、モジュールのオプションで指定するカラーコードは自由です。ですが、画面で指定できない色に対応するカラーコードを指定してしまうと、画面で編集時に未選択状態となり、色の選択しなおしを迫られます。

そのため、最初からあらかじめ画面で指定できる色のカラーコードにするのが良いでしょう。

NetBox 2.10.2 の画面で指定できるタグのカラーコードと色名(括弧内)は以下のとおりです。

aa1409 (Dark red)
f44336 (Red)
e91e63 (Pink)
ffe4e1 (Rose)
ff66ff (Fuchsia)
9c27b0 (Purple)
673ab7 (Dark purple)
3f51b5 (Indigo)
2196f3 (Blue)
03a9f4 (Light blue)
00bcd4 (Cyan)
009688 (Teal)
00ffff (Aqua)
2f6a31 (Dark green)
4caf50 (Green)
8bc34a (Light green)
cddc39 (Lime)
ffeb3b (Yellow)
ffc107 (Amber)
ff9800 (Orange)
ff5722 (Dark orange)
795548 (Brown)
c0c0c0 (Light grey)
9e9e9e (Grey)
607d8b (Dark grey)
111111 (Black)
ffffff (White)

もしカラーコードがわかりにくい場合は、

color_codes:
  White: "ffffff"
# (略)

のようにまとめた変数を定義して、"{{ color_codes['White'] }}" のようにカラーコードを呼び出せるようにしておくと便利かもしれません。

実行

Playbook を実行します。

$ ansible-playbook -i inventory.ini tag.yml 

PLAY [netbox_pwd] *********************************************************************************

TASK [create tags] ********************************************************************************
changed: [netbox_pwd] => (item={'name': 'mgmt', 'description': 'management', 'color': '4caf50'})
changed: [netbox_pwd] => (item={'name': 2021, 'description': 2021, 'color': 'ff9800'})

PLAY RECAP *******************************************************************************************
netbox_pwd   : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

確認

画面の上のメニューの Organization 内の Tags をクリックして、タグ一覧画面を表示します。

f:id:akira6592:20201228132158p:plain
定義したタグが表示される

Playbook で指定した mgmt2021 の2つのタグができたことが確認できます。なお、この状態で再度Playbook を実行すると ok になります。エラーにならず便利です。

これにより、各オブジェクトの上記のタグが適用できるようになります。

f:id:akira6592:20201228132038p:plain
タグの適用

補足

Python 2.7 ではエラー

ansible_python_interpreter をデフォルトに任せてを 2.7 系のままにしていたら、以下のエラーが発生しました。

TASK [create tags] *******************************************************************************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TypeError: super() takes at least 1 argument (0 given)
(略)

非常に感覚的ですが、この手(引数足りない系?)のエラーが出たときは Python インタープリターが意図したものになっているかも確認するのがよさそうです。以前も何かで遭遇した気がします。

この記事の Playbook では、Python 3.8 にインストールした ansible に合わせるため、以下の指定をしていました。

  vars:
    ansible_python_interpreter: "{{ ansible_playbook_python }}"

おわりに

uri モジュールがあればなんとななると思いつつも、はやり専用モジュールは便利です。