らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

Cisco ACI で acitoolkit を使って物理インターフェイスをシャットダウンする

acitoolkit を使って物理インターフェイスをシャットダウンする手順をメモしておきます。

前提として acitoolkit をインストールしておきます。

pip install acitoolkit

acitoolkit から参照される認証情報用のファイルである credentials.py を作成しておきます。

cat << EOF > credentials.py
URL="https://10.0.0.1"
LOGIN="admin"
PASSWORD="password"
EOF

以下のようなスクリプトを用意します。 acitoolkitcli には物理インターフェイスをシャットダウンするインターフェイスが存在するのですが、現状の acitoolkit 本体には「物理インターフェイスをシャットダウンする」為の API が存在しないようですので、直接 URL を指定して JSON を Post してしまいます。

import json
import acitoolkit.acitoolkit as aci

def main():
    """
    Shutdown the interface
    :return: None
    """
    # Get all the arguments
    description = 'Shutdown the interface.'
    creds = aci.Credentials('apic', description)
    creds.add_argument('-o', '--pod')
    creds.add_argument('-n', '--node')
    creds.add_argument('-i', '--interface')
    args = creds.get()

    # Login to the APIC
    session = aci.Session(args.url, args.login, args.password)
    resp = session.login()
    if not resp.ok:
        print('%% Could not login to APIC')

    # Create the JSON Dictionary
    json_dict = json.loads('{"fabricRsOosPath":{"attributes":{"tDn":"topology/pod-' + args.pod + '/paths-' + args.node + '/pathep-[eth' + args.interface + ']","lc":"blacklist"},"children":[]}}')

    # Push the JSON to the APIC
    resp = session.push_to_apic("/api/node/mo/uni/fabric/outofsvc.json", json_dict)
    if not resp.ok:
        print('%% Error: Could not push configuration to APIC')
        print(resp.text)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        pass

シャットダウンしたいインターフェイスを指定します。 該当インターフェイスを特定する為に Pod 番号、Node ID、インターフェイス番号を指定します。

python sample.py --pod 1 --node 1000 --interface 1/1