■ はじめに
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: インターフェースの状態(present、absent、up、down)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/10 と GigabitEthernet1/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/10 と GigabitEthernet1/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でネットワークをテストする をご参照下さい。