例: テストエージェント
新しいテストエージェントの作成とデプロイ
Paragon Active Assuranceで測定を実行するには、まずParagon Active Assuranceアカウントに1つ以上のテストエージェントを作成する必要があります。このセクションでは、REST API を使用して仮想テストエージェントを作成する方法について説明します。
以下に詳述する次の手順に進みます。
- 当初、アカウント「デモ」のインベントリにはテストエージェントがありません。
- 「vta1」と呼ばれるテストエージェントは、REST APIを介して作成されます。この段階では、実際のテストエージェントはまだ存在しません(つまり、まだ起動されていません)。
- テストエージェントがOpenStackにデプロイされます。(ここでは、そのプラットフォームへの展開を1つの可能性として選択しています。
- テストエージェントがコントロールセンターアカウントの「デモ」に接続し、使用できるようになりました。
ステップ1: 最初は、アカウント「demo」にテストエージェントはありません。コントロールセンターのウェブGUIから、以下のスクリーンショットを参照してください。
ステップ2: テストエージェントは、テストエージェントに対する REST API POST 操作を使用して、コントロールセンターで作成されます。
以下のPythonでこれを行います。Python コードを記述するには、REST API でテスト エージェントのすべての構成オプションを調べると便利です。
- に進みます
https://<Control Center host IP>/rest
。 - [test_agent] で、 の
/accounts/{account}/test_agents/
POST 操作を展開します。
- [説明] で [モデル] をクリックします。
以下では、eth0 が DHCP アドレスを持つ 3 つの物理インターフェイス "eth0"、"eth1"、および "eth2" を持つテストエージェントを作成します。NTP サーバーは eth0 に設定され、eth0 は管理インターフェイス (つまり、コントロールセンターに接続するインターフェイス) でもあります。
(以降の例では、以下のコードと異なる場合を除き、 import
コマンドを省略しています。 parser
コマンドは常に同じであるため、コマンドも省略されています。REST API トークンとその取得方法については、「 認証トークンの取得」セクションを参照してください。
import argparse import json import requests parser = argparse.ArgumentParser(description='Example for') parser.add_argument('--ncc-url', help='The URL where NCC is found, for example https://<hostname>/rest', required=True) parser.add_argument('--token', help='The REST API token', required=True) parser.add_argument('--account', help='The Netrounds account', required=True) args = parser.parse_args() # Request settings url = '%s/accounts/%s/test_agents/' % (args.ncc_url, args.account) # JSON content json_data = json.dumps({ 'description': 'Test agent description', 'interface_config': { 'eth0': { 'address': { 'type': 'dhcp_ip4', }, 'address6': { 'type': 'dhcp_ip6', }, 'description': 'eth0', 'mtu': 1500, 'speed': 'AUTO', 'type': 'physical' }, 'eth1': { 'address': { 'type': 'none_ip4' }, 'address6': { 'type': 'none_ip6' }, 'description': 'eth1', 'mtu': 1500, 'speed': 'AUTO', 'type': 'physical' }, 'eth2': { 'address': { 'type': 'none_ip4' }, 'address6': { 'type': 'none_ip6' }, 'description': 'eth2', 'mtu': 1500, 'speed': 'AUTO', 'type': 'physical' } }, 'license': 'UNLIMITED', 'management_interface': 'eth0', 'name': 'Test Agent 2', 'ntp_config': { 'interface_name': 'eth0', 'server': 'time.google.com', 'enable_ipv6': False }, 'type': 'appliance' }) # Create Test Agent response = requests.post(url=url, data=json_data, headers={ 'API-Token': args.token, 'Accept': 'application/json; indent=4', 'Content-Type': 'application/json', }) print 'Status code: %s' % response.status_code print json.dumps(response.json(), indent=4)
署名されたSSL証明書が存在しない場合は、「requests」コマンドに追加 verify=False
する必要があります:以下を参照してください。ただし、これは運用環境では強くお勧めしません。暗号化された安全な接続を確保するために、適切な署名付きSSL証明書を取得する必要があります。インストールガイドの サービス設定の章のSSL証明書の設定に関するセクションも参照してください。
# Create Test Agent response = requests.post(url=URL, data=json_data, headers={ 'API-Token': TOKEN, 'Accept': 'application/json; indent=4', 'Content-Type': 'application/json' }, verify=False )
別のプログラミング言語を使用したほうがよいことを示すために、curlで同じことを実現する方法を次に示します。
curl -X POST "https://<Control Center host and port>/accounts/demo/test_agents/" -H "accept: application/json" -H "content-type: application/json" -d "{ \"description\": \"Created via REST API\", \"interface_config\": { \"eth0\": { \"address\": { \"type\": \"dhcp_ip4\" }, \"address6\": { \"type\": \"dhcp_ip6\" }, \"description\": \"eth0\", \"mtu\": \"1500\", \"speed\": \"AUTO\", \"type\": \"physical\" }, \"eth1\": { \"address\": { \"type\": \"none_ip4\" }, \"address6\": { \"type\": \"none_ip6\" }, \"description\": \"eth1\", \"mtu\": \"1500\", \"speed\": \"AUTO\", \"type\": \"physical\" } }, \"license\": \"UNLIMITED\", \"management_interface\": \"eth0\", \"name\": \"vta1\", \"ntp_config\": { \"interface_name\": \"eth0\", \"server\": \"time.google.com\" }, \"type\": \"appliance\" }"
署名されたSSL証明書がない場合は、ここにフラグを追加する --insecure
必要があります。
作成されたテストエージェントは、構成データベースとコントロールセンターに存在します。以下のテストエージェントインベントリのスクリーンショットで、テストエージェント「vta1」が表示されています。
ステップ3: ここで、テストエージェント「vta1」を導入します。
このガイドでは、OpenStackに仮想テストエージェントを導入します。ただし、他の仮想化環境での展開も同様に可能です。
OpenStackでは、テストエージェントはクラウド初期化のユーザーデータを使用して、コントロールセンターへの接続方法に関する情報を取得します。具体的には、ユーザー データ テキスト ファイルの内容は次のとおりです。
行と #cloud-config
行が存在し、残りの行 netrounds_test_agent
はインデントされている必要があります。
#cloud-config netrounds_test_agent: name: MyvTA # Name of vTA to appear in Control Center inventory email: john.doe@example.com # Email you use when logging in to the system password: secret # Login password account: theaccount # Account name server: <login-server>:<port> # Control Center host and port (default == SaaS) # Note: With an IPv6 server address the whole string # including port must be in double quotes
詳細については、 https://www.juniper.net/documentation/product/en_US/paragon-active-assurance から入手できるドキュメント「OpenStackに仮想テストエージェントをデプロイする方法」を参照してください。
テストエージェントがデプロイされ、コントロールセンターに接続されると、構成がコントロールセンターからテストエージェントにプッシュされます。
ステップ4: これで、テストエージェントがコントロールセンターでオンラインになり、設定が完了しました。これで、テストエージェントをテストおよび監視で使用できる状態になります。これらのセクションを参照してください。
- テストの作成と実行
- モニターの作成とモニターの開始と停止
Paragon Active Assuranceアカウント内のテストエージェントのリスト表示
以下は、Paragon Active Assuranceアカウントにテストエージェントを一覧表示するためのPythonコードの例です。
# Request settings # NOTE: User is able to pass additional parameters as a query string ?limit=100&offset=111: # limit: Changes number of elements returned from API # offset: Changes element from which results will be returned url = '%s/accounts/%s/test_agents/%s' % (args.ncc_url, args.account, args.query_params) # Get list of Test Agents response = requests.get(url=url, headers={'API-Token': args.token})
このコードを実行すると、次のような出力が得られます。
{ "count": 2, "exclude_default": [ "interface_config", "ntp_config", "management_interface", "interface_names", "interface_states", "uptime", "memory", "cpu", "load_avg" ], "items": [ { "description": "Created via REST API", "gps_lat": 22.222222, "gps_long": -33.333333, "id": 1, "interface_names": [ "eth0", "eth1" ], "is_owner": true, "license": "SW_LARG", "name": "Test Agent A", "online": true, "type": "appliance", "use_public_address": false, "version": "3.3.0" } { ... "name": "Test Agent B", ... (same items listed for this Test Agent) } ], "limit": 10, "next": null, "offset": 0, "previous": null }
テストエージェントの構成データとステータスの取得
個々のテストエージェントに GET 操作を適用することで、テストエージェントとそのインターフェイスの構成情報とステータス情報の両方を取得します。状態情報には、オンライン状態、稼働時間、CPU 負荷、およびメモリ使用量が含まれます。
# Request settings url = '%s/accounts/%s/test_agents/%s/' % (args.ncc_url, args.account, args.test_agent_id) # Get Test Agent response = requests.get(url=url, headers={'API-Token': args.token})
出力は次のようになります。
{ "cpu": 0.8, "description": "", "gps_lat": 22.222222, "gps_long": -33.333333, "hidden": false, "id": 5, "interface_config": { "eth0": { "address": { "type": "dhcp_ip4", "vendor": null }, "address6": { "type": "none_ip6" }, "description": "", "mac": null, "management": true, "mtu": 8900, "speed": "AUTO", "tags": [], "type": "physical" }, "eth1": { "address": { "dhcpd": null, "dns": [], "ip": "10.1.1.66/24", "routes": {}, "type": "static_ip4" }, "address6": { "dns": null, "ip": "2001:0DB8::1/64", "routes": {}, "type": "static_ip6" }, "description": "", "mac": null, "management": false, "mtu": 1500, "speed": "AUTO", "tags": [], "type": "physical" } }, "interface_states": { "eth0": { "ip4_address": "192.168.100.4/24", "ip6_address": [], "mac_hw": "08:00:27:30:be:03" }, "eth1": { "ip4_address": "10.1.1.66/24", "ip6_address": [ "2001:0DB8::1/64" ], "mac_hw": "08:00:27:80:57:51" } }, "is_owner": true, "license": "SW_MEDI", "load_avg": [ 0, 0.01, 0.05 ], "management_interface": "eth0", "memory": 22.18, "name": "VTA1", "ntp_config": { "interface_name": "eth0", "server": "time.google.com" }, "online": true, "tags": [], "type": "appliance", "uptime": 47319, "use_public_address": false, "version": "2.23.0" }
テストエージェントの構成の変更
テストエージェントの構成を変更するには、PUTコマンドを使用します。
PUTでは、新しいテストエージェント の作成とデプロイのセクションで説明したようにテストエージェントを作成する場合と同様に、JSONデータで設定全体を指定する必要があります。したがって、これを行うためのコードは、URLが特定の既存のテストエージェントを指す点を除いて、テストエージェントの作成の場合と同じです
# Request settings url = '%s/accounts/%s/test_agents/%s/' % (args.ncc_url, args.account, args.test_agent_id)
と PUT コマンド
# Update Test Agent response = requests.put(url=url, data=json_data, headers={ 'API-Token': args.token, 'Accept': 'application/json; indent=4', 'Content-Type': 'application/json', })
は POST の代わりに使用されます。
テストエージェントソフトウェアのアップデート
REST APIは、すべてのテストエージェントまたは指定されたサブセットのテストエージェントソフトウェアを最新バージョンに更新するためのPOST操作を提供します。
以下は、テストエージェントのサブセットにソフトウェアアップデートを適用する方法の例です。
# Request settings url = '%s/accounts/%s/test_agents/update/' % (args.ncc_url, args.account) # JSON content: Subset of Test Agents on which to update software # POST http://server/accounts/acount_name/test_agents/update json_data = json.dumps({ 'test_agent_ids': args.test_agent_ids.split(',') }) # Update Test Agent version response = requests.post(url=url, data=json_data, headers={ 'API-Token': args.token, 'Accept': 'application/json; indent=4', 'Content-Type': 'application/json', })
すべてのテストエージェントでソフトウェアをアップデートする場合は、空のまま json_data
にしてスイッチをURLに追加します ?all
。
# Request settings url = '%s/accounts/%s/test_agents/update/?all' % (args.ncc_url, args.account)
テストエージェント: 高度な例
テストエージェント(またはREST API内の他のエンティティ)のすべての設定オプションを利用するには、REST API Swaggerスキーマに精通している必要があります。
前述のように、JSON 形式のスキーマへのリンクがページの上部に表示されます。これはかなり読みにくいです。コンテンツを解析しやすくするために、ファイルを次のページにコピーできます。
これにより、スキーマがより人間が読めるYAMLに変換されます。
以下の例では、スキーマの一部がアルファベット順に並べ替えられるのではなく、読みやすくするために再配置されていることに注意してください。
例えば、静的IPv4アドレスでテストエージェントを設定するとします。
これを行うには、HTTP POST
リクエストの を解釈body
します。
最終的な目標は、次の要求を作成することです。
{ "name": "Test Agent 1", "description": "This is my Test Agent", "interface_config": { "eth0": { "type": "physical", "address": { "type": "static_ip4", "ip": "192.168.0.123/24" } } } }
問題は、これがフォーマットする方法であることをどうやって知るのかということです。
正しい構文を見つけるには、テストエージェントスキーマを参照する必要があります。実際、その拡張バージョンを確認する必要があります。 TestAgentExtendedSchema
Swagger スキーマで以下を検索します。
TestAgentExtendedSchema: properties: ...name: type: stringmaxLength: 100minLength: 1...description: type: stringmaxLength: 100 ...
まず、このスキーマには および description
as 属性がありますname
。したがって、HTTP 要求body
は次のように開始する必要があります。
{ "name": "Test Agent 1", "description": "This is my Test Agent" }
properties
の一部は として定義されるread-only
。これらはサーバーによって無視されるため、要求から除外できます。
次に、インターフェイス構成、より具体的にはIPアドレスについて説明しますが、これにはもう少し作業が必要です。
アドレスはプロパティ interface_config
で指定され、以下に示すようにへの InterfaceConfigSchema
参照が含まれています。
TestAgentExtendedSchema: type: objectproperties: ...interface_config: type: objectadditionalProperties: $ref: '#/definitions/InterfaceConfigSchema'
リクエストに追加することから始めることができます。
{ "name": "Test Agent 1", "description": "This is my Test Agent", "interface_config": {} }
interface_config
これにより空の が追加されるため、interface_config
JSONオブジェクトの構築方法を理解するには、InterfaceConfigSchema
スキーマの部分に移動する必要があります。
InterfaceConfigSchema: type: objectrequired: - typediscriminator: typeproperties: description: type: stringtype: type: stringenum: - physical - vlan - bridge - bridged - mobile - wifi
スキーマには、必須の名前 type
のプロパティがあります。これは、定義するインターフェイスのタイプを指定するために使用されます。これには type
有効な選択肢のリストがあり、スキーマ enum
では .
discriminator
スキーマの部分は、使用する必要がある特定の型を指すために使用されます。
オブジェクト指向プログラミング(OOP)に精通している人にとって、これへのアナロジーは「継承」、またはポリモーフィズムです。
には InterfaceConfigSchema
、で enum
定義されているサブタイプのリストがあります。
この場合、「通常の」ネットワークインターフェイスが必要なので、として指定physical
type
する必要があります。
これで、型のスキーマ physical
を検索できます。
physical: description: A representation of Physical Interface allOf: - $ref: '#/definitions/InterfaceConfigSchema' - properties: type: objectaddress: $ref: '#/definitions/InterfaceIPv4AddressSchema'address6: $ref: '#/definitions/InterfaceIPv6AddressSchema'...
ここで、属性は、インターフェイスタイプがからのすべてのプロパティInterfaceConfigSchema
とproperties
、allOf
リストされたインラインを持つことを示すphysical
ために使用されます。
つまり、OOP用語ではfromInterfaceConfigSchema
を「継承」properties
します。
だから私たちは構築を続けることができます HTTPPOST
リクエスト body
。静的IPv4アドレスが必要なので、IPv6用ではなく指定しますaddress
address6
。
{ "name": "Test Agent 1", "description": "This is my Test Agent", "interface_config": { "eth0": { "type": "physical", "address": {} } } }
したがって、同じプロセスを使用して、次のように検索します InterfaceIPv4AddressSchema
。
InterfaceIPv4AddressSchema: type: objectrequired: - typediscriminator: typeproperties: type: type: stringenum: - none_ip4 - static_ip4 - dhcp_ip4
ここでも、type
使用する特定のスキーマを識別するために使用される を指定します。私たちは、でenum
見つかったようにしたいstatic_ip4
:
{ "name": "Test Agent 1", "description": "This is my Test Agent", "interface_config": { "eth0": { "type": "physical", "address": { "type": "static_ip4" } } } }
次に、次のスキーマ static_ip4
を検索します。
static_ip4: description: IPv4 static addressallOf: - $ref: '#/definitions/InterfaceIPv4AddressSchema' - properties: type: object...ip: type: string...
ここでは、 ip
プロパティを指定する必要があることがわかります。一般に、Netrounds では、IP アドレスは CIDR 表記を使用して入力されます。
ここでの他の properties
すべてはオプションです。
これで、JSONを完成させることができます。
{ "name": "Test Agent 1", "description": "This is my Test Agent", "interface_config": { "eth0": { "type": "physical", "address": { "type": "static_ip4", "ip": "192.168.0.123/24" } } } }
テストエージェントの削除
テストが完了したら、ユースケースによってはテストエージェントを削除することが関連する場合があります。
以下は、REST APIを介してこれを行うためのコードです。
# Request settings url = '%s/accounts/%s/test_agents/%s/' % (args.ncc-url, args.account, args.test-agent-id) # Delete Test Agent response = requests.delete(url=url, headers={'API-Token': args.token})