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'])