DRONE HUBの構成管理をAnsibleで運用している話


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で自動化しています。

他にも、連携するシステムとして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のロールに割り当てるイメージで管理している