Примечание куратора: содержание этой статьи было написано Себастьеном Гоасгуеном в блоге Build a Cloud.
В списке разработчиков libcloud для версии 0.13 началось голосование . В заметках о выпуске подробно описаны все новые функции и исправления. Я в восторге от этого, потому что несколько патчей, которые я представил, включены в этот релиз-кандидат. Я немного исправил драйвер CloudStack, чтобы улучшить поддержку Clouds с базовой зоной, такой как Exoscale . Над этим драйвером предстоит проделать большую работу, включая улучшенную поддержку зоны Advanced, особенно для переадресации портов, правил брандмауэра и большего количества модульных тестов. В минувшее воскресенье хакатон CloudStack @ pst418 представил несколько патчей для юнит-тестов, и они сделали это в 0.13 RC, потрясающе.
Если вы не знаете libcloud, это оболочка API на основе Python для абстрагирования различных облачных API. С помощью libcloud вы можете создавать соединения с несколькими облаками, потенциально используя разные API. На высоком уровне это похоже на jclouds для JAVA или deltacloud, написанные на ruby. Уже был драйвер CloudStack, но его функциональность была ограничена. Если вы воспользуетесь моей быстрой оболочкой libcloud , вы можете попытаться выполнить пошаговое руководство по использованию libcloud и базовой зоны CloudStack. Конечно, вам понадобится конечная точка CloudStack.
Запустите libshell и проверьте, в какой зоне вы находитесь:
$ python ./libshell.py Hello LibCloud Shell !! You are running at: https://api.exoscale.ch/compute >>> conn.list_locations() [<NodeLocation: id=1128bd56-b4d9-4ac6-a7b9-c715b187ce11, name=CH-GV2, country=AU, driver=CloudStack>]
Вы можете заметить неправильный код страны, он жестко запрограммирован в libcloud, для этого мне нужно сообщить об ошибке. Получить список шаблонов (или изображений в libcloud говорят):
>>> conn.list_images() [<NodeImage: id=01df77c3-0150-412a-a580-413a50924a18, name=Windows Server 2008 R2 SP1, driver=CloudStack ...>, <NodeImage: id=89ee852c-a5f5-4ab9-a311-89f39d133e88, name=Windows Server 2008 R2 SP1, driver=CloudStack ...>, <NodeImage: id=ccd142ec-83e3-4108-b1c5-8e1fdb353ff9, name=Windows Server 2008 R2 SP1, driver=CloudStack ...>, <NodeImage: id=f2101a0c-eaf7-4760-a143-0a5c940fd864, name=Windows Server 2008 R2 SP1, driver=CloudStack ...>, <NodeImage: id=77d32782-6866-43d4-9524-6fe346594d09, name=CentOS 5.5(64-bit) no GUI (KVM), driver=CloudStack ...>, <NodeImage: id=29cba09f-4569-4bb3-95e7-71f833876e3e, name=Windows Server 2012, driver=CloudStack ...>, <NodeImage: id=ee241b47-4303-40c8-af58-42ed6bf09f8c, name=Windows Server 2012, driver=CloudStack ...>, <NodeImage: id=754ea486-d649-49e5-a70e-5e5d458f0df0, name=Windows Server 2012, driver=CloudStack ...>, <NodeImage: id=0f9f4f49-afc2-4139-b26b-b05a9f51ea74, name=Windows Server 2012, driver=CloudStack ...>, <NodeImage: id=954752a8-0486-46bb-8e3f-0adb3e01c619, name=Linux CentOS 6.4 64-bit, driver=CloudStack ...<]
Я сократил предыдущий вывод, но в этом облаке также есть образы Ubuntu и CentOS … Затем вы можете перечислить различные типы и размеры экземпляров в libcloud.
>>> conn.list_sizes() [<NodeSize: id=71004023-bb72-4a97-b1e9-bc66dfce9470, name=Micro, ram=512 disk=0 bandwidth=0 price=0 driver=CloudStack ...>, <NodeSize: id=b6cd1ff5-3a2f-4e9d-a4d1-8988c1191fe8, name=Tiny, ram=1024 disk=0 bandwidth=0 price=0 driver=CloudStack ...>, <NodeSize: id=21624abb-764e-4def-81d7-9fc54b5957fb, name=Small, ram=2048 disk=0 bandwidth=0 price=0 driver=CloudStack ...>, <NodeSize: id=b6e9d1e8-89fc-4db3-aaa4-9b4c5b1d0844, name=Medium, ram=4096 disk=0 bandwidth=0 price=0 driver=CloudStack ...>, <NodeSize: id=c6f99499-7f59-4138-9427-a09db13af2bc, name=Large, ram=8182 disk=0 bandwidth=0 price=0 driver=CloudStack ...>, <NodeSize: id=350dc5ea-fe6d-42ba-b6c0-efb8b75617ad, name=Extra-large, ram=16384 disk=0 bandwidth=0 price=0 driver=CloudStack ...>, <NodeSize: id=a216b0d1-370f-4e21-a0eb-3dfc6302b564, name=Huge, ram=32184 disk=0 bandwidth=0 price=0 driver=CloudStack ...>]
Я добавил управление парами ключей ssh и группами безопасности. Теперь вы можете создавать списки, создавать и удалять пары ключей и группы безопасности, а также использовать их при развертывании узлов. (Не пытайтесь что-либо сделать с помощью клавиш ниже, я все удалил.)
>>> conn.ex_list_keypairs() [{u'name': u'foobar', u'fingerprint': u'b9:2d:4b:07:db:e7:3e:42:17:11:22:33:44:55:66:77'}] >>> conn.ex_list_security_groups() [{u'egressrule': [], u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'Default Security Group', u'tags': [], u'domain': u' [email protected]', u'ingressrule': [{u'startport': 22, u'cidr': u'0.0.0.0/0', u'protocol': u'tcp', u'endport': 22, u'ruleid': u'b83428c0-7f4c-44d1-bc96-4e1720168fdf'}, {u'startport': 80, u'cidr': u'0.0.0.0/0', u'protocol': u'tcp', u'endport': 80, u'ruleid': u'042124dd-652d-4fa2-8bee-d69973380f21'}], u'id': u'ebfa2339-e9ae-4dcb-b73c-a76cd3fce39e', u'name': u'default'}, {u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'this is a test', u'domain': u' [email protected]', u'id': u'b7f5fbad-4244-491f-9547-c91a010e0c9d', u'name': u'toto'}] >>> conn.ex_create_keypair('test') {u'privateKey': u'-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQCAuPufJnbzFkyIUaMymkXwfilA5qS2J9fx2Q3EWNDs1m89FLFq\n19ERjG43ZvRuI/KGwWZwHbhqoqJth7WQYNelYCmOUYRaepxTrpU4TGDGuhqMh9D9\noNMIFx3ktkcTitxkSY/5h/pXqSB2XXURLpZWwZxjEYwWCpWE8i7uVtIR7wIDAQAB\nAoGAOv0Kik9lOVbhsaK/yAO8w039d7l6h+NQaYtPbMhKzg4iofomp9DJBWK2a3sp\nzoN4s9pTKFPmXC+1gb4sLULD72ENSgyozrPMCJ0tytNa3ebVCCYDvlagEZ83KwGn\nnr2BIRLul1xyHVa+amvTemuxi7OOx0u/0aZ6jPVW9ocPahkCQQDnUACG3Q2p60Mx\nCttW7Go2wz0BhaI8ibG8rHorhdrFJUrsTI6QrLh340uHCIEAuWUXjYDX2u5MTPBG\njWbL/A/9AkEAjnX8EzO/B/RooFTxhYdxv7D1Dzcx4H59mFzjez6N/mjAHjKL4p66\nqGFgLa9HMhDPFOs83VetBXcihu1vueffWwJBALQUD2TvAS0wz82FYz8nrITXuE3Q\nCH7Sv8FgEXiCq89hehO+ghrVrIMBPBJzJ2M18iLE8fKaKXzTRRfYC5hwss0CQHY8\nBdIKCGoZtxwaY7lnCEkIHNtb+9FOKf7iWQpYiJC1b32ghei3xEMrTh+ccYJj4PqD\noigyNC9tCQLi3O92OjECQGYR2z8IDlfnl7G8p7eiyBciuoDyyq5/oJHhkHbkbwzrnW0Uun+rEcjRnXbUN8wUQ6FSFrxk2VSajbCBteTOrF24=\n-----END RSA PRIVATE KEY-----\n', u'name': u'test', u'fingerprint': u'43:59:7e:00:16:45:fc:ab:81:55:03:47:12:22:1e:d5'} >>> conn.ex_list_keypairs() [{u'name': u'test', u'fingerprint': u'43:59:7e:00:16:45:fc:ab:81:55:03:47:12:22:1e:d5'}, {u'name': u'foobar', u'fingerprint': u'b9:2d:4b:07:db:e7:3e:42:17:11:22:33:44:55:66:77'}] >>> conn.ex_delete_keypair('test') u'true' >>> conn.ex_list_keypairs() [{u'name': u'foobar', u'fingerprint': u'b9:2d:4b:07:db:e7:3e:42:17:11:22:33:44:55:66:77'}] >>> conn.ex_create_security_group('heyhey') {u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'id': u'77ad73b5-a383-4e13-94be-a38ef9877996', u'domain': u' [email protected]', u'name': u'heyhey'} >>> conn.ex_list_security_groups() [{u'egressrule': [], u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'Default Security Group', u'tags': [], u'domain': u' [email protected]', u'ingressrule': [{u'startport': 22, u'cidr': u'0.0.0.0/0', u'protocol': u'tcp', u'endport': 22, u'ruleid': u'b83428c0-7f4c-44d1-bc96-4e1720168fdf'}, {u'startport': 80, u'cidr': u'0.0.0.0/0', u'protocol': u'tcp', u'endport': 80, u'ruleid': u'042124dd-652d-4fa2-8bee-d69973380f21'}], u'id': u'ebfa2339-e9ae-4dcb-b73c-a76cd3fce39e', u'name': u'default'}, {u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'this is a test', u'domain': u' [email protected]', u'id': u'b7f5fbad-4244-491f-9547-c91a010e0c9d', u'name': u'toto'}, {u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'id': u'77ad73b5-a383-4e13-94be-a38ef9877996', u'domain': u' [email protected]', u'name': u'heyhey'}] >>> conn.ex_delete_security_group('heyhey') u'true' >>> conn.ex_list_security_groups() [{u'egressrule': [], u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'Default Security Group', u'tags': [], u'domain': u' [email protected]', u'ingressrule': [{u'startport': 22, u'cidr': u'0.0.0.0/0', u'protocol': u'tcp', u'endport': 22, u'ruleid': u'b83428c0-7f4c-44d1-bc96-4e1720168fdf'}, {u'startport': 80, u'cidr': u'0.0.0.0/0', u'protocol': u'tcp', u'endport': 80, u'ruleid': u'042124dd-652d-4fa2-8bee-d69973380f21'}], u'id': u'ebfa2339-e9ae-4dcb-b73c-a76cd3fce39e', u'name': u'default'}, {u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'this is a test', u'domain': u' [email protected]', u'id': u'b7f5fbad-4244-491f-9547-c91a010e0c9d', u'name': u'toto'}]
Создав группу безопасности, вы можете добавить правило доступа:
>>> conn.ex_authorize_security_group_ingress(securitygroupname='toto',protocol='TCP',cidrlist='0.0.0.0./0',startport=99) {u'egressrule': [], u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'this is a test', u'domain': u' [email protected]', u'ingressrule': [{u'startport': 99, u'cidr': u'0.0.0.0./0', u'protocol': u'tcp', u'endport': 99, u'ruleid': u'a13a21f9-1709-431f-9c7d-e1a2c2caacdd'}], u'id': u'b7f5fbad-4244-491f-9547-c91a010e0c9d', u'name': u'toto'} >>> conn.ex_list_security_groups() [{u'egressrule': [], u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'Default Security Group', u'tags': [], u'domain': u' [email protected]', u'ingressrule': [{u'startport': 22, u'cidr': u'0.0.0.0/0', u'protocol': u'tcp', u'endport': 22, u'ruleid': u'b83428c0-7f4c-44d1-bc96-4e1720168fdf'}, {u'startport': 80, u'cidr': u'0.0.0.0/0', u'protocol': u'tcp', u'endport': 80, u'ruleid': u'042124dd-652d-4fa2-8bee-d69973380f21'}], u'id': u'ebfa2339-e9ae-4dcb-b73c-a76cd3fce39e', u'name': u'default'}, {u'egressrule': [], u'account': u' [email protected]', u'domainid': u'ab53d864-6f78-4993-bb28-9b8667b535a1', u'description': u'this is a test', u'tags': [], u'domain': u' [email protected]', u'ingressrule': [{u'startport': 99, u'cidr': u'0.0.0.0./0', u'protocol': u'tcp', u'endport': 99, u'ruleid': u'a13a21f9-1709-431f-9c7d-e1a2c2caacdd'}], u'id': u'b7f5fbad-4244-491f-9547-c91a010e0c9d', u'name': u'toto'}]
Отлично, пара ключей и группа безопасности работают нормально. Теперь давайте разберемся с основами запуска экземпляра и протестируем приостановку и возобновление, которых до сих пор не было в драйвере. Ничто не разрушает землю, но это улучшение.
>>> size=conn.list_sizes() >>> image=conn.list_images() >>> n=conn.create_node(name='yoyo',size=size[0],image=image[0]) >>> n.ex_stop() u'Stopped' >>> n.ex_start() u'Running'
И это все, поддержка CloudStack становится все лучше, еще предстоит проделать огромную работу: улучшить поддержку зон, проверить балансировщик нагрузки и поддержку хранилища, добавить модульные тесты и новые функции CloudStack, такие как автоматическое масштабирование. Продолжать !!!!