初めまして。ネットワークテクノロジー課の武藤です。今年の4月にCTCに転職してきました。
現在は主にネットワーク自動化に関する開発業務を行っています。
この記事ではRobocorp社が提供するControl Roomについてご紹介します。
Robocorp社は2019年に設立されたスタートアップの企業です。
PythonとRobotFrameworkを使用したRPAソリューションを主軸としており、RobotFramework用のRPAライブラリやVisual Studio Code拡張機能の提供などを行っています。
今回ご紹介するControl RoomもRobocorp社が提供するソリューションの一つです。これは自動化ツールの実行管理をSaaSとして提供します。
Control RoomはRobotFrameworkの実行などを管理するオーケストレーションツールです。ブラウザからリモートマシン上での自動化ツール(RobotFramework, Python, etc...)の実行管理を可能にします。
また、そのときに出力される各種ログファイルなどもControl Roomにアップロード可能なため、実行履歴とその時のログを紐づけて一元管理することが可能です。
Control Roomの特徴として、ユーザが用意したマシン上で任意のツールを実行可能なところが挙げられます。
Control Roomで自動化ツールを実行する際には以下の2つの実行方法が選択できます。
後者のWorkforce Agentを使用すると、ユーザが用意したマシン上で自動化ツールを実行できます。
これによって、インターネットからのアクセスが難しいオンプレミスの機材へのアクセスも容易に実現可能なため、そのような機材(ネットワーク機器など)を対象とする自動化とは特に相性の良いソリューションとなっています。
本記事では、実際にControl RoomとWorkforce Agentを使用して、オンプレミス環境に存在するマシン上でRobotFrameworkを実行する一連の流れを試してみます。
今回はユーザのオンプレミス環境のLinux VMで実行することを想定して環境をセットアップします。
使用する環境は以下の通りです。
Control RoomからRobotFrameworkのシナリオを実行する方法を以下のステップで紹介します。
RobotFrameworkシナリオが実行されるマシンをControl Roomに登録します。これはWorkerと呼ばれます。
Workerにも複数種類が用意されていますが、今回は以下の公式ドキュメントに従って、Linuxサーバ上でデーモンとして動かす形でセットアップをします。
https://robocorp.com/docs/control-room/unattended/worker-setups/background-service
最初にホームディレクトリ配下に .robocorp ディレクトリを作成し、そこにエージェント用のバイナリをダウンロードして実行権限を付与します。
$ mkdir ~/.robocorp
$ curl https://downloads.robocorp.com/workforce-agent-core/releases/latest/linux64/robocorp-workforce-agent-core -o ~/.robocorp/robocorp-workforce-agent-core
chmod +x ~/.robocorp/robocorp-workforce-agent-core
以下のコマンドを実行してバージョンを確認します。2023年11月現在では7.1.16がダウンロードされました。
$ ~/.robocorp/robocorp-workforce-agent-core -v
7.1.16
次はこのWorkerをControl Roomに登録します。
まず登録用のトークンを取得します。Control Roomの Workers ページから +New Worker ボタンを押すことで以下の画面が表示されます。
ここの One-Time Link Token が該当のトークンになります。これを使用して以下のコマンドを実行します。
<link token> は取得したトークンに置き換えてください。
$ ~/.robocorp/robocorp-workforce-agent-core link <link token>
以下のように Link process complete. のログが表示されればControl RoomにWorkerが正常に登録されています。Control Roomの Workers ページに行くと、マシンがWorkerとして見えるようになっています。
[2023-11-15T09:54:13.551] [INFO] CommandHandler - Workforce Agent Core started v7.1.6
[2023-11-15T09:54:13.552] [INFO] CommandHandler - OS: [linux] - [5.15.0-88-generic] - [x64]
~~~ (省略) ~~~
[2023-11-15T09:54:14.765] [INFO] RuntimeLink - Link process complete.
[2023-11-15T09:54:14.765] [INFO] shutdown - Agent Core shutting down...
[2023-11-15T09:54:14.766] [INFO] shutdown - Shutting down logger...
これでWorkerとしてマシンを登録することができました。これをバックグランドで動かすためにsystemdに登録します。
以下の内容で /etc/systemd/system/RobocorpAgentCore.service を作成します。ユーザ名とrobocorpエージェントへのパスは適宜置き換えてください。
[Unit]
Description=Robocorp Agent
[Service]
User=robocorp
ExecStart=/home/robocorp/.robocorp/robocorp-workforce-agent-core start --service
Restart=always
PrivateDevices=true
ProtectControlGroups=true
ProtectKernelTunables=true
ProtectSystem=full
RestrictSUIDSGID=true
PrivateTmp=yes
[Install]
WantedBy=default.target
作成したらサービスを起動します。VM再起動後も自動で立ち上がるようにしておきます。
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now RobocorpAgentCore.service
起動状態を確認します。
$ systemctl status RobocorpAgentCore.service
● RobocorpAgentCore.service - Robocorp Agent
Loaded: loaded (/etc/systemd/system/RobocorpAgentCore.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-11-15 12:34:28 UTC; 4s ago
Main PID: 4475 (robocorp-agent-)
Tasks: 10 (limit: 629145)
Memory: 58.2M
CPU: 1.073s
CGroup: /system.slice/RobocorpAgentCore.service
└─4475 /home/robocorp/.robocorp/robocorp-workforce-agent-core start --service
Control Roomの Workers ページでWorkerの State が Idle になっていれば登録完了です。
登録したWorkerで実行するRobotFrameworkのシナリオと、それをControl Roomから実行するために必要な robot.yaml 、 conda.yaml を作成します。
今回は以下のRobotシナリオを作成します。内容としては、Junosが搭載されたNW機器にSSHログインし、 ge-0/0/0 に 192.0.2.1/24 という接続先が設定されていることを確認するRobotシナリオです。ファイル名は main.robot とします。
*** Settings ***
Library SSHLibrary
Library RPA.Robocorp.WorkItems
*** Test Cases ***
Check IP Address for ge-0/0/0
${username} = Get Work Item Variable username
${password} = Get Work Item Variable password
${host} = Get Work Item Variable host
Open Connection ${host}
Login username=${username} password=${password}
${show_interfaces} = Execute Command show interfaces ge-0/0/0
Close Connection
Should Contain ${show_interfaces} 192.0.2.1/24
robot.yaml はControl Roomから実行するタスクを定義するために使用します。各項目の詳細な説明は公式ドキュメントに記載されています。
今回は以下のような内容で作成します。
ポイントとしては、Robotシナリオの実行時にlog.htmlの出力ディレクトリを output に指定し、 artifactsDir に output を指定することで、生成されたlog.htmlなどがControl Roomにアップロードされるようになります。
tasks:
# タスクの定義(名前は任意)
Check Interfaces:
# 実行したいコマンド
shell: python -m robot --report NONE --outputdir output main.robot
# RobotFrameworkの環境を構築するためのconda設定ファイル
condaConfigFile: conda.yaml
# 生成物としてControl Roomにアップロードするディレクトリのパス
artifactsDir: output
conda.yaml にはWorkerがシナリオを実行する際に使用するPythonの仮想環境を定義します。
channels:
- conda-forge
dependencies:
- python=3.11.6
- pip=23.3.1
- pip:
- rpaframework
- robotframework-sshlibrary
これでControl RoomからRobotFrameworkのシナリオを実行する準備が一通り整いました。ではこれをControl Roomから実行できるようにします。
Control Roomでは実行するRobotシナリオ一式をTask Packageという単位で管理しています。前段で作成したシナリオ一式もControl Roomに一つのTask Packageとして登録します。登録する方法は何通りか用意されていますが、今回は作成したファイルをまとめてzipファイルとしてアップロードする方法を取ります。
まず、前段で作成したRobotシナリオファイル( main.robot )、 robot.yaml 、 conda.yaml をzipファイル( sample-robot.zip )にします。
zipファイルが用意できたらControl Roomの Tasks ページから + Add Task Package をクリックします。
以下の様な画面が表示されるので、今回は sample task という名前で登録してみます。作成したzipファイルを指定したら`Add`を押します。
これで今回作成したRobotシナリオがControl Roomに sample task というTask Packageとして登録されました。
登録したTask Packageを実行するためにはProcessというものを作成します。これは一つ以上のStepから構成されており、Stepは任意のTask Package内の一つのtaskを紐づけて使用します。
では実際に今回作成したRobotシナリオを実行するためのProcessを作成します。Control Roomの Unattended → Processes に移動し、右上にある + New Process のボタンをクリックします。
以下のような画面が表示されるので、今回は「Sample Process」として新たなProcessを作成します。
名前を入力したら Steps タブに移動し、各Stepを定義します。Stepでは、実行したいTaskとそれを実際に動かすWorkerを指定します。
一つのStepには一つのTaskが紐づきます。このTaskとは robot.yaml で tasks 配下に定義した一つ一つの要素を指します。
今回は robot.yaml に Check Interfaces というTaskとして定義していたのでそれを指定します。Workerには今回登録したWorkerを選択します。
上記の情報を入力したら Save Changes をクリックします。これでProcessの作成は完了です。
では作成したProcessを実行します。 Unattended → Processes のページに移動し、先ほど作成したProcessをクリックして詳細画面に移動します。
Processを実行するには右上の Run Process ボタンをクリックします。この時、 Run と Run with input data という2つの実行方法が選べます。前者はProcessをそのまま実行しますが、後者は実行時に任意のデータを与えることができます。
今回作成したRobotシナリオはユーザ名( username )、パスワード( password )、接続先( host )を、Process実行時に与える想定で書いています。そのため、今回は Run with input data を選択します。
以下のようにユーザ名、パスワード、接続先を入力して Run Process を押してシナリオを実行します。
実行するとProcessページの下に実行状況が表示されます。実行中は「In Progress」と表示されます。
Processが完了すると「Completed」という表示になります。これをクリックするとより詳細なProcessの情報が確認できます。
Processの詳細画面では、実行日時や経過時間、アップロードされた生成物が確認可能です。今回はRobotFrameworkのシナリオを実行しているため、log.htmlが出力されています。
この記事ではRobocorpが提供する自動化ソリューションのControl Roomを紹介しました。Control Roomを使用することで、自動化のワークフローと関連アセット、実行履歴の一元管理を実現できます。
今回はRobotFrameworkのシナリオを用いて紹介しましたが、基本的にはWorkerとして登録したマシンでは任意のコマンドを実行することが可能なので、さまざまな用途に適用可能なソリューションとなっています。
Control RoomにはFreeプランも提供されていますので、気になった方は試してみてはいかがでしょうか。
なお、今回は基本的な使い方をご紹介しましたが、これ以外にも、定期実行機能や、機微な情報を保存するための機能(Vault)など、自動化ツールの実行管理を補助するための機能が備わっています。
そのような情報も今後発信していけたらと思いますので、引き続きCITTECをよろしくお願いします。
公式ドキュメント: https://robocorp.com/docs/control-room