DRONE HUBの構成管理をAnsibleで運用している話
はじめに
SENSYN Robotics(センシンロボティクス)の中山です。
Webアプリやそのインフラ周りと、Web側とドローンの接続を行うデバイスドライバ的な部分を担当しています。
今回はDRONE HUB内部の構成管理をAnsibleで行う話です。
Ansible on DRONE HUB
Ansibleはサーバ管理で使うイメージが強いツールですが、開発環境の作成等でも使うことがあり、同様にLinuxやWindowsが載ったドローンでも利用できます。
DRONE HUBの内部ではUbuntu Linuxが動いており、データをクラウドと同期する機能や通信を秘匿化するSSH port forwarding等、様々なソフトウェアが走っています。このソフトウェア群のデプロイや設定変更を機体ごとに行うのはそれなりに手間なので、Ansibleを使って実行しています。
sshで機体に入って手で一機ずつ設定するのに比べると、
- 操作ミスや漏れによる設定の差異をなくせる
- デプロイする対象や方法をGitで管理できるので、レビュープロセスを通せる
- 機体ごとに設定する値(公開鍵やAPI Key)を集中管理できる
- Playbookを実行するだけなので、同時に複数機体へのデプロイができる
- 出荷時の手間を減らせる
といったメリットがあります。
具体的なデプロイ対象
機体へのデプロイでは、下記の機能をAnsibleで自動化しています。
- 撮影データをクラウドと同期する機能
- MQTTをSSH port forwarding経由で秘匿化する設定
- LTEモジュールの設定
他にも、連携するシステムとしてw離着陸時に警告するためにパトランプがあるのですが、そのソフトウェアのデプロイにも使っています。パトランプを回すかどうかの判定をRaspberryPiで実装しています。
実装
AnsibleはPythonで実装されており、Pythonといえば本体やライブラリのバージョン管理が複雑なことで有名です。Pythonの環境管理で煩わされたくなかったので、素直にDokcer HubのAnsibleイメージを使いました。
docker pull cytopia/ansible:2.8-tools
実行するときはMakefileを使っています。
Makefileの中身
deploy/lte:
cd lte \
&& docker run \
--rm \
-it \
-v $$(pwd):/opt/scripts \
-v $$(pwd)/../settings:/opt/settings \
-v $$(pwd)/../settings/ansible.cfg:/etc/ansible/ansible.cfg \
cytopia/ansible:2.8-tools \
sh -c "ansible-playbook \
-i /opt/settings/host.ini \
playbook.yml"
Makeの実行
make deploy/lte
Playbookはいくつかのロールに分けています。
Playbook
- hosts:
- vehicle
become: yes
vars_files:
- vars/common.yml
roles:
- device
- ppp
- boot
device
ロールでLTEモジュールをUSBモデムとして認識させ、ppp
ロールでUSBモデムを使ったPPP通信の設定を行います。これらの設定をブート時に有効にするのがboot
ロールで、systemdのUnitをデプロイするようになっています。
他の機能のデプロイでも、同じようにソフトウェアのレイヤーをロールに割り当てるイメージで管理しています。他にいい方法があったら、コメント欄でヒントを頂けると嬉しいです。
まとめ
- Ansibleはサーバ管理だけではなく、ドローン内部のソフトウェアを管理するのにも便利
- ソフトウェアのレイヤーをAnsibleのロールに割り当てるイメージで管理している