用Ansible来控制电风扇
※注意:以下内容可能含有岔。
让孩子在暑假期间,通过完成作业的同时,也学习Python和Ansible模块。让他们通过Ansible来操作风扇吧。
所需之物
・树莓派
http://akizukidenshi.com/catalog/g/gM-10414/
・红外线LED
http://akizukidenshi.com/catalog/g/gI-11845/
・红外线接收模块
http://akizukidenshi.com/catalog/g/gI-04659/
・跳线线、电阻
・面包板连接套件(有助于电路搭建)
http://akizukidenshi.com/catalog/g/gK-08892/
请注意,目前秋月电子公司正在放暑假,这些将会被准备好。
安装Ansible。
将Raspbian烧录到SD卡并启动。
设置固定IP后,使用以下Playbook在树莓派上安装Ansible。
---
- hosts: raspi
connection: ssh
become: true
gather_facts: False
tasks:
- name: replace repo
replace:
path: /etc/apt/sources.list
regexp: 'http://raspbian.raspberrypi.org/raspbian/'
replace: 'http://ftp.jaist.ac.jp/raspbian/'
- name: install need pack
apt:
name: "{{ packages }}"
state: present
update_cache: yes
vars:
packages:
- python3-dev
- python3-crypto
- libffi-dev
- libssl-dev
- name: get-pip.py
command: wget https://bootstrap.pypa.io/get-pip.py
- name: pip install
command: python3 get-pip.py
- name: pip install ansible
command: python3 -m pip install ansible
安装Ansible花费了一些时间,但是已经成功安装好了。
root:~/ans # ansible-playbook -i hosts install_ansible_raspi.yml
PLAY [raspi] ***************************************************************************
TASK [replace repo] ********************************************************************
changed: [192.168.0.21]
TASK [install need pack] ***************************************************************
changed: [192.168.0.21]
TASK [get-pip.py] **********************************************************************
[WARNING]: Consider using the get_url or uri module rather than running wget. If you
need to use command because get_url or uri is insufficient you can add warn=False to
this command task or set command_warnings=False in ansible.cfg to get rid of this
message.
changed: [192.168.0.21]
TASK [pip install] *********************************************************************
changed: [192.168.0.21]
TASK [pip install ansible] *************************************************************
changed: [192.168.0.21]
PLAY RECAP *****************************************************************************
192.168.0.21 : ok=5 changed=5 unreachable=0 failed=0
root:~/ans #
2.6.2 已经安装成功。
pi@raspberrypi:~ $ ansible --version
ansible 2.6.2
config file = None
configured module search path = ['/home/pi/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.5/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.5.3 (default, Jan 19 2017, 14:11:04) [GCC 6.3.0 20170124]
pi@raspberrypi:~ $
循环路径
在这种方式下,我们将光敏模块和红外线LED进行如下的布线。
设置红外线遥控器
根据此页面参考,使用遥控器接收器读取风扇遥控器的信号,并进行命令设置。
在以下的Playbook中,我们将安装lirc并设置/boot/config.txt。
---
- hosts: raspi
connection: ssh
become: true
gather_facts: False
tasks:
- name: install lirc
apt:
name: lirc
state: present
update_cache: yes
- name: add line config.txt
lineinfile:
path: /boot/config.txt
line: "dtoverlay=lirc-rpi:gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up"
已经设置完毕。
root:~/ans # ansible-playbook -i hosts install_lirc.yml
PLAY [raspi] ***************************************************************************
TASK [install lirc] ********************************************************************
changed: [192.168.0.21]
TASK [add line config.txt] *************************************************************
changed: [192.168.0.21]
PLAY RECAP *****************************************************************************
192.168.0.21 : ok=2 changed=2 unreachable=0 failed=0
root:~/ans #
我将重新启动一次。
pi@raspberrypi:~ $ sudo reboot
再启动后,确认/dev/lirc0的存在以及使用lsmod命令加载了lirc。
pi@raspberrypi:~ $ ls -l /dev/lirc*
crw-rw---- 1 root video 243, 0 Aug 12 14:45 /dev/lirc0
pi@raspberrypi:~ $ lsmod | grep lirc
lirc_rpi 16384 0
lirc_dev 16384 1 lirc_rpi
pi@raspberrypi:~ $
按下遥控器并将其对准光电模块进行读取。
pi@raspberrypi:~ $ irrecord -n -d /dev/lirc0 rimokon.conf
将已创建的文件复制到文件夹中。
pi@raspberrypi:~ $ sudo cp senpuuki.lircd.conf /etc/lirc/lircd.conf.d/
编辑设定文件。
pi@raspberrypi:~ $ sudo vi /etc/lirc/lirc_options.conf
11 driver = default
12 device = /dev/lirc0
我将启动服务并进行确认。
pi@raspberrypi:~ $ sudo systemctl restart lircd
pi@raspberrypi:~ $ irsend LIST "" ""
devinput
devinput
senpuuki
pi@raspberrypi:~ $ irsend LIST "senpuuki" ""
0000000000000001 off
0000000000000002 on
0000000000000003 up
pi@raspberrypi:~ $
我会通过命令来确认它是否有效。
pi@raspberrypi:~ $ irsend SEND_ONCE senpuuki on
pi@raspberrypi:~ $ irsend SEND_ONCE senpuuki up
pi@raspberrypi:~ $ irsend SEND_ONCE senpuuki off
创建senpuuki模块
如果确认了通过命令运行的功能后,我会尝试将其变成一个模块。
根据查看各个模块的源代码,如果遵守以下规范,应该会很好。
・首先调用未来函数
・写一个叫做ANSIBLE_METADATA的东西,虽然不知道是什么
・从Playbook接收参数
・如果成功,调用exit_json,如果失败,调用fail_json
抱歉,我还没有阅读你提到的文件,哈哈。
最后变成了这样的感觉。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible.module_utils.basic import AnsibleModule
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['stableinterface'],
'supported_by': 'community'}
def main():
module = AnsibleModule(
argument_spec=dict(
power_state=dict(type='str', required=True)
)
)
power = module.params['power_state']
if power == "on":
cmd = "irsend SEND_ONCE senpuuki on"
elif power == "up":
cmd = "irsend SEND_ONCE senpuuki up"
elif power == "on-up":
cmd = "irsend SEND_ONCE senpuuki on && irsend SEND_ONCE senpuuki up"
else:
cmd = "irsend SEND_ONCE senpuuki off"
(rc, out, err) = module.run_command(cmd)
if rc == 0:
module.exit_json(msg="OK", changed=True)
if __name__ == '__main__':
main()
只是运行命令的 run_command。
哦…好像没有处理错误…我会在31日之前写好。
因为改变了风扇的状态,所以返回了 changed=True。
将创建的文件放置在/usr/local/lib/python3.5/dist-packages/ansible/modules目录下。
Playbook可以像这样。
---
- hosts: localhost
connection: local
gather_facts: False
tasks:
- name: 扇風機つけるお
raspberrypi_senpuuki:
power_state: on
register: result
- debug:
var: result
我会试一试。
pi@raspberrypi:~/an $ ansible-playbook -i hosts senpuuki.yml
PLAY [localhost] ***********************************************************************
TASK [扇風機つけるお] *************************************************************************
changed: [localhost]
TASK [debug] ***************************************************************************
ok: [localhost] => {
"result": {
"changed": true,
"failed": false,
"msg": "OK"
}
}
PLAY RECAP *****************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
pi@raspberrypi:~/an $
我的房间里的风扇打开了。(虽然可能不太清楚,但请传达给你)
使用树莓派来运行Ansible,我十分了解这并不是其原本的用途,
但是我将尝试将其作为成人的自由研究项目,结合电子工程、Python和Ansible玩耍。
结束了。