7.10 Ansible API 最全使用文档(中文)¶
大家都知道 Ansible 是一个轻量级的部署工具,这里的轻量体现在哪里呢?
master 与 节点间使用ssh通信,也不需要像salt那样需要在客户端装minion,然后在master和minion各起一个服务。
在以前 ansible 都是使用的命令行来执行playbook,但在数百个分布式集群部署,如果一台一台登陆进去使用命令行部署,效率极低。
因此,如果能使用 api 的方式进行playbook的调用,再对 api 做一层封装,会极大的提高效率。
无意中使用 pip search 进行搜索,还真的有 ansible-api
这是 2018 年10月份才开始的项目,目前来说成熟度还不够。
对于 ansible-api 有几点需要注意:
ansible-api 需要依赖 python3.7+ 和 最新的 openssl,对ansible环境发动较大。
ansible-api 成熟度还不够,在部署过程中,有遇到几个坑,需要修改源码解决。
ansible-api 返回结果为json串,会包含所有节点的所有playbook 的所有task 的信息,虽然全,但信息量可能过大。
7.10.1 基础环境准备¶
使用最新的 openssl ,这一点让我在部署时候花了很多的时间,踩了很多的坑。在这里进行总结整理。
先根据(https://www.jianshu.com/p/3ec24f563b81)将 openssl 也要升级到 1.1.1
# 安装依赖库
yum install -y zlib zlib-dev openssl-devel sqlite-devel bzip2-devel libffi libffi-devel gcc gcc-c++
# 安装最新版本的openssl
wget http://www.openssl.org/source/openssl-1.1.1.tar.gz
tar -zxvf openssl-1.1.1.tar.gz
cd openssl-1.1.1
./config --prefix=$HOME/openssl shared zlib
make && make install
# 设置环境变量LD_LIBRARY_PATH
echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/openssl/lib" >> $HOME/.bash_profile
source $HOME/.bash_profile
ansible-api 要求 python3.7,所以需要再安装 python3.7
mkdir /root/python37 && cd /root/Python-3.7.2 && wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz && tar -xvf Python-3.7.2.tgz
cd /root/Python-3.7.2 && mkdir /usr/local/python3
./configure --prefix=/usr/local/python3 --with-openssl=$HOME/openssl
make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
7.10.2 部署 ansible-api¶
手动配置一下 ansible-api 的配置
# ==============================================
# Config file for Ansible-Api
#
# A restful HTTP API for ansible
# I am not a part of ansible official code
# ==============================================
##
# Base configuration part
#
[default]
#listen host
host = 0.0.0.0
#listen port
port = 8765
#signature string for api call
sign_key = wangbm
#log path if using daemon mode
log_path = /var/log/ansible-api.log
#worker number (default: 1)
workers = 1
#response of a task will be timeout (sec, default: 3600 [1 hour], task will NOT break off after timeout)
timeout = 3600
#websocket subprotocols
ws_sub =
#ip white list (multiple separated by space, leave a blank for all allowed)
allow_ip =
##
# the path part for playbooks and scripts
#
[directory]
#your playbook path (file *.yml in this dir will be worked)
playbook = /root/deployment/
#your script path (file *.sh in this dir will be worked)
script =
ansible-api 会调用 ansible 库的命令,这个过程不能指定 ansible.cfg
的文件路径(其默认是从 /etc/ansible/ansible.cfg
读取)。所以需要将我们当前的配置文件(/root/deployment/ansible.cfg
)拷贝至/etc/ansible/ansible.cfg
然后由于原生的 ansible-api
的bug,需要修改代码,在如下函数位置(/usr/local/python3/lib/python3.7/site-packages/ansible_api/callback.py
)添加一个参数
通过执行命令,即可开启 ansible server
/usr/local/python3/bin/ansible-api -c /etc/ansible/api.cfg -d &
个人使用命令行启动的方式,不太优雅,可以写一个 service 文件,用服务的方式进行管理。
服务开启后,如何调用呢?
在 github 仓库里,有提供一个简易的文档(https://github.com/lfbear/ansible-api/wiki/http-api-usage)
你可以使用 postman 进行测试,也可以使用 curl 发送请求:
curl -X POST \
http://127.0.0.1:8765/playbook \
-H 'cache-control: no-cache' \
-d '{
"n": "wangbm", # playbook 的名字
"h": "all", # 要执行 playbook 的节点
"f": "backup_info.yml", # yml文件名字,不需要使用绝对路径
"s": "735f88138d00c7eda6271f96fe99fa45", # 数字签名
"c": 5
}'
里面的参数都好理解,就 s
这个参数,这里要注意一下。
还记得我在ansible-api.cfg 的配置里,有一个配置项是 sign_key=wangbm
那这里的 s
怎么计算呢?
可以使用如下这条shell命令
shell :echo -n 'wangbmlocalhostbackup_info.ymlwangbm'|md5sum |cut -d ' ' -f1
发送了请求后,返回的结果如下
rc 为0,表示所有节点都没有出现 fatal 致命错误(有设置 ignore_errors 的错误也会返回0).
rc 为非0,表示有 fatal 致命错误,说明有部分节点部署/升级失败。