针对podman REST API 的shell调用-1

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

兜兜转转,我们又回来继续看podman api,前2天我们大概复习了一下shell,我们决定使用shell来封装一下podman api接口,我们这次封装三个接口 info_ping/_images/json

为什么需要podman api

因为podman把轮子给造好了,方便运维/开发人员调用接口,总之把接口提供出来,避免我们造轮子,对此我们可以直接使用api调用podman即可。

我们为什么需要api呢? 假设我们在做一个自动化部署,期间要启动一个容器,如果没有api,我们应该如何做呢? 我们会直接去调用podman命令对吧,然后再根据输出,来判断成功与否,这样很笨重,且迁移起来麻烦(比如机器执行命令路径不一致),所以需要api,那我们来看下具体用法

开启podman api服务

podman可以套接字监听unixtcp

使用命令: 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

扫描二维码关注公众号,回复: 13788165 查看本文章

和上述类似,注意,我们将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

猜你喜欢

转载自juejin.im/post/7086028608732397598