netboxのLocal Contextを更新する

初めに

netboxのLocal ContextをAnsibleのnetbox.netbox.netbox_deviceモジュールで更新する場合、local_context_dataパラメータに指定した値で全て上書きされてしまいます。このため、既に何らかの値がLocal Contextに設定されていて、そこに別の値を追加したい場合、下記のステップを踏む必要があります。

  1. Ansible側で既存のLocal Contextを取得
  2. 取得したLocal Contextに追加したい値をマージ
  3. マージした値をLocal Contextに登録

今回はkey1、key2が登録された状態から、key3を追加するPlaybookを書きました。

netbox上のイメージ

f:id:ikiri96hyo:20201115145657p:plain
before

f:id:ikiri96hyo:20201115145710p:plain
after

Playbook

- hosts: localhost
  gather_facts: false
  connection: local
  tasks:
    - name: Fetch local context
      set_fact:
        current_local_context_data: "{{ query('netbox.netbox.nb_lookup', 'devices',
                                        api_endpoint=netbox_url,
                                        api_filter='name=device01',
                                        token=netbox_token).0.value.local_context_data }}"

    - name: Debug current_local_context_data
      debug:
        var: current_local_context_data

    - name: Update local context data
      netbox.netbox.netbox_device: 
        netbox_token: "{{ netbox_token }}"
        netbox_url: "{{ netbox_url }}"
        data:
          name: device01
          local_context_data:
            "{{ current_local_context_data | combine({'key3':'value3'}) }}"

    - name: Debug local_context_data
      debug:
        msg: "{{ query('netbox.netbox.nb_lookup', 'devices',
                  api_endpoint=netbox_url,
                  api_filter='name=device01',
                  token=netbox_token).0.value.local_context_data }}"

実行結果

PLAY [localhost] ****************************************************************************************************************************************************************************

TASK [Fetch local context] ******************************************************************************************************************************************************************
ok: [localhost]

TASK [Debug current_local_context_data] *****************************************************************************************************************************************************
ok: [localhost] => 
  current_local_context_data:
    key1: value1
    key2: value2

TASK [Update local context data] ************************************************************************************************************************************************************
changed: [localhost]

TASK [Debug local_context_data] *************************************************************************************************************************************************************
ok: [localhost] => 
  msg:
    key1: value1
    key2: value2
    key3: value3

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