はじめに
NetBox では、デバイスやIPアドレスなど様々なオブジェクトにタグを付けることができます。
NetBox 2.8 までは、タグは予め定義は不要だったのですが、NetBox 2.9 から事前の定義が必要になりました。逆にいうと未定義のタグを適用できません。
こうなると、自動化してる場合は対策が必要です。タグの定義 uri
モジュールで API を叩けばできるといばできるのですが、netbox.netbox
collection の 1.2.0
で netbox.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
オプションの説明
今この記事を書いている時点では、ドキュメントが生成されていませんが、コード内に埋め込まれたドキュメント用の記載を見ると詳細がわかります。
いずれ、以下のドキュメントにも反映されると思います。
netbox-ansible-collection.readthedocs.io
netbox_url
と netbox_token
オプションは、他の netbox_*
モジュールと同じく、接続用のオプションです。
data
の中のオプションがタグを定義するためのものです。
data 配下のオプション |
説明 |
---|---|
name |
タグの名前(必須) |
description |
説明 |
color |
カラーコード。省略時は 9e9e9e (画面上の名前は Grey ) |
color
は画面で指定できる色のカラーコードにする
画面上は以下のように、指定できる色が決まっています。
一方で、モジュールのオプションで指定するカラーコードは自由です。ですが、画面で指定できない色に対応するカラーコードを指定してしまうと、画面で編集時に未選択状態となり、色の選択しなおしを迫られます。
そのため、最初からあらかじめ画面で指定できる色のカラーコードにするのが良いでしょう。
NetBox 2.10.2 の画面で指定できるタグのカラーコードと色名(括弧内)は以下のとおりです。
もしカラーコードがわかりにくい場合は、
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
をクリックして、タグ一覧画面を表示します。
Playbook で指定した mgmt
と 2021
の2つのタグができたことが確認できます。なお、この状態で再度Playbook を実行すると ok
になります。エラーにならず便利です。
これにより、各オブジェクトの上記のタグが適用できるようになります。
補足
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
モジュールがあればなんとななると思いつつも、はやり専用モジュールは便利です。