はじめに
この記事はAnsible Advent Calendar 2019とおうちハック Advent Calendar 2019の8日目です。
概要
今回はAWS IoTをSubscribeするためにRaspberry Pi Zero、赤外線リモコンとしてbroadlink RM mini3を使いましたが、目的が果たせれば何でもよいです。
AWS IoT設定
「単一のAWS IoT モノの登録」を選び、名前だけ入力し作成を進めます。
「1-Click 証明書作成」を選ぶと以下のように証明書が作成されるので、全てダウンロードし「有効化」をクリックします。
ルートCA証明書はコレをダウンロードしておきます。
アクションを「aws:*」、リソースARNを「*」と雑に作ってしまいます。
本格的に使う場合はそれなりに考えましょう。
ポリシーを作ったら、先ほどモノを登録した時に作られた証明書にアタッチします。
左のメニューから「設定」を開き、エンドポイントのURLを控えておきます。
サブスクライバの準備
AWSのGithubで公開されているサンプルのPythonスクリプトを利用します。
pipでパッケージをインストールし、
$ pip3 install AWSIoTPythonSDK
以下のようにスクリプトを起動しておきます。
$ python3 basicPubSub.py -e <エンドポイントのURL> -r <ルートCA証明書のパス> -c <モノの証明書ファイルのパス> -k <プライベートキーファイルのパス> -t myTopic -m subscribe
AWSコンソールのテストのページからmyTopicに発行を行い、標準出力にメッセージが出力されることを確認しておきます。
スクリプト変更
問題なくサブスクライブができていたら、メッセージを受けたらコマンドを実行するようスクリプトを改変します。
customCallback関数を以下のように変更。
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は以下のような感じで書きます。
---
- 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
おわりに
Ansibleアドベントカレンダー登録したものの、ネタが思いつかず…。
AnsibleでMQTT扱いたい人の参考になれば幸いです。