Cisco ACI のイベントをリアルタイムで検知する Node.js サンプルスクリプト
Cisco ACI には「何かの状態変更をリアルタイムに検出する」ことが可能になる Subscription という仕組みがあります。 Node.js で Events を Subscription するサンプルをメモしておきます。 今回は Ubuntu19 でテストしました。
Node.js 環境の用意
最新の node & npm 環境を用意していきます。 まず、標準リポジトリから node と npm をインストールします。
| apt -y install nodejs npm
|
この時点で node と npm のバージョンは以下でした。
| # node --version
v10.15.2
# npm --version
5.8.0
|
続いて n をグローバルにインストールし、node と npm を Stable バージョンに更新します。
| npm install -g n
n stable
|
apt でインストールした古いバージョンの node と npm は不要ですので、アンインストールしておきます。
モジュールを探せるよう、NODE_PATH
を追加しておきます。
| echo 'export NODE_PATH=`npm root -g`' >> ~/.bashrc
|
パスの追加を反映する為、手っ取り早くログアウト&ログインし直しておきます。 これで node と npm のバージョンが更新されました。
| # node --version
v10.16.0
# npm --version
6.9.0
|
必要モジュールのインストール
サンプルコードが node-rest-client
と ws
に依存している為、これらのモジュールをインストールしておきます。
| npm install -g node-rest-client ws
|
サンプルコード
サンプルコードは以下の通りです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 | var Client = require('node-rest-client').Client;
var WebSocket = require('ws');
var apic = '10.0.0.1'
var username = 'admin'
var password = 'password'
var options = {
connection: {
rejectUnauthorized: false
}
};
var client = new Client(options);
var resp = function (data, response) {
var token = data.imdata[0].aaaLogin.attributes.token;
var ws = new WebSocket('https://' + apic + '/socket'.concat(token), {
rejectUnauthorized: false,
strictSSL: false
});
ws.on('open', function (data) {
console.log('WEBSOCKET-DATA: Socket Open');
client.get('https://' + apic + '/api/node/class/eventRecord.json?subscription=yes', {
headers: {
'Content-Type': 'application/json',
'Cookie': 'APIC-COOKIE=' + token
}
}, function (data, response) {
console.log(data.imdata[0]);
});
});
ws.on('message', function incoming(data) {
console.log(data);
});
var testData = client.get('https://' + apic + '/api/node/class/eventRecord.json?subscription=yes', {
headers: {
'Content-Type': 'application/json',
'Cookie': 'APIC-COOKIE=' + token
}
}, function (data, response) {
console.log(data.imdata[0]);
});
};
var args = {
data: {
aaaUser: {
attributes: {
name: username,
pwd: password
}
}
},
headers: {
"Content-Type": "application/json"
}
};
client.post('https://' + apic + '/api/aaaLogin.json', args, resp);
|
実行してみる
用意が出来たら実行してみます。