Cisco機器の設定変更をBotで通知させた時のメモ

# はじめに

[前回](https://qiita.com/tech_kitara/items/fa6458b89bf374b46df2)と同じくEEMとOn-Box Pythonを組み合わせ、設定変更をAPI経由でWebex Teams Botへ通知させてみました。

手順は以下を参考にし、変更部分をメモとして残しています。
[POC: Catalyst 9000 Sandbox integration with Spark.](https://community.cisco.com/t5/devnet-sandbox-documents/poc-catalyst-9000-sandbox-integration-with-spark/ta-p/3648713)

# 1) 用意した環境
AWS MarketplaceのCSR1000Vを使用しました。
[Cisco Cloud Services Router (CSR) 1000V - AX Pkg. Max Performance](https://aws.amazon.com/marketplace/pp/B00OCG4OAA?qid=1557630398304&sr=0-2&ref_=srh_res_product_title)

30日間はFree Trial期間のため、CSRのソフトウェア費用はかかりません。
ただしEC2利用料はかかります。
バージニアリージョンのEC2(t2.medium)の場合、0.046ドル/時間でした。
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310082/ab33a74a-3407-b2f5-1908-46f912ce5f33.png)
EC2起動後、セキュリティグループでSSHを許可し、SSHログインします。


# 2) Webex Teams Botの作成
[Cisco Webex for Developers](https://developer.webex.com/)にログインし、[Start Building Apps] > [Create a New App] > [Create a Bot] にてBotを作成します。
詳しい手順は[2)](https://community.cisco.com/t5/devnet-sandbox-documents/poc-catalyst-9000-sandbox-integration-with-spark/ta-p/3648713)の通りです。


#3) ゲストシェルのセットアップ
詳しい手順は[3)](https://community.cisco.com/t5/devnet-sandbox-documents/poc-catalyst-9000-sandbox-integration-with-spark/ta-p/3648713)の通りです。
ただしAWSの場合、DNSサーバの設定変更は不要です。


# 4) Pythonスクリプトの作成とBotのテスト
基本的に[4)](https://community.cisco.com/t5/devnet-sandbox-documents/poc-catalyst-9000-sandbox-integration-with-spark/ta-p/3648713)と同じですが、対象ホスト名と変更内容をBotに表示させるコードを追加しています。
具体的には、`get_hostname`メソッドでホスト名を取得し、[diffios](https://github.com/robphoenix/diffios)モジュールでStartup ConfigとRunning Configの差分を抽出しています。
別途`ignore.txt`を作成し、無視して構わない差分を定義しています。

```python:myscript.py
from ciscosparkapi import CiscoSparkAPI
from cli import cli
import diffios


def get_hostname():
    sh_run_host = cli('show run | include hostname')
    host_strip = sh_run_host.strip()
    hostname = host_strip.lstrip('hostname ')
    return hostname


if __name__=='__main__':
    # Get hostname of device
    hostname = get_hostname()

    # Get diffs of startup-config and running-config
    with open('sh_start.log', 'w') as f1:
        sh_start = cli('show startup-config')
        f1.write(sh_start)

    with open('sh_run.log', 'w') as f2:
        sh_run = cli('show running-config')
        f2.write(sh_run)

    baseline = 'sh_start.log'
    comparison = 'sh_run.log'
    ignore = 'ignore.txt'

    diff = diffios.Compare(baseline, comparison, ignore)
    print diff.delta()

    # Use ArgParse to retrieve command line parameters.
    from argparse import ArgumentParser

    parser = ArgumentParser("Spark Check In")

    # Retrieve the Spark Token and Destination Email
    parser.add_argument(
        "-t", "--token", help="Spark Authentication Token", required=True
    )

    # Retrieve the Spark Token and Destination Email
    parser.add_argument(
        "-e", "--email", help="Email to Send to", required=True
    )
    args = parser.parse_args()
    token = args.token
    email = args.email
    message = "**Alert:** Config Changed  \n**Hostname:** " + hostname + "  \n```\n" + diff.delta() + "\n```"
    api = CiscoSparkAPI(access_token=token)
    api.messages.create(toPersonEmail=email, markdown=message)
```


```text:ignore.txt
^Using
Building configuration
Current configuration
crypto pki certificate
^end$
```

# 5) NW機器側のEEM設定
[5)](https://community.cisco.com/t5/devnet-sandbox-documents/poc-catalyst-9000-sandbox-integration-with-spark/ta-p/3648713)と同じです。アクセストークンとメールアドレスは用意したものに書き換えます。

変更箇所をBotで表示させるために、一旦設定保存した後、以下の設定変更を行いました。

```
conf t
ip domain lookup
ip access-list extended Test
 permit ip host 10.10.10.1 host 10.10.10.2
```

[Webex Teams](https://teams.webex.com/)にログインし、Botからの通知を確認します。
対象のホスト名、変更箇所が表示されました！
![無題21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310082/251e3b71-4c7d-5a43-5750-ae9ca0c277c7.png)