この記事は SRA Advent Calendar 2016 参加記事です。
流行りということで、自動化に手を付け出しています。
幸い、今運用している機器が、Juniper, NetApp, A10 ADC とそれぞれ NETCONF, REST API で操作出来る機器が揃っています。これは自動化するっきゃない。
まずはJuniper
Junos であれば、以下のコンフィグを投入することで、PyEZ, Ansible で操作することが出来ます。```
set system services netconf ssh
### PyEZ
まずは PyEZ からの操作について。
vSRX と PyEZ の下準備についてはこちら
* [vSRX はじめ](http://qiita.com/sgmt/items/38de0a78d291eae4ed0a)
* [Juniper を Ansible, Python で操作する準備](http://qiita.com/sgmt/items/9b3ac5c24c0cc8931ddd)
PyEZ は情報取得など、ワンショットで実行するもので使おうかと考えています。
以下のコードはバージョンの取得です。以下の例は Device をタプルにして、複数ホストに使えるようにしてます。
```Python:getVersion.py
from jnpr.junos import Device
Devices = [ { "hostname" : 'vSRX01' , "user": 'sgmt' }, ]
for device in Devices:
dev = Device(host=device["hostname"], user=device["user"], port='22')
dev.open()
print "Hostname:{:<10} Version:{}".format( dev.facts["hostname"], dev.facts["version"] )
% python getVersion.py
Hostname:vSRX01 Version:12.1X47-D20.7
Ansible
次は Ansible
予め、ansible-galaxy で Juniper.junos をインストールしておく必要があります。
投入するコンフィグを set 形式で用意しておき、それを投入する playbook
- name: add user
junos_config:
src: config/users.set
src_format: set
backup: yes
provider: "{{ netconf }}"
tags: users
netconf:
host: "{{ inventory_hostname }}"
port: 22
username: sgmt
- hosts: vSRX
roles:
- Juniper.junos
- FireWall
connection: local
gather_facts: no
set system login user opr uid 2002
set system login user opr class operator
set system login user opr authentication ssh-rsa "ssh-rsa 公開鍵hogehoge opr@hoge"
ansible-playbook FireWall.yml -i hosts.dev -t users
PLAY [vSRX] ********************************************************************
TASK [FireWall : add user] *****************************************************
changed: [vSRX01]
PLAY RECAP *********************************************************************
vSRX01 : ok=1 changed=1 unreachable=0 failed=0
変更内容を確認してみます。期待通り追加されてます。
sgmt@vSRX01# show | compare rollback 1
[edit system login]
+ user opr {
+ uid 2002;
+ class operator;
+ authentication {
+ ssh-rsa "ssh-rsa 公開鍵hogehoge opr@hoge"; ## SECRET-DATA
+ }
+ }
[edit]
sgmt@vSRX01#
せっかくの SRX なので、ファイアウォール関連を Ansible で投入すると、、、
- name: define zones
junos_config:
src: config/zones.set
src_format: set
backup: yes
provider: "{{ netconf }}"
tags: zones
- name: define policies
junos_config:
src: config/policies.set
src_format: set
backup: yes
confirm: 3
provider: "{{ netconf }}"
tags: policies
zone の定義
set security zones security-zone untrust interfaces ge-0/0/0.0
set security zones security-zone trust interfaces ge-0/0/1.0 host-inbound-traffic system-services ping
set security zones security-zone DMZ interfaces ge-0/0/2.0
set security zones security-zone DMZ host-inbound-traffic system-services ping
set security zones security-zone DMZ host-inbound-traffic system-services ssh
ポリシーの定義
set security zones security-zone DMZ address-book address www range-address 10.0.1.30 to 10.0.1.39
set security policies from-zone untrust to-zone DMZ policy service match source-address any
set security policies from-zone untrust to-zone DMZ policy service match destination-address www
set security policies from-zone untrust to-zone DMZ policy service match application junos-http
set security policies from-zone untrust to-zone DMZ policy service match application junos-https
set security policies from-zone untrust to-zone DMZ policy service then permit
これだと、set形式のコマンドを書けないと行けませんが、
from, to のzone, match の source, destination address, application を json で出力する Web 画面を用意しておき、それを set 形式に変換するスクリプトを用意しておけば、自動化できそうです。 commit confirmed も task に commit 書いておけば大丈夫
NetApp
次は NetApp
NetApp は Oncommand Unified Manager で複数クラスターを監理できますが、OnCommand API Services サーバを立て、Oncommand Unified Manager に接続すると、REST API で操作できます。
aggregate や volume の使用量を取得して週次のレポートを作成したりしています。
A10 ADC
A10 は aXAPI が何もせずに使えます。こちらもまだ情報取得系のみで使っている状態です。
まとめ
API 等で操作出来る機器が増えていますので、今まで手作業だったオペレーションを自動化し、作業工数削減、作業品質向上につなげていきたいですね。