はじめに
こんにちは。テクノプロで組み込み開発エンジニアをしている神崎 一郎です。
SI(System Integration)のプラットフォームを開発しています。
今回は、Pythonによるリモート制御実装のポイントについて、書きたいと思います。
用語
Celeryについて
Distributed Task QueueのOSSである。参照:
Celery
Fabricについて
SSHのライブラリのOSSである。参照:
Fabric
Redis
超高速なメモリDBのOSSであり、CeleryのBrokerとして利用する。
リモート制御機能の要件
- 制御を行うPC(以下は「Master PC」と言う)
- 1.1 (サービス条件の前提)Redis動作可能
- 1.2 Pythonスクリプトによるリモート実行のタスクを作成する
- 1.3 タスクのログ採取、モニターリングは容易
- 1.4 Masterより完全な自動処理
- 制御されるPC(以下は「SI PCと言う」)
- 2.1 (サービス条件の前提)Celery Worker動作可能
- 2.2 Pythonスクリプトによる制御タスクを実行する
- 2.3 Pythonスクリプトの動的更新はある
- 2.4 (通信条件の前提)SSHログイン可能
- 時間的制約
- 3.1 処理を起動する遅延は1秒以下
実装について検討
OSSの選定
Fabric
左記の要件から考えると、SSHは、2.3のスクリプト更新(デプロイ)、Workerの起動にとどめると良いでしょう。
Fabricをライブラリとして利用すると良いでしょう。
Celery
Airflowを利用するのも考えられますが、用件3.1から考えると、無理があると思う。
それに、Airflowのコアとして利用されているCeleryを直接に利用する。
コンポーネント・モジュール割り当て
Master PC上のメイン処理:Package celmain
- 汎用的な処理(ソースコードは変わらない)
- Celeryタスクの作成、実行(要件1.2)
- SSHにてSI PCのスクリプト更新(デプロイ、要件2.3)
- SSHにてCelery Workerの(再)起動(要件1.4)
制御スクリプト(Master PCとSI PC両方):Package celctrl
- 制御処理のスクリプトからなる(制御タスクの定義であり、要件2.2)
- タスクとしてcelmainに作成、投入され、SI PC上ではCelery Workerに実行される
その他
- 1.3 モニターリング機能は、Celery Flowerはそのまま使える(要件1.3)
- SI PCのスクリプト更新(デプロイ、要件2.3)は、Git機能を利用すると良いでしょう(GitLab-CEとか)
課題
(Master PC)celmainのcelctrl moduleのimportエラー
予めcelctrl packageをインストールすることで解決出来る:
$ pip install -e .
(SI PC)celctrlデプロイ後のリロード
「celery worker」コマンドで起動されたCelery Workerは、リロードの機能がないため、下記のようにWorkerを起動します:
Celery Worker起動
$ celery multi start 1 -A proj -l info -c4 --pidfile=/var/run/celery/%n.pid
Celery Worker再起動(更新後のスクリプトをロードさせます)
$ celery multi restart 1 --pidfile=/var/run/celery/%n.pid
終わりに
いかがでしたか。Pythonによる1秒以下遅延のリモート制御を実装出来ます。自動化システムに、良く必要な機能なので、チャンスがあれば、ぜひ試して下さい。