GNU/Linux >> Tutoriales Linux >  >> Linux

Explorando la API RESTful de Podman usando Python y Bash

Es posible que haya escuchado que Podman V2 tiene una nueva API RESTful. Este documento demuestra la API usando ejemplos de código en Python y comandos de shell. Se incluyen notas adicionales en los comentarios del código. El código provisto fue escrito para ser claro frente a la calidad de producción.

Requisitos

  • Tiene Python>3.4 instalado.
  • Ha instalado la biblioteca de solicitudes de Python.
    • notas de instalación
  • Se recomienda un IDE para editar Python.
  • Dos ventanas de terminal:una para ejecutar el servicio Podman y revisar la información de depuración, la segunda ventana para ejecutar scripts.
  • Se demuestra el uso de los comandos curl y jq.
  • Puede revisar las URL de conexión aquí.

Cómo empezar

El servicio

Para estos ejemplos, estamos ejecutando el servicio Podman como un usuario normal y en un número de puerto TCP/IP no seguro.

Para la producción, el servicio Podman debe usar el protocolo de activación de socket de systemd. Esto permite que Podman admita clientes sin demonios adicionales y asegure el punto final de acceso.

El siguiente comando ejecuta el servicio Podman en el puerto 8080 sin tiempo de espera. Deberá escribir ^C en esta ventana de terminal cuando haya terminado con el tutorial.

# podman system service tcp:localhost:8080 --log-level=debug --time=0

Además del socket TCP demostrado anteriormente, el servicio Podman admite la ejecución bajo el protocolo de activación de socket de systemd y sockets de dominio Unix (UDS).

[ También te puede interesar: Adelanto:nueva API REST de Podman]

Código Python

Recurso de información

A continuación nos muestra información sobre el servicio y host de Podman:

import json
import requests


response = requests.get("http://localhost:8080/v1.40.0/libpod/info")

Inmersión profunda

  • requests.get() llama a las solicitudes biblioteca para pasar la URL al servicio Podman usando el método GET HTTP.
    • Las solicitudes biblioteca proporciona métodos auxiliares para todos los métodos HTTP populares.
  • http://localhost:8080 coincide con la invocación del servicio Podman anterior.
  • /v1.40.0 denota la versión de API que estamos usando.
  • /libpod denota que esperamos que el servicio proporcione un libpod -carga útil de retorno específica.
    • Si no se usa este elemento, el servidor devolverá una carga útil compatible.
  • /info especifica el recurso que estamos consultando.

Interesante de leer, pero sin salida, ¿cómo sabemos que funcionó?

Obteniendo salida

Agregue las líneas a continuación y ahora podrá ver la versión de Podman que se ejecuta en el host:

response.raise_for_status()


info = json.loads(response.text)
print(info.version.Version)
  • raise_for_status() genera una excepción si el código de estado no está entre 200 y 399.
  • json.loads() decodifica el cuerpo de la respuesta HTTP en un objeto/diccionario.

Cuando se ejecuta, la salida es:

2.1.0-dev

Lo siguiente funciona desde el shell:

$ curl -s 'http://localhost:8080/v1.40.0/libpod/info' | jq .version.Version


"2.1.0-dev"

Listado de contenedores

import json
import requests


response = requests.get("http://localhost:8080/v1.40.0/libpod/containers/json?all=true")
response.raise_for_status()


ctnrs = json.loads(response.text)
for c in ctnrs:
    print(c.Id)

json.loads() decodifica el cuerpo HTTP en una matriz de objetos/diccionarios, el programa luego imprime cada Id. de contenedor. Por ejemplo:

$ curl -s 'http://localhost:8080/v1.40.0/libpod/containers/json?all=true' | jq .[].Id


"81af11ef7188a826cb5883330525e44afea3ae82634980d68e4e9eefc98d6f61"

Si el parámetro de consulta all=true no se hubiera proporcionado, entonces solo se habrían enumerado los contenedores en ejecución. Las consultas de recursos y los parámetros para la API se documentan aquí.

Algo útil

Hemos visto un par de ejemplos, pero ¿qué tal algo un poco más útil? Ha terminado de desarrollar el próximo gran contenedor y el siguiente script eliminará todo de su almacenamiento local. (Si desea ahorrar escribiendo clean_storage.py)

#!/usr/bin/env python
import json


import requests


# Clean up local storage by removing all containers, pods, and images.  Any error will
#   abort the process


confirm = input("Really delete all items from storage? [y/N] ")
if str(confirm).lower().strip() != 'y':
    exit(0)


# Query for all pods in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/pods/json")
response.raise_for_status()


pods = json.loads(response.text)
# Workaround for https://github.com/containers/podman/issues/7392
if pods is not None:
    for p in pods:
        # For each container: delete container and associated volumes
        response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/pods/{p['Id']}?force=true")
        response.raise_for_status()
    print(f"Removed {len(pods)} pods and associated objects")
else:
    print(f"Removed 0 pods and associated objects")


# Query for all containers in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/containers/json?all=true")
response.raise_for_status()


ctnrs = json.loads(response.text)
for c in ctnrs:
    # For each container: delete container and associated volumes
    print(c.keys())
    response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/containers/{c['Id']}?force=true&v=true")
    response.raise_for_status()
print(f"Removed {len(ctnrs)} containers and associated objects")


# Query for all images in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/images/json")
response.raise_for_status()


imgs = json.loads(response.text)
for i in imgs:
    # For each image: delete image and any associated containers
    response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/images/{i['Id']}?force=true")
    response.raise_for_status()
print(f"Removed {len(imgs)} images and associated objects")

[ ¿Empezando con los contenedores? Consulta este curso gratuito. Implementación de aplicaciones en contenedores:una descripción técnica general. ]

Resumen

Espero que encuentres esto útil. La documentación de la API le proporciona todos los recursos y métodos necesarios. Se incluyen los cuerpos de entrada y salida, así como los códigos de estado.

El código de Podman se encuentra en pleno desarrollo y agradecemos sus aportes con problemas y solicitudes de incorporación de cambios en la página de GitHub del proyecto.


Linux
  1. La historia de una API:GitLab Runner y Podman

  2. Cómo crear scripts Bash usando variables externas y scripts incrustados

  3. Uso de declaraciones de casos en Bash

  4. Cómo rastrear scripts de Python usando trace.py

  5. buscar y copiar archivos usando Bash

Ponga en funcionamiento podman en Windows usando Linux

Supervise las llamadas a la API y la actividad del usuario en AWS mediante CloudTrail

Bash romper y continuar

Comando de salida de Bash y códigos de salida

Cómo automatizar la instalación y la implementación de Podman con Ansible

Creando clases y objetos usando bash scripting