Openstack - выборочное удаление изображений на основе некоторых критериев?

Мы создаем изображения openstack каждый вечер с Packer. Мы хотим сохранить последние 5 созданных нами и автоматически удалить остальные. (В идеале удаляйте их, только если у них нет запущенного экземпляра, основанного на них, но без разбора это хорошо, если это невозможно).

Я просматривал документацию по различным API Openstack, и я не могу найти изящный способ сделать это.

Я думал о том, чтобы запустить nova image-list и проанализировать его с помощью bash, но это кажется немного привередливым и потенциально опасным способом сделать что-то, когда мы говорим об автоудалении.

Сценарий bash будет выглядеть примерно так:

перекрестная ссылка это:

nova image-list | grep "CentOS-7-x86_64 " | cut -d'|' -f 2

с этим:

nova list | grep "ACTIVE" | cut -d'|' -f 2 | while read -r line ; do nova show "$line" ; done

Но это уже тупо громоздко и даже пока ничего не делает...

У меня вопрос, есть ли лучший способ сделать это, что я пропустил?

Благодарю.

1 ответ

Решение

Я бы решил это, используя Python API, а не пытался решить это с помощью инструментов CLI. Вот некоторый код, который даст вам необходимые клиенты keystone, nova и glance:

#!/usr/bin/python

import os

import keystoneclient.auth.identity as keystone_identity
import keystoneclient.session as keystone_session
import keystoneclient.client as keystone_client
import novaclient.client as nova_client
import glanceclient.client as glance_client

auth = keystone_identity.v2.Password(auth_url=os.environ['OS_AUTH_URL'],
                   username=os.environ['OS_USERNAME'],
                   password=os.environ['OS_PASSWORD'],
                   tenant_name=os.environ['OS_TENANT_NAME'])

# establish a keystone session
sess = keystone_session.Session(auth=auth)

# get a keystone client
kc = keystone_client.Client('2',
                            session=sess,
                            auth_url=sess.auth.auth_url)

# and authenticate it
kc.authenticate(token=sess.get_token(),
                project_id=sess.get_project_id(),
                tenant_id=sess.get_project_id())

# get a nova client
nc = nova_client.Client('2', session=sess)

# get a glance client
gc = glance_client.Client('2',
                          endpoint=kc.service_catalog.url_for(
                              service_type='image',
                              endpoint_type='publicURL'),
                          token=sess.get_token())

Предполагая, что это доступно, вы сначала получите список доступных изображений, соответствующих вашим критериям:

images = [img for img in gc.images.list()
          if 'CentOS-7-x86_64 'in img.name]

А затем получите список изображений, которые вы хотите удалить:

to_delete = images[5:]

Затем получите список изображений, которые используются:

in_use = []
for server in nc.servers.list():
    in_use.append(server.image['id'])

А затем удалите все, что не используется:

for img in to_delete:
    if img['id'] not in in_use:
        gc.images.delete(img['id'])
Другие вопросы по тегам