兜兜转转,我们又回来继续看podman api
,前2天我们大概复习了一下shell
,我们决定使用shell
来封装一下podman api
接口,我们这次封装三个接口 info
、_ping
、/_images/json
为什么需要podman api
因为podman
把轮子给造好了,方便运维/开发人员调用接口,总之把接口提供出来,避免我们造轮子,对此我们可以直接使用api
调用podman
即可。
我们为什么需要api
呢? 假设我们在做一个自动化部署,期间要启动一个容器,如果没有api
,我们应该如何做呢? 我们会直接去调用podman
命令对吧,然后再根据输出,来判断成功与否,这样很笨重,且迁移起来麻烦(比如机器执行命令路径不一致),所以需要api
,那我们来看下具体用法
开启podman api服务
podman
可以套接字监听unix
和tcp
使用命令: podman system service
开启podman api
参数
- --time: 会话超时时间,单位为秒,默认为5秒
- --log-level: 设置
Log
等级,这个是podman
的语法,而非api
的 - --cors: 设置CORS Headers(主要是跨域使用)
开启unix套接字
命令: podman --log-level=debug system service -t0 unix:///tmp/podman.sock
该命令含义为,开启debug
在中断显示,且unix
套接字文件在 /tmp/podman.sock
开启TCP套接字
命令: podman --log-level=debug system service -t0 tcp:127.0.0.1:8888
和上述类似,注意,我们将unix
给更换为了tcp
如上,我们启动了podman api
unix
套接字 和 tcp
套接字
请求方法
假设我们使用curl
请求获取版本信息
TCP方式请求版本信息
格式: /版本/libpod/info
其中版本信息只要是v
开头
命令: curl -s http://127.0.0.1:8881/v3.0.0/libpod/info | jq '.version'
jq
是linux格式化json
工具
unix套接字方式请求版本信息
格式: d/版本/libpod/info
其中版本信息只要是v
开头 ,只不过需要指定unix
套接字文件
命令: curl -s --unix-socket /tmp/podman.sock http://d/v3.0.0/libpod/info | jq '.version'
podman 常规请求
请求方法
/info
: 获取podman api
信息/_ping
: 检测podman api
状态/_images/json
: 获取podman images
信息
检测podman状态
使用路由_ping
可以检测podman状态,
例如
返回OK
则代表podman
正常的
获取podman api信息
使用理由/info
可以获取podman api
信息
例如
使用jq
格式化为json
例如使用命令: curl -s http://127.0.0.1:8881/v3.0.0/info | jq
获取images信息
使用理由images/json
可以获取podman images
信息
例如
使用命令: curl -s http://127.0.0.1:8881/v3.0.0/images/json | jq
使用shell封装podman api
脚本运行之后效果
我们通过bash shell
的方式,封装了podman api
之后运行的效果
我们再来查看下podman images
看看是否和上面对得上
脚本列表
我们将脚本按照模块给分开了,以方便解释脚本含义
main.sh
脚本有有个函数为main
是该程序的入口podmanEvn.sh
该脚本的一些配置变量checkHealth.sh
检查podman api
是否存活showVersion.sh
显示出podman
版本信息images.sh
镜像操作,目前仅编写了列出镜像
配置变量
我们来看podmanEvn.sh
的内容
全部定义为只读变量,报错了podman
的版本信息(这个不重要),是使用tcp
还是socket
去连接podman api
,以及podman api
提供的路由信息
检查podman api是否存活
该函数如下,若请求结果为空,或者字符串不为"OK" ,则返回2(异常),否则返回0(正常)
显示podman版本信息
这个直接使用curl
请求即可
显示image信息
查询images
信息,我们先计算podman api
返回了多少条记录,然后再循环取各个部分的信息,包括名称,id,创建时间,和大小
主函数
因为要使用别的文件的函数,所以需要引入,我们一般执行shell
的方式有这么几种:
sh xxx.sh
./ xxx.sh
. xxx.sh
source xxx.sh
其实,如上执行方案,可以归纳为2种,1. sh xxx.sh
2. source xxx.sh
那么有什么区别呢? 我们为什么要使用source
,而非sh
因为,sh
去执行的时候,是开启了一个子shell
,当子子shell
执行完毕后,数据不会引入到父shell
中,而source
就是在父shell
中执行的,这就是为什么我们修改了环境变量,例如: ~/.bashrc
的时候,会使用 .
或者source
去重新执行了
感悟
虽然shell
编写脚本本身不难,其核心也就那么几行代码,但是我们为了脚本的健壮性,不那么容易崩,我们需要写大量的辅助语句,来判断这个语句是否执行成功等等。失败了之后如何操作等。我们后面再来补充其他api
。