SORACOM Napter と Ansible Dynamic Inventory で IoTデバイスの構成管理を行う

はじめに

IoTデバイスの管理も手に馴染んだツールを使いたいというお話をします。
これはSORACOM Advent Calendar 2019の7日目の記事となります。

「IoT デバイス管理 簡単 方法」 などと調べると「LwM2M」「FOTA」「月額料金 (1台当たり) 1万~20万デバイス : XX円」など難しい単語が並びます。

先人達は必要があって上記機能を編み出している訳ですが、これからIoTを始めようと思っている方々には、初めの1歩を挫くには十分な難易度です。

なので今日は手元のPCに入っているであろうAnsible から SORACOM Napter を使ってデバイスの構成管理をしてみたいと思います。

f:id:nananao_dev:20191205173358p:plain
soracom napter & ansible

作ったものはこちらに置いておきます。
github.com

SORACOM Napter とは

SORACOM Napter はSORACOMのSIMを利用しているデバイスに対して簡単にリモートアクセスできるサービスです。

従来IoTデバイスへのリモートアクセス手法と言えば

  1. IoTデバイスグローバルIPを付与する
  2. IoTデバイスVPN接続のためのエージェント等をインストールする
  3. IoTデバイスとサーバー間で閉域ネットワークを構築する

などがあると思います。
それぞれセキュリティに懸念があったり、運用負荷や費用が高いなど一長一短でした。

SORACOM Napter を使うことで

バイスグローバルIPを付与することなく、一時的にTCPフォワーディング

することができるようになります。

また、1回線分のNapterの料金が毎月無料です。(通信量はかかります)
これは試さない訳にはいきませんね。

Ansible Dynamic Inventory

Ansible Dynamic Inventory は Ansible で構成管理したい対象を動的に設定することができます。

動的な対象は所定のjsonフォーマットであればよく3rdパーティのモジュールの利用もできますが、任意の shell script などを食わせることもできます。

この機能を利用することで

  1. SORACOMのlistSubscribers APIを叩いて任意のtagがついていれば
  2. SORACOM Napterの createPortMapping APIを叩いてportを解放し
  3. 返却されたIP/PortをAnsible Dynamic Inventory に食わせる形式に変換し
  4. SSHし設定を叩き込む

みたいなことができるないかと思った次第です。

RaspberryPi で実践

RaspberryPi の初期設定やSORACOM Airの設定はこちらを参考にしてください。

必要なミドルウェアの準備

今回はmacOSで実行しているのでbrewでインストールしてします。

$ brew install ansible
$ brew install soracom-cli
$ brew install http://git.io/sshpass.rb 

鍵認証でRaspberryPiへログインするための準備

鍵認証でログインするための鍵を生成します。
PCで以下のコマンドで鍵を生成しRaspberryPiにscpします。

$ ssh-keygen -t rsa -b 2048 -f ~/.ssh/napter_raspberrypi
$ scp ~/.ssh/napter_raspberrypi.pub pi@raspberrypi.local:

RaspberryPi にログインし以下のコマンドで公開鍵を登録します。

$ mkdir ~/.ssh
$ cat napter_raspberrypi.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ rm napter_raspberrypi.pub

ssh_confを指定する方法もあるようです。

dev.classmethod.jp

Ansible Dynamic Inventoryの対象を判別するtagの準備

SORACOMのコンソールにログインしSIMにtagを付与します。

  • device :SORACOM Napterの対象を判別します。のちにshell scriptの変数に同じ文字列を設定します。
  • ansible_user :Ansible がRaspberryPi へログインするためのユーザー名を設定します。 下の画像だと pi がユーザー名となります。

f:id:nananao_dev:20191205175026p:plain

ansible-playbook で実行する

ansible-playbook で実行してみます。
鍵認証を利用するので dynamic_inventory_key.sh を利用します。

  • SORACOM_CLI_PROFILE :SORACOM CLIで利用しているprofile名を設定します。特に設定していなければdefalultを設定すれば良いはずです。
  • TARGET_TAG_KEY :Ansibleで制御したいSIMに付与したtagのkeyを設定します。コンソールのSIM一覧から設定している場合 name を設定すれば良いはずです。上の画像ではdeviceとしています。
  • TARGET_TAG_VALUE :Ansibleで制御したいSIMに付与したtagのvalue を設定します。上の画像ではgroup2としています。
# 鍵認証の場合
$ ansible-playbook -i ./dynamic_inventory_key.sh playbook.yaml --private-key=~/.ssh/napter_raspberrypi

ansible-playbookはデバイスpingをするだけです。なんかすいません。
以下の様にokが返ってくることが確認できるかと思います。

PLAY RECAP ******************************************************************************************************************
AA.AA.AA.AA               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

まとめ

SORACOM Napter と Ansible Dynamic Inventory で IoTデバイスの構成管理を行う方法をまとめました。
構成管理はしてませんね。なんかすいません。

TODO

  • Ansibleで設定完了後にNapterを閉じる