Cisco覚書_EEMからPythonスクリプトを実行

###何度shutdownしてもゾンビのように生き返る怖いスクリプト

IOS-XEでPythonスクリプトを動作する基本設定は[Cisco覚書_Pythonでconfig投入](https://qiita.com/38pinn/items/161e555e26c837064e4a)参照


####スクリプト配置パス
パス：/flash/
ファイル：eem_script.py 
guestshellに入ってファイル作成、またはファイルを転送

```
isp-sw#guestshell
[guestshell@guestshell ~]$ 
[guestshell@guestshell ~]$ cd /flash/
[guestshell@guestshell flash]$ vi eem_script.py 
```

####スクリプトの動作
Loopback55のIFを`no shut`して`sh ip int brief`でIF状態を表示する、という内容
今回はスクリプト実行のトリガーはEEMアプレットで指定する

```python:eem_script.py
import sys
from cli import cli,clip,configure,configurep, execute, executep
intf= sys.argv[1:]
intf = ''.join(intf[0])

print ('This script is going to unshut interface %s and then print show ip interface brief'%intf)

if intf == 'loopback55':
        configurep(["interface loopback55","no shutdown","end"])
else :
        cmd='int %s,no shut ,end' % intf
configurep(cmd.split(','))
executep('show ip interface brief')
```

####手動でスクリプトを起動する方法
EEMアプレットからだけではなく、EXECモードで手動でスクリプトを実行することもできる
※スクリプト中の`sh ip int brief`コマンドの実行はEXECモードからなのでEEMアプレットでは実行されない。

```
isp-sw#guestshell run python /flash/eem_script.py loop55
This script is going to unshut interface loop55 and then print show ip interface brief
Line 1 SUCCESS: int loop55
Line 2 SUCCESS: no shut 
Line 3 SUCCESS: end
Interface              IP-Address      OK? Method Status                Protocol
Vlan1                  unassigned      YES NVRAM  administratively down down    
---省略---
Loopback13             10.13.13.13     YES manual up                    up      
Loopback55             10.55.55.55     YES TFTP   up                    up      
```


####EEMアプレット作成
設定モードにて
admindownのsyslogをトリガーにadminUPするスクリプトを実行する内容

```
isp-sw(config)#event manager applet intshut
isp-sw(config-applet)# event syslog pattern "Interface Loopback55, changed state to administratively down"
isp-sw(config-applet)# action 0.0 cli command "en"
isp-sw(config-applet)# action 1.0 cli command "guestshell run python /flash/eem_script.py loop55"
isp-sw(config-applet)#end
```

####スクリプトのパスをconfig上で指定
設定モードにて
配置パスを指定

```
isp-sw(config)#event manager directory user policy "flash:/"
```

####EEM起動状態確認
EXECモードにて
正常に登録されていれば表示される

```
isp-sw#sh event manager policy registered 
No.  Class     Type    Event Type          Trap  Time Registered           Name
1    applet    user    syslog              Off   Thu Mar 28 16:37:52 2020  intshut
 pattern {Interface Loopback55, changed state to administratively down}
 maxrun 20.000
 action 0.0 cli command "en"
 action 1.0 cli command "guestshell run python /flash/eem_script.py loop55"
```


####手動shutdownしてみる
設定モードでshutdownコマンドを投入、ter monでログをターミナルに出力させて動作確認
ログからshurdown後に自動でUPしている。

```
isp-sw(config-if)#shutdown 
isp-sw(config-if)#
Mar 28 16:56:22.428 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback55, changed state to down
Mar 28 16:56:22.428 JST: %LINK-5-CHANGED: Interface Loopback55, changed state to administratively down
isp-sw(config-if)#
Mar 28 16:56:29.880 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback55, changed state to up
isp-sw(config-if)#
Mar 28 16:56:29.880 JST: %LINK-3-UPDOWN: Interface Loopback55, changed state to up
isp-sw(config-if)#
```




####イベントが発生した履歴を確認
EXECモードにて
successでEEMにより正常実行している

```
isp-sw#sh event manager history events 
No.  Job Id Proc Status   Time of Event            Event Type        Name
1    1      Actv success  Thu Mar28 16:36:19 2020  syslog            applet: intshut 
2    2      Actv success  Thu Mar28 16:43:43 2020  syslog            applet: intshut 
3    3      Actv success  Thu Mar28 16:56:22 2020  syslog            applet: intshut 
```



---
####確認機種とバージョン
機種:Catalyst3850
Ver:Cisco IOS XE　16.06.05　Everest

---
####参考リンク
[Programmability Configuration Guide, Cisco IOS XE Everest 16.6.x](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/166/b_166_programmability_cg/eem_python_module.html#id_46478)