必要となった理由
WAN側回線工事をするので、ほっとくと、IFがup/downしたりしてなんか辛そうなので、
あらかじめ落としておいて、工事が終わるころにまた上げるようにするのを自動化したいという要望があったため。
NW構成
よくあるWAN回線2本に
それぞれWANルータがぶら下がってその下にFWがある感じ。
WAN-RT はCisco(IOS-XE)でした。
WAN回線A - WAN-RT01 --+--FW -- internal
WAN回線B - WAN-RT02 --|
ファイル構成
+inventory
+ifchange.yml
+tasks/
+if_check.yml
+if_up.yml
+if_down.yml
ファイル
inventory
[RT01]
192.168.1.1 interface=GigabitEthernet0/0/0
[RT02]
192.168.1.2 interface=GigabitEthernet0/0/1
ifchange.yml
- hosts: "{{ host }}"
connection: local
gather_facts: false
vars:
ansible_python_interpreter: "path to python"
cli:
host: "{{ inventory_hostname }}"
username: login user name (priv 15)
password: login pasword
tasks:
- fail:
msg: 'mode is not set or invalid. require "up" or "down".'
when: mode is undefined or not( mode == "up" or mode == "down")
- include: tasks/if_check.yml
- include: "tasks/if_{{ mode }}.yml"
- include: tasks/if_check.yml
tasks/if_check.yml
- name: interface check
iso_facts:
gather_subset: interface
provider: "{{ cli }}"
tasks/if_up.yml
- name: interface up
iso_config:
provider: "{{ cli }}"
lines:
- "no shutdown"
parents: "interface {{ interface }}"
when: item.key == "{{ interface }}" and not item.value.operstatus == "up"
with_dict: "{{ ansible_net_interfaces|default({}) }}"
tasks/if_up.yml
- name: interface up
iso_config:
provider: "{{ cli }}"
lines:
- "shutdown"
parents: "interface {{ interface }}"
when: item.key == "{{ interface }}" and item.value.operstatus == "up"
with_dict: "{{ ansible_net_interfaces|default({}) }}"
実行方法
RT01のインターフェースを落とす
# ansible-playbook -i inventory ifchange.yml -e "mode=down host=RT01"
RT02のインターフェースを上げる
# ansible-playbook -i inventory ifchange.yml -e "mode=up host=RT02"
なんでこんなことしたの?
時間が余ったからです。
最初はワンショット的に使えればいいということで
ルータ1のIFを落とすplaybookとルータ1のIFを上げるplaybook を書いてました。
実際どう使ってるの?
echo 'ansible-playbook -i inventory ifchange.yml -e "mode=down host=RT01" | sendmail mail@address.com' | at hh:mm MM/DD/YY
とか
echo 'ansible-playbook -i inventory ifchange.yml -e "mode=up host=RT01" | sendmail mail@address.com' | at hh:mm MM/DD/YY
とか
そんな感じで使ってます。
おわりに。
ある程度パラメータ化しつつ、 最終的にはこういうのを貯めたやつをまとめつつ、WEB画面つくって、ぽちっとすると登録される
みたいなものが作れると良いかなぁなんて。
こういうのは自分のワークフローに従ってよく発生するものを
個別になんとなく、楽できるようにつくって、それを集めて持っておく
というのが正解なんだろうか。