Bu kılavuz OpenStack bulutlarında uygulama kurmak isteyen deneyimli yazılım geliştiricileri içindir.
OpenStack’e aşina iseniz ama bir bulut uygulaması veya OpenStack uygulaması oluşturmadıysanız, bu kısım OpenStack bileşenleriyle nasıl programlama yapacağınızı öğretir.
Uygulamaları bulut ortamında kurmak geleneksel IT ortamında kurmaktan oldukça farklıdır. Bu kılavuz uygulamaları OpenStack’de nasıl kuracağınızı ve bulut uygulama geliştirme için bazı en iyi uygulamaları öğretir.
Bu öğretici iki uygulama gösterir. İlk uygulama matematiksel eşitlikler kullanarak güzel fraktal imajlar üreten bir fraktal üreticidir. Göstereceğimiz ikinci, daha sağlam uygulamayla karşılaştırabilmeniz için bu uygulamayı tamamıyla gösteriyoruz.
İkinci uygulama şunları yapmanızı sağlayacak bir OpenStack uygulamasıdır:
Hesaplama kaynaklarını oluşturun ve silin. Bu kaynaklar Fraktal uygulamanın çalıştığı sanal makine sunucularıdır.
Fonksiyonları mikro servislere döndürme ve modüler hale getirme gibi bulutla ilgili mimari kararları alın.
Uygun kaynakları yukarı aşağı ölçekleyin.
Dosya ve veritabanı kalıcılığı için Nesne ve Blok depolamayı kullanın.
Ortama otomatik olarak ayarlanmak için Orkestrasyon servislerini kullanın.
Daha iyi başarım ve ayrım için ağı özelleştirin.
Gelişmiş OpenStack bulut özelliklerini keşfedin ve uygulayın.
Programlama geçmişine sahip herkes bu kılavuzdaki kodu kolaylıkla okuyabilir. Bu kılavuz belirli bir SDK’ya odaklansa da, diğer dilleri ve araç takımlarını OpenStack bulutuyla kullanabilirsiniz:
Dil |
Ad |
Açıklama |
URL |
---|---|---|---|
Python |
OpenStack SDK |
Official Python-based library for OpenStack. |
|
Python |
Apache Vakfının yönettiği Python tabanlı kitaplık. Birden çok bulut türüyle çalışmak için kullanın. |
https://libcloud.readthedocs.org/en/latest/compute/drivers/openstack.html |
|
Python |
Shade |
OpenStack Infra takımı tarafından geliştirilen Python tabanlı bir kitaplık. Birden çok OpenStack bulutlarını işletmek için kullanın. |
|
Java |
Apache Vakfının yönettiği Java tabanlı bir kitaplık. Birden çok bulut türüyle çalışmak için kullanın. |
||
Ruby |
Ruby tabanlı bir SDK. Birden çok bulutla çalışmak için kullanın. |
https://github.com/fog/fog-openstack/blob/master/docs/getting_started.md |
|
node.js |
Node.js tabanlı bir SDK. Birden çok bulutla çalışmak için kullanın. |
https://github.com/pkgcloud/pkgcloud/tree/master/docs/providers/openstack |
|
PHP |
PHP tabanlı bir kitaplık. OpenStack bulutlarıyla çalışan PHP kodu yazmak için kullanın. |
http://php-opencloud.readthedocs.org/en/latest/getting-started-with-openstack.html |
|
.NET Çatısı |
Microsoft .NET için OpenStack SDK |
.NET tabanlı bir kitaplık. Microsoft uygulamaları için C++ veya C# kodu yazmak için kullanın. |
|
Go |
Go tabanlı bir SDK. OpenStack bulutlarıyla çalışan Golang kodu yazmak için kullanın. |
Kullanılabilir SDK listesi için, Yazılım Geliştirme Araçlarına göz atın.
Bu kılavuzun diğer sürümleri diğer SDK’ları ve dilleri kullanarak bu görevleri nasıl gerçekleştireceğinizi gösterir. Bu kılavuzda dahil edilmesini istediğiniz başka bir aracın geliştiricisi iseniz kod parçaları göndermeye çekinmeyin. Daha fazla bilgi için, OpenStack Belgelendirme takımı üyeleriyle iletişime geçin.
Zaten bir OpenStack bulutuna erişiminiz olduğunu varsayıyoruz. En az altı sunucu kotasına sahip, kiracı olarak da bilinen, bir projeye sahip olmalısınız. Fraktallar uygulaması Ubuntu, Debian, Fedora-tabanlı, ve openSUSE tabanlı dağıtımlarda çalıştığından, bu işletim sistemlerinden birini kullanan sunucular oluşturmalısınız.
Bulutla iletişime geçmek için ayrıca şunlara sahip olmalısınız
a recent version of shade installed.
Not
Devam etmeden önce shade’in son sürümünü kurun.
Aşağıdaki bilgiyi bulut sağlayıcınızdan alın:
yetkilendirme URL’si
kullanıcı adı
parola
proje kimliği veya ismi (projeler kiracılar olarak da bilinir)
bulut bölgesi
Ayrıca OpenStack RC dosyasını OpenStack Horizon kontrol panosundan indirebilirsiniz. Kontrol panosuna giriş yapın ve Proje->Erişim & Güvenlik->API Erişimi->OpenStack RC dosyasını indire tıklayın. Bu yöntemi kullanırsanız “yetkilendirme URL“‘sinin yolda bulunmadığını unutmayın. Örneğin openrc.sh
dosyanız şöyle gösteriyorsa:
export OS_AUTH_URL=http://controller:5000/v2.0
Asıl yetkilendirme URL’si:
http://controller:5000
Bu öğreticide, OpenStack bulutunuzla “OpenStack SDK’nızı seçin” kısmında seçtiğiniz SDK aracılığıyla etkileşirsiniz. Bu kılavuz seçtiğiniz dilde kod parçaları çalıştırmayı bildiğinizi varsayar.
Not
Öğretici conn
nesnesini tekrar kullandığından, hep birini el altında tuttuğunuzdan emin olun.
Bulut sağlayıcı ismini, kullanıcı ismini, parolayı, proje ismini ve bölge ismini ~/.config/openstack/clouds.yml
dosyasında belirtmek için yukardaki kimlik bilgilerinizi kullanın.
clouds:
myfavoriteopenstack:
auth:
auth_url: https://controller:5000/
username: $YOUR_USERNAME
password: $YOUR_PASSWORD
project_name: $YOUR_PROJECT
region_name: $REGION
Not
If you do use a public cloud known by shade,
you can avoid specifying auth_url:
and instead specify
profile: $PROVIDER_NAME
in the clouds.yml file.
Shade’i bir profil kullanarak yapılandırmak için, ~/.config/openstack/clouds.yml
dosyasında bulut sağlayıcı ismi, kullanıcı adı, parola, proje ismi ve bölge ismini belirtmek için kimlik bilgilerinizi kullanın.
my-provider:
profile: $PROVIDER_NAME
auth:
username: $YOUR_USERNAME
password: $YOUR_PASSWORD
project_name: $YOUR_PROJECT
region_name: $REGION
See configure shade, to configure your cloud using a profile.
from shade import *
simple_logging(debug=True)
conn = openstack_cloud(cloud='myfavoriteopenstack')
Uygulamanızı çalıştırmak için bir sunucu başlatmalısınız. Sunucu bir sanal makine olarak servis verir.
Bir sunucu başlatmak için, bir nitelik ve imaj seçersiniz. Nitelik sunucunuzun boyutunu, CPU sayısı ve RAM ve disk boyutu da dahil olarak temsil eder. İmaj sunucunuzu kopyaladığınız hazır bir işletim sistemi kurulumudur. Açık bir bulutta sunucularınız önyüklediğinizde, büyük nitelikler kaynakça ve maddi olarak küçük olanlardan daha pahalı olabilir.
Bulutunuzda kullanılabilir imajları listelemek için, bazı API çağrıları çalıştırın:
images = conn.list_images()
for image in images:
print(image)
Bu kod şu şekilde çıktı verir:
checksum: 750a56555d4ec7303f5dc33b007ff632
container_format: bare
created_at: '2014-07-14T19:02:15Z'
direct_url:
rbd://7e14670e-a6f8-445b-b632-4b79bafc4781/masseffect-images/b4efbc2a-6130-4f2e-b436-55a618c4de20/snap
disk_format: raw
file: /v2/images/b4efbc2a-6130-4f2e-b436-55a618c4de20/file
id: b4efbc2a-6130-4f2e-b436-55a618c4de20
min_disk: 10
min_ram: 1024
name: Debian-7.0-Wheezy
owner: 0bacd8121bb548698f340455b38bf561
protected: false
schema: /v2/schemas/image
size: 5242880000
status: active
tags: []
updated_at: '2014-10-15T22:42:52Z'
visibility: public
Ayrıca kullanılabilir niteliklerle ilgili bilgi alabilirsiniz:
flavors = conn.list_flavors()
for flavor in flavors:
print(flavor)
Bu kod şu şekilde çıktı verir:
HUMAN_ID: true
NAME_ATTR: name
OS-FLV-DISABLED:disabled: false
OS-FLV-EXT-DATA:ephemeral: 0
disk: 80
ephemeral: 0
human_id: supersonic
id: '200'
is_public: true
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/flavors/200
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/200
rel: bookmark
name: supersonic
os-flavor-access:is_public: true
ram: 2048
swap: ''
vcpus: 1
Tabi imaj ve nitelikleriniz farklı olacaktır.
Sunucunuz için bir imaj ve nitelik seçin. 1GB kadar RAM, 1 CPU ve 1GB diske ihtiyacınız var. Bu örnek güvenli bir seçim olan, küçük nitelikte bir Ubuntu imajını kullanır. Bu kılavuzdaki ilerleyen öğretici kısımlarda imaj ve nitelik kimliklerini seçtiğiniz imaj ve niteliklere göre değiştirmeniz gerekecek.
İstediğiniz imaj bulutunuzda değilse, genellikle bulutunuzun ilke ayarlarına göre bir tane yükleyebilirsiniz. İmaj yüklemeyle ilgili bilgi için imajları elde etmeye göz atın.
İmaj ve boyut değişkenlerini bulutunuz için uygun değerlere ayarlayın. Bu değişkenleri ilerleyen kısımlarda kullanacağız.
Önce, bağlantıya önceki kısımda seçtiğiniz imajın kimliğini kullanarak belirtilen imajı almasını söyleyin:
image_id = 'c55094e9-699c-4da9-95b4-2e2e75f4c66e'
image = conn.get_image(image_id)
print(image)
Bu kod şu şekilde çıktı verir:
checksum: da578dd59289a35a0ac7744a0bd85cf5
container_format: bare
created_at: '2014-10-27T22:05:37Z'
direct_url:
rbd://7e14670e-a6f8-445b-b632-4b79bafc4781/masseffect-images/c55094e9-699c-4da9-95b4-2e2e75f4c66e/snap
disk_format: raw
file: /v2/images/c55094e9-699c-4da9-95b4-2e2e75f4c66e/file
id: c55094e9-699c-4da9-95b4-2e2e75f4c66e
min_disk: 0
min_ram: 0
name: Ubuntu-14.04-Trusty
owner: 0bacd8121bb548698f340455b38bf561
protected: false
schema: /v2/schemas/image
size: 10737418240
status: active
tags: []
updated_at: '2014-10-27T22:08:55Z'
visibility: public
Ardından betiğe kullanmak istediğiniz niteliği söyleyin:
Kullanmak istediğiniz nitelik kimliğini belirtin.
flavor_id = '100'
flavor = conn.get_flavor(flavor_id)
print(flavor)
Bu kod şu şekilde çıktı verir:
HUMAN_ID: true
NAME_ATTR: name
OS-FLV-DISABLED:disabled: false
OS-FLV-EXT-DATA:ephemeral: 0
disk: 80
ephemeral: 0
human_id: subsonic
id: '100'
is_public: true
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: bookmark
name: subsonic
os-flavor-access:is_public: true
ram: 1024
swap: ''
vcpus: 1
Şimdi sunucuyu başlatabilirsiniz.
Sunucu oluşturmak için seçtiğiniz imajı ve niteliği kullanın.
Not
Aşağıdaki sunucu oluşturma örneği tek kiracılı bir ağa sahip olduğunuzu varsayar. ‘İstisna: 400 Kötü İstek Birden fazla muhtemel ağ bulundu, daha belirleyici olmak için bir Ağ Kimliği kullanın’ hatası alırsanız birden fazla kiracılı ağınız var demektir. Sunucuyu oluşturan çağrıya bir networks parametresi eklemeniz gerekir. Ayrıntılar için bkz Ek.
Sunucuyu oluşturun.
Not
SDK’nız sunucuya ‘düğüm’ ya da ‘makine’ diyebilir.
instance_name = 'testing'
testing_instance = conn.create_server(wait=True, auto_ip=True,
name=instance_name,
image=image_id,
flavor=flavor_id)
print(testing_instance)
Mevcut sunucuları listelerseniz:
instances = conn.list_servers()
for instance in instances:
print(instance)
Yeni sunucu belirir.
HUMAN_ID: true
NAME_ATTR: name
OS-DCF:diskConfig: MANUAL
OS-EXT-AZ:availability_zone: iad-1
OS-EXT-STS:power_state: 1
OS-EXT-STS:task_state: null
OS-EXT-STS:vm_state: active
OS-SRV-USG:launched_at: '2015-07-20T20:31:10.000000'
OS-SRV-USG:terminated_at: null
accessIPv4: ''
accessIPv6: ''
addresses:
private-network:
- OS-EXT-IPS-MAC:mac_addr: fa:16:3e:60:f5:cd
OS-EXT-IPS:type: fixed
addr: 2607:f298:6050:4e14:f816:3eff:fe60:f5cd
version: 6
- OS-EXT-IPS-MAC:mac_addr: fa:16:3e:60:f5:cd
OS-EXT-IPS:type: fixed
addr: 10.10.10.14
version: 4
config_drive: ''
created: '2015-07-20T20:30:23Z'
flavor:
id: '100'
links:
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: bookmark
hostId: f71865b497e6fa71063e292b11846eb64b5a41cd5c00fbb7465b6a48
human_id: testing
id: 67ecebdc-daff-4d84-bd04-bc76c67b48ec
image:
id: c55094e9-699c-4da9-95b4-2e2e75f4c66e
links:
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/images/c55094e9-699c-4da9-95b4-2e2e75f4c66e
rel: bookmark
key_name: null
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/servers/67ecebdc-daff-4d84-bd04-bc76c67b48ec
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/servers/67ecebdc-daff-4d84-bd04-bc76c67b48ec
rel: bookmark
metadata: {}
name: testing
networks:
private-network:
- 2607:f298:6050:4e14:f816:3eff:fe60:f5cd
- 10.10.10.14
os-extended-volumes:volumes_attached: []
progress: 0
security_groups:
- name: default
status: ACTIVE
tenant_id: 5d013ac5962749a49af7ff18c2fb228c
updated: '2015-07-20T20:31:10Z'
user_id: bfd3dbf1c8a242cd90884408de547bb9
Devam etmeden önce bir şey daha yapmalısınız.
Bulut kaynakları, örneğin artık kullanmadığınız çalışan sunucular, para harcayabilir. İstenmeyen masraflardan kaçınmak için bulut kaynaklarını silin.
conn.delete_server(name_or_id=instance_name)
Sunucuları tekrar listelerseniz, sunucu kaybolacaktır.
Bu kısımda başka bir sunucu kurulumunda kullanmak için kabuğunuzu açık tutun.
Artık sunucuları nasıl oluşturup sileceğinizi bildiğinize göre, aynı uygulamayı kurabilirsiniz. Uygulama için oluşturduğunuz sunucu oluşturduğunuz ilk sunucuya benzerdir ama bu sefer bir kaç ek kavramı devreye sokacağız.
Not
Uygulamayı indirmek için bulut sunucunuzdan internet bağlantısı gereklidir.
Uygulama için bir sunucu oluşturduğunuzda, az önce oluşturduğunuz ve sildiğiniz boş sunucudan biraz daha fazla bilgi vermek istersiniz. İlerleyen kısımlarda daha fazla ayrıntıya gireceğiz, ama şimdilik sunucuyu beslemek için sadece basitçe aşağıdaki kaynakları oluşturun:
Bir anahtar çifti. Sunucunuza erişmek için, OpenStack’e SSH açık anahtarını aktararak anahtar çifti oluşturmalısınız. OpenStack bu anahtar çiftini yeni sunucuya yükler. Genellikle açık anahtarınız .ssh/id_rsa.pub
konumuna yazılır. SSH açık anahtarı dosyanız yoksa önce şu yönergeleri takip edin. Bu yönergeleri Fraktallar uygulama mimarisine giriş da daha derin işleyeceğiz.
Aşağıdaki örnekte, pub_key_file
’yi açık SSH anahtarı dosyanızın konumuna ayarlayın.
print('Checking for existing SSH keypair...')
keypair_name = 'demokey'
pub_key_file = '/home/username/.ssh/id_rsa.pub'
if conn.search_keypairs(keypair_name):
print('Keypair already exists. Skipping import.')
else:
print('Adding keypair...')
conn.create_keypair(keypair_name, open(pub_key_file, 'r').read().strip())
for keypair in conn.list_keypairs():
print(keypair)
Ağ erişimi. Öntanımlı olarak, OpenStack tüm trafiği süzer. Bir güvenlik grubu oluşturmalı ve bunu sunucunuza uygulamalısınız. Güvenlik grubu HTTP ve SSH erişimine izin verir. Fraktallar uygulama mimarisine giriş da ayrıntıya gireceğiz.
print('Checking for existing security groups...')
sec_group_name = 'all-in-one'
if conn.search_security_groups(sec_group_name):
print('Security group already exists. Skipping creation.')
else:
print('Creating security group.')
conn.create_security_group(sec_group_name, 'network access for all-in-one application.')
conn.create_security_group_rule(sec_group_name, 80, 80, 'TCP')
conn.create_security_group_rule(sec_group_name, 22, 22, 'TCP')
conn.search_security_groups(sec_group_name)
Kullanıcıverisi. Sunucu oluşturma anında, OpenStack’in sunucular önyüklendikten sonra yapılandırabilmesi için kullanıcı verisi sağlayabilirsiniz. Cloud-init servisi kullanıcı verisini sunucuya uygular. Seçtiğiniz imaja cloud-init servisini önceden yüklemelisiniz. Fraktallar uygulama mimarisine giriş kısmında daha ayrıntıya gireceğiz.
ex_userdata = '''#!/usr/bin/env bash
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
-i faafo -i messaging -r api -r worker -r demo
'''
Artık sunucuyu önyükleyip yapılandırabilirsiniz.
Sunucuyu oluşturmak için imajı, niteliği, anahtar çiftini ve kullanıcı verisini kullanın. Sunucu isteği yaptıktan sonra inşa edilmesini bekleyin.
Shade çatısı çabukça boş bir değişken IP seçip atayabilir
instance_name = 'all-in-one'
testing_instance = conn.create_server(wait=True, auto_ip=False,
name=instance_name,
image=image_id,
flavor=flavor_id,
key_name=keypair_name,
security_groups=[sec_group_name],
userdata=ex_userdata)
Sunucu önyüklendiğinde, ex_userdata değişken değeri sunucuya Fraktal uygulamasını kurmasını söyler.
Ağ kısmında ağın ayrıntılarını kapsıyoruz.
Uygulamayı çalışır görmek için, nereye bakacağınızı bilmeniz gerekir. Öntanımlı olarak sunucunuzun dışarı ağ erişimi bulunur. Sunucunuzu internetten erişilebilir yapmak için bir IP adresine ihtiyacınız vardır. Bazı durumlarda öntanımlı olarak sunucunuz açıkça yönlendirilebilir bir IP adresiyle hazırlanır. Bu durumda sunucuları listelediğinizde public_ips veya private_ips altında listelenen bir IP adresi görürsünüz. Görmezseniz sunucunuz için bir değişken IP adresi oluşturmalı ve atamalısınız.
f_ip = conn.available_floating_ip()
Kurulumu başlatmak için betiği çalıştırın.
Uygulama verisinin ve yapılandırmanın sunucuya kurulumu biraz zaman alabilir. Beklerken bir kahve keyfi yapmayı düşünebilirsiniz. Uygulama kurulduktan sonra, tercih ettiğiniz tarayıcıyla aşağıdaki bağlantıdaki muhteşem grafik arayüzü ziyaret edebilirsiniz.
print('The Fractals app will be deployed to http://%s' % f_ip['floating_ip_address'] )
Not
Değişken IP adresleri kullanmazsanız, uygun şekilde başka bir IP adresiyle değiştirin.
Bu kavramlar henüz tam oturmadıysa endişe etmeyin. Fraktallar uygulama mimarisine giriş kısmında bu kavramları daha ayrıntılı işleyeceğiz.
Dışa ölçekleme: Uygulamanızı nasıl ölçekleyeceğinizi öğrenin.
Dayanıklı hale getirin: Uygulamanızı dayanıklı hale getirmek için Nesne Depolamayı nasıl kullanacağınızı öğrenin.
Blok Depolama: Veritabanını blok depolamaya göç ettirin, veya servis olarak veritabanı bileşenini kullanın.
Orkestrasyon: Uygulamanızı otomatik olarak düzenleyin.
Ağ: Karmaşık ağları öğrenin.
İşlemlere yeni geliştiriciler için öneri: İşlemler hakkında öneri alın.
Çılgınlaşmak: Yapmayı düşünmeyeceğiniz bazı çılgın şeyleri öğrenin ;)
Aşağıdaki dosya öğreticinin bu kısmındaki tüm kodu içerir. Bu kapsayıcı kod örneği kodu tek bir betik olarak görüntüleme ve çalıştırma şansı verir.
Bu betiği çalıştırmadan önce, kimlik doğrulama bilgisini, nitelik ve imaj kimliğini ayarladığınızdan emin olun.
#step-1
from shade import *
simple_logging(debug=True)
conn = openstack_cloud(cloud='myfavoriteopenstack')
#step-2
images = conn.list_images()
for image in images:
print(image)
#step-3
flavors = conn.list_flavors()
for flavor in flavors:
print(flavor)
#step-4
image_id = 'c55094e9-699c-4da9-95b4-2e2e75f4c66e'
image = conn.get_image(image_id)
print(image)
#step-5
flavor_id = '100'
flavor = conn.get_flavor(flavor_id)
print(flavor)
#step-6
instance_name = 'testing'
testing_instance = conn.create_server(wait=True, auto_ip=True,
name=instance_name,
image=image_id,
flavor=flavor_id)
print(testing_instance)
#step-7
instances = conn.list_servers()
for instance in instances:
print(instance)
#step-8
conn.delete_server(name_or_id=instance_name)
#step-9
print('Checking for existing SSH keypair...')
keypair_name = 'demokey'
pub_key_file = '/home/username/.ssh/id_rsa.pub'
if conn.search_keypairs(keypair_name):
print('Keypair already exists. Skipping import.')
else:
print('Adding keypair...')
conn.create_keypair(keypair_name, open(pub_key_file, 'r').read().strip())
for keypair in conn.list_keypairs():
print(keypair)
#step-10
print('Checking for existing security groups...')
sec_group_name = 'all-in-one'
if conn.search_security_groups(sec_group_name):
print('Security group already exists. Skipping creation.')
else:
print('Creating security group.')
conn.create_security_group(sec_group_name, 'network access for all-in-one application.')
conn.create_security_group_rule(sec_group_name, 80, 80, 'TCP')
conn.create_security_group_rule(sec_group_name, 22, 22, 'TCP')
conn.search_security_groups(sec_group_name)
#step-11
ex_userdata = '''#!/usr/bin/env bash
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
-i faafo -i messaging -r api -r worker -r demo
'''
#step-12
instance_name = 'all-in-one'
testing_instance = conn.create_server(wait=True, auto_ip=False,
name=instance_name,
image=image_id,
flavor=flavor_id,
key_name=keypair_name,
security_groups=[sec_group_name],
userdata=ex_userdata)
#step-13
f_ip = conn.available_floating_ip()
#step-14
conn.add_ip_list(testing_instance, [f_ip['floating_ip_address']])
#step-15
print('The Fractals app will be deployed to http://%s' % f_ip['floating_ip_address'] )
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.