てくなべ

ネットワーク、自動化などの技術的なことを書いていきます。

Ansible でNW機器のインターフェースが意図通りのVLANに所属しているかチェックする(associated_interfaces)

■ はじめに

Ansible 2.4 から、ネットワークモジュールに、設定だけでなく「意図した状態か」チェックする Declarative Intent という機能が追加されました。

参考 https://www.ansible.com/blog/networking-features-in-ansible-2-4

Ansible 2.4 時点では、 例えば ios_interfaeや、junos_interfaceモジュールなどの、以下のオプションによりチェックすることができます。

  • neighbors: CDP/LLDPのホスト、ポート情報
  • state: インターフェースの状態(presentabsentupdown
  • rx_rate: 受信レート(bps)がとの程度か
  • tx_rate: 送信レート(bps)がとの程度か

あくまで、チェックするためのオプションであるため、指定した通りに設定するという機能ではりません。

この記事では、Ansible 2.5 でios_vlanモジュールに追加された、associated_interfaces オプションを利用し、想定したインターフェースが特定の VLAN に所属されているかチェックする方法をご紹介します。


■ ネットワーク機器側の状態

ネットワーク機器側の VLAN と インターフェースの所属関係は以下の状態とします。

Switch13(config)#do sh vlan

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Gi1/0/1, Gi1/0/2, Gi1/0/3, Gi1/0/4
                                                Gi1/0/5, Gi1/0/6, Gi1/0/7, Gi1/0/8
                                                Gi1/0/9, Gi1/0/12, Gi1/0/14
                                                Gi1/0/15, Gi1/0/16, Gi1/0/17
                                                Gi1/0/18, Gi1/0/19, Gi1/0/20
                                                Gi1/0/21, Gi1/0/22, Gi1/0/23
13   VLAN0013                         active    Gi1/0/13
99   VLAN0099                         active    Gi1/0/10, Gi1/0/11
192  VLAN0192                         active    Gi1/0/24

(コンフィグ抜粋)

interface GigabitEthernet1/0/9
!
interface GigabitEthernet1/0/10
 switchport access vlan 99
 switchport mode access
!
interface GigabitEthernet1/0/11
 switchport access vlan 99
 switchport mode access
!
interface GigabitEthernet1/0/12
!

今回は、vlan99(Gi1/0/10, Gi1/0/11)をチェック対象とします。


■ 意図通りの状態の場合

チェックが成功するような Playbook で試します。

Playbook

先程ネットワーク機器側で確認したように、vlan99 に GigabitEthernet1/0/10GigabitEthernet1/0/11 が所属していることをチェックします。 所属インターフェースの指定には、 associated_interfaces オプションを利用します。

- hosts: ios
  gather_facts: no

    - name: check vlan
      ios_vlan:
        vlan_id: 99
        associated_interfaces:
            - GigabitEthernet1/0/10
            - GigabitEthernet1/0/11

実行結果

以下のように、ok となります。

(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory ios_test.yml

PLAY [ios] **************************************************************************************************************
TASK [check vlan] *******************************************************************************************************
ok: [192.168.1.13]

PLAY RECAP **************************************************************************************************************
192.168.1.13               : ok=1    changed=0    unreachable=0    failed=0


■ 意図していない状態の場合

今度は、チェックが失敗するような Playbook で試します。

Playbook

先程とは異なり、 GigabitEthernet1/0/12 という vlan99 に所属しないインターフェースを追加で指定してみます。

- hosts: ios
  gather_facts: no

    - name: check vlan
      ios_vlan:
        vlan_id: 99
        associated_interfaces:
            - GigabitEthernet1/0/10
            - GigabitEthernet1/0/11
            - GigabitEthernet1/0/12    # not vlan99

実行結果

今度は、failed となります。"Interface GigabitEthernet1/0/12 not configured on vlan 99" というていねいなエラーメッセージが確認できます。

(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory ios_test.yml

PLAY [ios] **************************************************************************************************************

TASK [check vlan] *******************************************************************************************************
fatal: [192.168.1.13]: FAILED! => {"changed": false, "msg": "Interface GigabitEthernet1/0/12 not configured on vlan 99"}
        to retry, use: --limit @/vagrant/ios_test.retry

PLAY RECAP **************************************************************************************************************
192.168.1.13               : ok=0    changed=0    unreachable=0    failed=1


■ 注意点

2点ほど注意点をあげます。

インターフェース名の指定はコンフィグ上の表記通りに

associated_interfaces オプションで指定するインターフェース名は、コンフィグ上の表記通りにする必要があります。

  • 正しい表記の指定例
        associated_interfaces:
            - GigabitEthernet1/0/10
            - GigabitEthernet1/0/11
  • 誤った表記の指定例(インターフェース名を省略してしまっている)
        associated_interfaces:
            - Gi1/0/10
            - Gi1/0/11

誤った表記の指定の仕方をすると、正しくチェックができませんので注意が必要です。

インターフェース名の指定が不足していても ok となる

例えば、vlan99に GigabitEthernet1/0/10GigabitEthernet1/0/11 が所属している状態で、以下のように associated_interfaces オプションで GigabitEthernet1/0/10 のみを指定した場合でも、チェック結果は ok となります。

    - name: check vlan
      ios_vlan:
        vlan_id: 99
        associated_interfaces:
            - GigabitEthernet1/0/10

そのため、チェックの意味合いとしては、

  • associated_interfaces オプションで指定したインターフェースが vlan_id オプションで指定した vlan に所属していること

になります。

  • vlan_id オプションで指定した vlan に associated_interfaces オプションで指定したインターフェースが過不足なく所属していること

ではないので注意が必要です。


■ まとめと補足

現段階ではチェックできるオプションは多くないですが、今後増えてくるかもしれません。 チェックしたいオプションがある場合は、利用を検討してみてはいかがでしょうか。

また、チェック(テスト)するという観点では、napalm_validate というサードパーティモジュールを利用する方法もあります。詳細は、AnsibleとNAPALMでネットワークをテストする をご参照下さい。