Ansible Config 和 Playbook
Config
Ansible 的配置一般不需要更改,如果需要定制,自定义配置也很简单,在 Ansible 中,寻找配置按照如下顺序:
- ANSIBLE_CONFIG (一个环境变量)
- ansible.cfg (位于当前目录中)
- .ansible.cfg (位于家目录中)
- /etc/ansible/ansible.cfg
因此只需要按照文档自定义配置即可:http://ansible-tran.readthedocs.io/en/latest/docs/intro_configuration.html
Playbook
为了方便保存执行的操作,Ansible 使用了 Playbook 剧本。剧本使用 yml 格式,来避免成为了一种新语言或者脚本。
Playbook 是有 play 组成的,每个 play 包含了 host,user,tasks。
比如一个 playbook:
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
host 便是指定的 hosts 文件中的主机,可以通过 remote_user 指定在远程使用的用户,也可以用 sudo 为远程操作添加 root 权限。
Task
作为远程部署工具,task 是整个 playbook 的重点。每个 task 都会在指定的所有远程主机执行,如果有执行失败的主机,将会被跳过。
每个 task 目标在于执行一个幂等(moudle)的操作,因此即使是多次执行也会很安全。一个 task 类似于下面的格式:
tasks:
- name: make sure apache is running
service: name=httpd state=running
一个 task 包含了名称,model,以及参数。更多的 task 写法见: http://ansible-tran.readthedocs.io/en/latest/docs/playbooks_intro.html
Ansible 初体验
记得刚来上海的时候,叶神给了我一本奶牛书:《奔跑吧, Ansible》。时隔一年,我居然有了写 Ansible 脚本的需求。
安装
pip install ansible
配置主机
在安装完 ansible 之后,需要在 /etc 下创建一个 ansible 文件夹,并在里面添加一个 hosts 文件,因为 ansible 会默认在 /etc/ansible/hosts
中寻找主机的配置。
因为 macOS 下 etc 文件夹不能编辑或者因为其他原因,可以通过 -i 指定 hosts 的位置。
可以创建一个 hosts 文件:
[local]
10.8.0.164
[blog]
150.95.155.202 ansible_user=user ansible_port=2222
[]
内为 target, 可以通过 targets 来对主机进行分组管理。
每一行包含一个 ip 或者域名,host 好支持一些表达式。
在每个 ip 后面可以加一些特殊的参数,比如 SSH 用户名,SSH 端口,密钥等。
详细配置可见: http://docs.ansible.com/ansible/latest/intro_inventory.html
配置完 hosts 文件之后便可以进行 ping:
$ ansible -i hosts all -m ping
10.8.0.164 | SUCCESS => {
"changed": false,
"ping": "pong"
}
150.95.155.202 | SUCCESS => {
"changed": false,
"ping": "pong"
}
也可以对某一组的主机进行 ping:
$ ansible -i hosts blog -m ping
150.95.155.202 | SUCCESS => {
"changed": false,
"ping": "pong"
}
执行
当能够连接上主机之后,便能对某个或者某组主机执行命令了:
$ ansible -i hosts local -m service -a "name=docker state=restarted" --become --ask-sudo-pass
SUDO password:
10.8.0.164 | SUCCESS => {
"changed": true,
"name": "docker",
"state": "started"
}
其中 -m
是选择使用的模块, ansible 有大量的模块可以使用, 不同的模块负责管理不同的功能,对 ansible 的学习也就是对这些模块熟悉的过程。
--become
是作为某个用户来执行,如果添加整个参数,或默认尝试使用 root
, 如果需要密码的话,还需要输入密码相关的参数, 权限相关的参数见:
Privilege Escalation Options:
control how and which user you become as on target hosts
-s, --sudo run operations with sudo (nopasswd) (deprecated, use
become)
-U SUDO_USER, --sudo-user=SUDO_USER
desired sudo user (default=root) (deprecated, use
become)
-S, --su run operations with su (deprecated, use become)
-R SU_USER, --su-user=SU_USER
run operations with su as this user (default=root)
(deprecated, use become)
-b, --become run operations with become (does not imply password
prompting)
--become-method=BECOME_METHOD
privilege escalation method to use (default=sudo),
valid choices: [ sudo | su | pbrun | pfexec | doas |
dzdo | ksu | runas ]
--become-user=BECOME_USER
run operations as this user (default=root)
--ask-sudo-pass ask for sudo password (deprecated, use become)
--ask-su-pass ask for su password (deprecated, use become)
-K, --ask-become-pass
ask for privilege escalation password
使用 root 用户:
Hypo-MBP:~ hypo$ ansible -i hosts local -a "whoami"
10.8.0.164 | SUCCESS | rc=0 >>
hypo
Hypo-MBP:~ hypo$ ansible -i hosts local -a "whoami" --become --ask-su-pass
SUDO password:
10.8.0.164 | SUCCESS | rc=0 >>
root
Playbook
通过命令行总归不是优雅的姿势,还是需要能存储的固定的脚本,每次部署的时候运行这个脚本,在 ansible 里便是 playbook。
NEXT 见:Ansible Playbook
图灵机器人
偶然间发现居然有一家公司提供图灵机器人的 API(http://www.tuling123.com ),突然觉得可以做些好玩的东西,比如接入 DaoVoice。
在之前就在博客上接入 Voice,但是基本上没怎么用过,索性就拿自己的博客做个试验。
获得 API
在 图灵机器人 注册下,然后创建一个机器人拿到 APIkey:
然后可以使用官方提供的 API,进行简单的对话:
# POST /openapi/api
+ Request (application/json; charset=utf-8)
{
"key": "<APIKey>",
"info": "hello",
"userid": "<user_id>"
}
+ Response 200
+ Headers
Transfer-Encoding: chunked
+ Body
{"code":100000,"text":"hi"}
这里的 info
就是发送的对话,而 response 里的 text
就是回复。
需要注明的就是这里的 userid
,这是一个可以为空的字段,如果填写的话,可以对不同的用户的对话加些区分。
这个 api 可以做很多有趣的事情,不仅仅是简单的对话,还可以提供日常服务,比如问问天气讲个笑话之类的,用法的话可以见官方文档:http://www.tuling123.com/help/h_cent_webapi.jhtml?nav=doc
接入 DaoVoice
对于对话类的接入肯定是需要实时性,那么 Voice 提供的 Webhook 就可以满足需求,而 webhook 的详细内容可以看 Voice 的文档:http://docs.daovoice.io/api/#webhook
比如当收到用户回复的时候,主要关注 conversation_id
和 conversation_parts
里的第一个信息的 body
,前者因为这是调用 Voice 回复 api 时要用的信息,后者是因为 conversation_parts
包含了整个对话,而第一个便是最新的回复。
当拿到这两个信息之后,把 body
里的内容,发给图灵机器人获得回复之后再把回复通过 回复对话API 发送给用户就可以了。
Docker image
因为程序非常简单,就是两个 API 来回倒腾,就几行代码的事情,索性 build 出一个镜像:https://hub.daocloud.io/repos/147ff5fa-dbdd-4f79-a489-546d2fc63e9c
部署
需要几个环境,变量,缺一不可。
KEY | VALUE |
---|---|
VOICE_TOKEN | DaoVoice 的 access_token |
VOICE_API | https://api.daovoice.io |
VOICE_ADMIN_ID | DaoVoice 用来回复的用户 admin_id |
REBOT_API | http://openapi.tuling123.com/openapi |
REBOT_TOKEN | 图灵机器人的 APIKey |
docker run -d -p 80:4000 -e <上面的环境变量> daocloud.io/ihypo/robot
还有一个选填的环境变量:
KEY | VALUE |
---|---|
SAY_HELLO | 当用户创建回话的默认回复 |
使用
这个镜像开放两个 API
ping api,用来检查看有没有还活着:
# GET /_ping
hook api,直接把这个 api 添加到 DaoVoice 的 webhook 里就可以了:
# POST /hook
注意
只保证 tag:latest
能正常工作。
试玩
不用说太多,现在就点下右下角试玩下吧。
Copyright © 2020 Powered by MWeb, Theme used GitHub CSS.