Skip to content

Cisco ACI を CLI から curl を使って制御する

Cisco ACI には主に以下のような状態確認/設定変更の手段があります。

  1. Web GUI
  2. (Web GUI に付属する) API Inspector
  3. Visore
  4. Cobra SDK
  5. APIC REST to Python Adapter
  6. ACI Toolkit
  7. APIC 上の CLI

今回は外部 Linux の CLI 上から curl を使って「ACI へのログイン / テナントの作成 / 削除」を実施してみます。

検証環境

Cisco ACI はバージョン 1.2(1i) を使いました。ログイン情報は以下の通りです。

アドレス ユーザ名 パスワード
10.0.0.1 admin Password12345

ACI へログインする

何を実行するにしても、まず最初に「ACI へログインする」必要があります。

ワンライナーで実行する

ログインは以下のように実行します。

1
2
3
4
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 にしました。

1
2
3
4
5
6
7
8
{
  "aaaUser":{
    "attributes":{
      "name":"admin",
      "pwd":"password12345"
    }
  }
}

これを ACI に POST します。だいぶシンプルになりました。

1
2
3
4
curl -k \
     -X POST https://10.0.0.1/api/aaaLogin.json \
     --data '@login.json' \
     -c cookie.txt

テナントを作成する

空っぽのテナントを作成してみます。

ワンライナーで実行する 〜 URI にテナント名を埋め込む 〜

ワンライナーでテナントを作成してみます。テナント名は URI に埋め込んでいます。

1
2
3
4
curl -k \
     -b cookie.txt \
     -X POST https://10.0.0.1/api/mo/uni/tn-TENANT-1.json \
     --data '{"fvTenant":{"attributes":{}}}'

ワンライナーで実行する 〜 データ部分にテナント名を埋め込む 〜

先程同様、ワンライナーでテナントを作成してみます。テナント名は (URI では無く) データ部分に埋め込んでいます。

1
2
3
4
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 にしました。

1
2
3
4
5
6
7
{
    "fvTenant": {
        "attributes": {
            "name": "TENANT-3"
        }
    }
}

これを POST します。

1
2
3
4
curl -k \
     -b cookie.txt \
     -X POST https://10.0.0.1/api/mo/uni.json \
     --data '@ADD_TENANT-3.json'

テナントを削除する

テナントを削除してみます。

ワンライナーで実行する 〜 URI にテナント名を埋め込む 〜

ワンライナーでテナントを削除してみます。テナント名は URI に埋め込んでいます。

1
2
3
curl -k \
     -b cookie.txt \
     -X DELETE https://10.0.0.1/api/mo/uni/tn-TENANT-1.json

ワンライナーで実行する 〜 データ部分にテナント名を埋め込む 〜

先程同様、ワンライナーでテナントを削除してみます。テナント名は (URI では無く) データ部分に埋め込んでいます。

1
2
3
4
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 にしました。

1
2
3
4
5
6
7
8
{
  "fvTenant" : {
    "attributes" : {
      "name" : "TENANT-1",
      "status" : "deleted"
    }
  }
}

これを POST します。

1
2
3
4
curl -k \
     -b cookie.txt \
     -X POST https://10.0.0.1/api/mo/uni.json \
     --data '@DELETE_TENANT-1.json'

参考