Cisco ACI を CLI から curl を使って制御する
Cisco ACI には主に以下のような状態確認/設定変更の手段があります。
- Web GUI
- (Web GUI に付属する) API Inspector
- Visore
- Cobra SDK
- APIC REST to Python Adapter
- ACI Toolkit
- APIC 上の CLI
今回は外部 Linux の CLI 上から curl を使って「ACI へのログイン / テナントの作成 / 削除」を実施してみます。
検証環境
Cisco ACI はバージョン 1.2(1i) を使いました。ログイン情報は以下の通りです。
アドレス |
ユーザ名 |
パスワード |
10.0.0.1 |
admin |
Password12345 |
ACI へログインする
何を実行するにしても、まず最初に「ACI へログインする」必要があります。
ワンライナーで実行する
ログインは以下のように実行します。
| curl -k \
-X POST https://10.0.0.1/api/aaaLogin.json \
--data '{"aaaUser":{"attributes":{"name":"admin","pwd":"Password12345"}}}' \
-c cookie.txt
|
以下は実際の実行例です。レスポンスは python -m json.tool にリダイレクトして JSON を整形していますが、そのせいもあってかなり長くなっています。
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 | $ curl -k \
> -X POST https://10.0.0.1/api/aaaLogin.json \
> --data '{"aaaUser":{"attributes":{"name":"admin","pwd":"Password12345"}}}' \
> -c cookie.txt \
> | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1303 100 1241 100 62 20248 1011 --:--:-- --:--:-- --:--:-- 20683
{
"imdata": [
{
"aaaLogin": {
"attributes": {
"buildTime": "Mon Dec 07 21:15:40 PST 2015",
"creationTime": "1460123806",
"firstLoginTime": "1460123806",
"firstName": "",
"guiIdleTimeoutSeconds": "9000",
"lastName": "",
"maximumLifetimeSeconds": "86400",
"node": "topology/pod-1/node-1",
"refreshTimeoutSeconds": "9600",
"remoteUser": "false",
"restTimeoutSeconds": "90",
"sessionId": "HFhzW5F/RamTP5aRZ3Hoiw==",
"siteFingerprint": "XXXXXO4BdxhHok9R",
"token": "XXXXXb5+rZecfEUImR1nFqlrecWx8ftSQwF09zy359goH6s9n5Zvg8NKg+37OukS64ayeyTR6pnJRLWc5N7/sfiZwwYRFLthBq0f9qUHRURY2oMlTD93h871M1ZygvjXCDYOJNHZrSYLhV2Wjlog2ndCzDGFzDutKfUS5xryzrA=",
"unixUserId": "15374",
"userName": "admin",
"version": "1.2(1i)"
},
"children": [
{
"aaaUserDomain": {
"attributes": {
"name": "all",
"rolesR": "admin",
"rolesW": "admin"
},
"children": [
{
"aaaReadRoles": {
"attributes": {}
}
},
{
"aaaWriteRoles": {
"attributes": {},
"children": [
{
"role": {
"attributes": {
"name": "admin"
}
}
}
]
}
}
]
}
},
{
"DnDomainMapEntry": {
"attributes": {
"dn": "uni/tn-common",
"readPrivileges": "admin",
"writePrivileges": "admin"
}
}
},
{
"DnDomainMapEntry": {
"attributes": {
"dn": "uni/tn-infra",
"readPrivileges": "admin",
"writePrivileges": "admin"
}
}
},
{
"DnDomainMapEntry": {
"attributes": {
"dn": "uni/tn-mgmt",
"readPrivileges": "admin",
"writePrivileges": "admin"
}
}
}
]
}
}
],
"totalCount": "1"
}
|
別ファイルに保存したログイン情報を利用する
毎回、コマンドラインにログイン情報(ユーザ名とパスワード)を記載するのを省略するには、予めログイン情報を記載した以下のようなファイルを用意しておきます。ファイル名は何でも良いですが、今回は login.json にしました。
| {
"aaaUser":{
"attributes":{
"name":"admin",
"pwd":"password12345"
}
}
}
|
これを ACI に POST します。だいぶシンプルになりました。
| curl -k \
-X POST https://10.0.0.1/api/aaaLogin.json \
--data '@login.json' \
-c cookie.txt
|
テナントを作成する
空っぽのテナントを作成してみます。
ワンライナーで実行する 〜 URI にテナント名を埋め込む 〜
ワンライナーでテナントを作成してみます。テナント名は URI に埋め込んでいます。
| curl -k \
-b cookie.txt \
-X POST https://10.0.0.1/api/mo/uni/tn-TENANT-1.json \
--data '{"fvTenant":{"attributes":{}}}'
|
ワンライナーで実行する 〜 データ部分にテナント名を埋め込む 〜
先程同様、ワンライナーでテナントを作成してみます。テナント名は (URI では無く) データ部分に埋め込んでいます。
| curl -k \
-b cookie.txt \
-X POST https://10.0.0.1/api/mo/uni.json \
--data '{"fvTenant":{"attributes":{"name":"TENANT-2"}}}'
|
別ファイルに保存したテナント情報を利用する
次は予め、ファイルに用意しておいた情報を使ってテナントを作成してみます。以下の内容でファイルを作成しておきます。ファイル名は ADD_TENANT-3.json にしました。
| {
"fvTenant": {
"attributes": {
"name": "TENANT-3"
}
}
}
|
これを POST します。
| curl -k \
-b cookie.txt \
-X POST https://10.0.0.1/api/mo/uni.json \
--data '@ADD_TENANT-3.json'
|
テナントを削除する
テナントを削除してみます。
ワンライナーで実行する 〜 URI にテナント名を埋め込む 〜
ワンライナーでテナントを削除してみます。テナント名は URI に埋め込んでいます。
| curl -k \
-b cookie.txt \
-X DELETE https://10.0.0.1/api/mo/uni/tn-TENANT-1.json
|
ワンライナーで実行する 〜 データ部分にテナント名を埋め込む 〜
先程同様、ワンライナーでテナントを削除してみます。テナント名は (URI では無く) データ部分に埋め込んでいます。
| curl -k \
-b cookie.txt \
-X POST https://10.0.0.1/api/mo/uni.json \
--data '{"fvTenant":{"attributes":{"name":"TENANT-1","status":"deleted"}}}'
|
別ファイルに保存したテナント情報を利用する
最後に予め、ファイルに用意しておいた情報を使ってテナントを削除してみます。以下の内容でファイルを作成しておきます。ファイル名は DELETE_TENANT-1.json にしました。
| {
"fvTenant" : {
"attributes" : {
"name" : "TENANT-1",
"status" : "deleted"
}
}
}
|
これを POST します。
| curl -k \
-b cookie.txt \
-X POST https://10.0.0.1/api/mo/uni.json \
--data '@DELETE_TENANT-1.json'
|
参考