Başlangıç

Başlangıç

Bu kılavuzu okuması gerekenler

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.

Öğrenecekleriniz

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.

Genel görünüm

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.

OpenStack SDK’nızı seçin

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:

OpenStack SDK’ları
Dil Ad Açıklama URL
Python OpenStack SDK Official Python-based library for OpenStack. https://docs.openstack.org/openstacksdk/latest/
Python Libcloud 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. https://docs.openstack.org/infra/shade/
Java jClouds Apache Vakfının yönettiği Java tabanlı bir kitaplık. Birden çok bulut türüyle çalışmak için kullanın. https://jclouds.apache.org/guides/openstack/
Ruby fog 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 pkgcloud 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-opencloud 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. https://www.nuget.org/packages/openstack.net
Go gophercloud Go tabanlı bir SDK. OpenStack bulutlarıyla çalışan Golang kodu yazmak için kullanın. http://gophercloud.io/

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.

İhtiyacınız olan

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

OpenStack ile nasıl etkileşimde bulunduğunuz

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

Nitelikler ve imajlar

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 Başlat

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.

Bir sunucuyu silin

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.

Uygulamayı yeni bir sunucuya kurun

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://git.openstack.org/cgit/openstack/faafo/plain/contrib/install.sh | bash -s -- \
-i faafo -i messaging -r api -r worker -r demo
'''

Artık sunucuyu önyükleyip yapılandırabilirsiniz.

Bir sunucu önyükleyin ve yapılandırın

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.

Harici bağlantı için bir değişken IP ilişkilendirin

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.

Uygulamaya erişin

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.

screenshot of the webinterface

Sonraki adımlar

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.

Tam kod örneği

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://git.openstack.org/cgit/openstack/faafo/plain/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'] )
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.