LoginSignup
11
4

More than 3 years have passed since last update.

AnsibleでおうちIoT

Last updated at Posted at 2019-12-07

はじめに

この記事はAnsible Advent Calendar 2019おうちハック Advent Calendar 2019の8日目です。

概要

こんな感じの構成を作ります。
Untitled Diagram.jpg

今回はAWS IoTをSubscribeするためにRaspberry Pi Zero、赤外線リモコンとしてbroadlink RM mini3を使いましたが、目的が果たせれば何でもよいです。

AWS IoT設定

AWS IoTのコンソールからモノの登録をします。
スクリーンショット 2019-12-07 20.14.44.png

「単一のAWS IoT モノの登録」を選び、名前だけ入力し作成を進めます。
スクリーンショット 2019-12-07 20.15.07.png

「1-Click 証明書作成」を選ぶと以下のように証明書が作成されるので、全てダウンロードし「有効化」をクリックします。
ルートCA証明書はコレをダウンロードしておきます。
スクリーンショット 2019-12-07 20.31.48.png

ポリシーを作りますが…
スクリーンショット 2019-12-07 20.40.02.png

アクションを「aws:*」、リソースARNを「*」と雑に作ってしまいます。
本格的に使う場合はそれなりに考えましょう。
スクリーンショット 2019-12-07 20.40.40.png

ポリシーを作ったら、先ほどモノを登録した時に作られた証明書にアタッチします。
スクリーンショット 2019-12-07 20.41.00.png

左のメニューから「設定」を開き、エンドポイントのURLを控えておきます。

サブスクライバの準備

AWSのGithubで公開されているサンプルのPythonスクリプトを利用します。
pipでパッケージをインストールし、

$ pip3 install AWSIoTPythonSDK

以下のようにスクリプトを起動しておきます。

$ python3 basicPubSub.py -e <エンドポイントのURL> -r <ルートCA証明書のパス> -c <モノの証明書ファイルのパス> -k <プライベートキーファイルのパス> -t myTopic -m subscribe

AWSコンソールのテストのページからmyTopicに発行を行い、標準出力にメッセージが出力されることを確認しておきます。

スクリプト変更

問題なくサブスクライブができていたら、メッセージを受けたらコマンドを実行するようスクリプトを改変します。
customCallback関数を以下のように変更。

basicPubSub.py
def customCallback(client, userdata, message):
    payload = json.loads(message.payload)
    print(payload["deviceName"])
    print(payload["name"])
    print(payload["value"])    
    if payload["deviceName"] == "RoomLight" and payload["name"] == "powerState":
        if payload["value"] == "ON":
            subprocess.call(<照明をつけるコマンド>)
        elif payload["value"] == "OFF":
            subprocess.call(<照明を消すコマンド>)
        else:
            print("Unknow Value:" + payload["value"])

編集後、再度スクリプトを起動しておきます。

Playbook作成(この記事唯一のAnsible要素)

AWS IoTにPublishするために、Ansibleのmqttモジュールを利用します。
paho-mqttが必要になるのでインストールしておきます。

pip install paho-mqtt

Playbookは以下のような感じで書きます。

mqtt.py
---
- hosts: localhost
  become: no
  tasks:
  - name: Light On
    mqtt:
      topic: 'myTopic'
      payload: '{"deviceName": "RoomLight", "name": "powerState", "value": "ON"}'
      qos: 0
      server: <エンドポイントURL>
      port: 8883
      ca_cert: <ルートCA証明書ファイルのパス>
      client_cert: <モノの証明書ファイルのパス>
      client_key: <プライベートキーファイルのパス>

実行すると…

$ ansible-playbook mqtt.yml 

VID_20191208_005218a.gif
できました。

おわりに

Ansibleアドベントカレンダー登録したものの、ネタが思いつかず…。
AnsibleでMQTT扱いたい人の参考になれば幸いです。

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4