■ はじめに
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でネットワークをテストする をご参照下さい。