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 OpenStackSDK installed.

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.

Denemek için aşağıdaki kodu python -i çağırarak bir Python betiğine ekleyin (veya etkileşimli Python kabuğu kullanın).

import base64
from os.path import expanduser

from openstack import connection
from openstack import exceptions

auth_username = 'your_auth_username'
auth_password = 'your_auth_password'
auth_url = 'http://controller:5000/v2.0'
project_name = 'your_project_name_or_id'
region_name = 'your_region_name'

conn = connection.Connection(auth_url=auth_url,
                             project_name=project_name,
                             username=auth_username,
                             password=auth_password,
                             region=region_name)

Not

Öğretici conn nesnesini tekrar kullandığından, hep birini el altında tuttuğunuzdan emin olun.

Not

Aşağıdaki API çağrılarından birini çalıştırmaya çalışırken openstack.exceptions.HttpException: HttpException: 401 İstemci Hatası: Yetkilendirilmemiş, istisnasını alırsanız lütfen kimlik bilgilerinizi tekrar kontrol edin.

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.image.images()
for image in images:
    print(image)

Şuna benzer bir çıktı görmelisiniz:

openstack.image.v1.image.Image(attrs={u'name': u'ubuntu-14.04', u'container_format': u'bare', u'disk_format': u'qcow2', u'checksum': u'6d8f1c8cf05e1fbdc8b543fda1a9fa7f', u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'size': 258540032}, loaded=True)
...

Ayrıca kullanılabilir niteliklerle ilgili bilgi alabilirsiniz:

flavors = conn.compute.flavors()
for flavor in flavors:
    print(flavor)

Şuna benzer bir çıktı görmelisiniz:

openstack.compute.v2.flavor.FlavorDetail(attrs={u'name': u'm1.tiny', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/1', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/1', u'rel': u'bookmark'}], u'ram': 512, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 1, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 1, u'id': u'1'}, loaded=True)

openstack.compute.v2.flavor.FlavorDetail(attrs={u'name': u'm1.small', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}], u'ram': 2048, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 1, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 20, u'id': u'2'}, loaded=True)

openstack.compute.v2.flavor.FlavorDetail(attrs={u'name': u'm1.medium', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/3', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/3', u'rel': u'bookmark'}], u'ram': 4096, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 2, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 40, u'id': u'3'}, loaded=True)

...

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 = 'cb6b7936-d2c5-4901-8678-c88b3a6ed84c'
image = conn.compute.get_image(image_id)
print(image)

Şuna benzer bir çıktı görmelisiniz:

openstack.image.v1.image.Image(attrs={u'name': u'ubuntu-14.04', u'container_format': u'bare', u'disk_format': u'qcow2', u'checksum': u'6d8f1c8cf05e1fbdc8b543fda1a9fa7f', u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'size': 258540032}, loaded=True)

Ardından betiğe kullanmak istediğiniz niteliği söyleyin:

flavor_id = '2'
flavor = conn.compute.get_flavor(flavor_id)
print(flavor)

Şuna benzer bir çıktı görmelisiniz:

openstack.compute.v2.flavor.Flavor(attrs={u'name': u'm1.small', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}], u'ram': 2048, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 1, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 20, 'id': u'2'}, loaded=True)

Ş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'
image_args = {
    'name': instance_name,
    'imageRef': image,
    'flavorRef': flavor
}

testing_instance = conn.compute.create_server(**image_args)
print(testing_instance)

Şuna benzer bir çıktı görmelisiniz:

openstack.compute.v2.server.Server(attrs={'flavorRef': openstack.compute.v2.flavor.Flavor(attrs={u'name': u'm1.small', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}], u'ram': 2048, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 1, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 20, 'id': u'2'}, loaded=True), 'name': 'testing', 'imageRef': openstack.image.v1.image.Image(attrs={u'name': u'ubuntu14.04', u'container_format': u'bare', u'disk_format': u'qcow2', u'checksum': u'6d8f1c8cf05e1fbdc8b543fda1a9fa7f', u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'size': 258540032}, loaded=True), 'id': u'a1700b84-dc9a-434e-8f7a-40852e97781c'}, loaded=False)

Mevcut sunucuları listelerseniz:

instances = conn.compute.servers()
for instance in instances:
    print(instance)

Yeni sunucu belirir.

openstack.compute.v2.server.ServerDetail(attrs={u'OS-EXT-STS:task_state': u'scheduling', u'addresses': {}, u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/servers/a1700b84-dc9a-434e-8f7a-40852e97781c', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/servers/a1700b84-dc9a-434e-8f7a-40852e97781c', u'rel': u'bookmark'}], u'image': {u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'links': [{u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/images/cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'rel': u'bookmark'}]}, u'OS-EXT-STS:vm_state': u'building', u'OS-SRV-USG:launched_at': None, u'flavor': {u'id': u'2', u'links': [{u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}]}, u'id': u'a1700b84-dc9a-434e-8f7a-40852e97781c', u'user_id': u'59f76712914b44819cf311af43946079', 'imageRef': openstack.compute.v2.image.Image(attrs={u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'links': [{u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/images/cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'rel': u'bookmark'}]}, loaded=False), u'OS-DCF:diskConfig': u'MANUAL', u'accessIPv4': u'', u'accessIPv6': u'', u'progress': 0, u'OS-EXT-STS:power_state': 0, u'OS-EXT-AZ:availability_zone': u'nova', u'config_drive': u'', u'status': u'BUILD', u'updated': u'2015-10-12T13:45:37Z', u'hostId': u'', u'OS-SRV-USG:terminated_at': None, u'key_name': None, 'flavorRef': openstack.compute.v2.flavor.Flavor(attrs={u'id': u'2', u'links': [{u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}]}, loaded=False), u'name': u'testing', u'created': u'2015-10-12T13:45:37Z', u'tenant_id': u'96ff6aa79e60423d9848b70d5475c415', u'os-extended-volumes:volumes_attached': [], u'metadata': {}}, loaded=True)

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.compute.delete_server(testing_instance)

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 key pair...')
keypair_name = 'demokey'
keypair_exists = False
for keypair in conn.compute.keypairs():
    if keypair.name == keypair_name:
        keypair_exists = True

if keypair_exists:
    print('Keypair ' + keypair_name + ' already exists. Skipping import.')
else:
    print('adding keypair...')
    pub_key_file = open(expanduser('~/.ssh/id_rsa.pub')).read()
    keypair_args = {
        "name": keypair_name,
        "public_key": pub_key_file
    }
    conn.compute.create_keypair(**keypair_args)

for keypair in conn.compute.keypairs():
    print(keypair)

openstack.compute.v2.keypair.Keypair(attrs={u'public_key': u'ssh-rsa ABAAABAQCyyzkyaPf.....', u'name': u'demokey', u'fingerprint': aa:bb:cc:... '}, loaded=True)
  • 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 group...')
security_group_name = 'all-in-one'
security_group_exists = False
for security_group in conn.network.security_groups():
    if security_group.name == security_group_name:
        all_in_one_security_group = security_group
        security_group_exists = True

if security_group_exists:
    print('Security Group ' + all_in_one_security_group.name + ' already exists. Skipping creation.')
else:
    security_group_args = {
        'name' : security_group_name,
        'description': 'network access for all-in-one application.'
    }
    all_in_one_security_group = conn.network.create_security_group(**security_group_args)

    security_rule_args = {
        'security_group_id': all_in_one_security_group,
        'direction': 'ingress',
        'protocol': 'tcp',
        'port_range_min': '80',
        'port_range_max': '80'
    }
    conn.network.create_security_group_rule(**security_rule_args)

    security_rule_args['port_range_min'] = '22'
    security_rule_args['port_range_max'] = '22'
    conn.network.create_security_group_rule(**security_rule_args)

for security_group in conn.network.security_groups():
    print(security_group)

  • 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.

Not

Openstacksdk’daki kullanıcı verisi Base64 kodlanmalıdır

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
'''
userdata_b64str = base64.b64encode(userdata)

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.

print('Checking for existing instance...')
instance_name = 'all-in-one'
instance_exists = False
for instance in conn.compute.servers():
    if instance.name == instance_name:
        testing_instance = instance
        instance_exists = True

if instance_exists:
    print('Instance ' + testing_instance.name + ' already exists. Skipping creation.')
else:

    testing_instance_args = {
        'name': instance_name,
        'imageRef': image,
        'flavorRef': flavor,
        'key_name': keypair_name,
        'user_data': userdata_b64str,
        'security_groups': [{'name': all_in_one_security_group.name}]
    }

    testing_instance = conn.compute.create_server(**testing_instance_args)
    conn.compute.wait_for_server(testing_instance)

for instance in conn.compute.servers():
    print(instance)

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.

Not

Bu örnek için, harici ağınız olan ‘public’ ağından bir değişken IP havuzu alıyoruz.

Bu proje için kullanılabilir tüm değişken IP’leri listeleyin ve boş olan ilkini seçin. Kullanılabilir yoksa yeni bir değişken IP ayırın.

print('Checking if Floating IP is already assigned to testing_instance...')
testing_instance_floating_ip = None
for values in testing_instance.addresses.values():
    for address in values:
        if address['OS-EXT-IPS:type'] == 'floating':
            testing_instance_floating_ip = conn.network.find_ip(address['addr'])

unused_floating_ip = None
if not testing_instance_floating_ip:
    print('Checking for unused Floating IP...')
    for floating_ip in conn.network.ips():
        if not floating_ip.fixed_ip_address:
            unused_floating_ip = floating_ip
            break

if not testing_instance_floating_ip and not unused_floating_ip:
    print('No free unused Floating IPs. Allocating new Floating IP...')
    public_network_id = conn.network.find_network('public').id
    try:
        unused_floating_ip = conn.network.create_ip(floating_network_id=public_network_id)
        unused_floating_ip = conn.network.get_ip(unused_floating_ip)
        print(unused_floating_ip)
    except exceptions.HttpException as e:
        print(e)

Bu kod değişken IP adresini döndürür:

openstack.network.v2.floating_ip.FloatingIP(attrs={u'router_id': None, u'status': u'DOWN', u'tenant_id': u'96ff6aa79e60423d9848b70d5475c415', u'floating_network_id': u'0e43db46-8fd9-4ef1-8826-4cf9e809aede', u'fixed_ip_address': None, u'floating_ip_address': u'203.0.113.101', u'port_id': None, u'id': u'da890b1e-0afa-4724-9af6-0e5ab9cc33dd'}, loaded=True)

Ardından sunucuya ekleyebilirsiniz:

if testing_instance_floating_ip:
    print('Instance ' + testing_instance.name + ' already has a public ip. Skipping attachment.')
else:
    for port in conn.network.ports():
        if port.device_id == testing_instance.id:
            testing_instance_port = port

    testing_instance_floating_ip = unused_floating_ip
    conn.network.add_ip_to_port(testing_instance_port, testing_instance_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' % testing_instance_floating_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
import base64
from os.path import expanduser

from openstack import connection
from openstack import exceptions

auth_username = 'your_auth_username'
auth_password = 'your_auth_password'
auth_url = 'http://controller:5000/v2.0'
project_name = 'your_project_name_or_id'
region_name = 'your_region_name'

conn = connection.Connection(auth_url=auth_url,
                             project_name=project_name,
                             username=auth_username,
                             password=auth_password,
                             region=region_name)

# step-2
images = conn.image.images()
for image in images:
    print(image)

# step-3
flavors = conn.compute.flavors()
for flavor in flavors:
    print(flavor)

# step-4
image_id = 'cb6b7936-d2c5-4901-8678-c88b3a6ed84c'
image = conn.compute.get_image(image_id)
print(image)

# step-5
flavor_id = '2'
flavor = conn.compute.get_flavor(flavor_id)
print(flavor)

# step-6
instance_name = 'testing'
image_args = {
    'name': instance_name,
    'imageRef': image,
    'flavorRef': flavor
}

testing_instance = conn.compute.create_server(**image_args)
print(testing_instance)

# step-7
instances = conn.compute.servers()
for instance in instances:
    print(instance)

# step-8
conn.compute.delete_server(testing_instance)

# step-9
print('Checking for existing SSH key pair...')
keypair_name = 'demokey'
keypair_exists = False
for keypair in conn.compute.keypairs():
    if keypair.name == keypair_name:
        keypair_exists = True

if keypair_exists:
    print('Keypair ' + keypair_name + ' already exists. Skipping import.')
else:
    print('adding keypair...')
    pub_key_file = open(expanduser('~/.ssh/id_rsa.pub')).read()
    keypair_args = {
        "name": keypair_name,
        "public_key": pub_key_file
    }
    conn.compute.create_keypair(**keypair_args)

for keypair in conn.compute.keypairs():
    print(keypair)

# step-10
print('Checking for existing security group...')
security_group_name = 'all-in-one'
security_group_exists = False
for security_group in conn.network.security_groups():
    if security_group.name == security_group_name:
        all_in_one_security_group = security_group
        security_group_exists = True

if security_group_exists:
    print('Security Group ' + all_in_one_security_group.name + ' already exists. Skipping creation.')
else:
    security_group_args = {
        'name' : security_group_name,
        'description': 'network access for all-in-one application.'
    }
    all_in_one_security_group = conn.network.create_security_group(**security_group_args)

    security_rule_args = {
        'security_group_id': all_in_one_security_group,
        'direction': 'ingress',
        'protocol': 'tcp',
        'port_range_min': '80',
        'port_range_max': '80'
    }
    conn.network.create_security_group_rule(**security_rule_args)

    security_rule_args['port_range_min'] = '22'
    security_rule_args['port_range_max'] = '22'
    conn.network.create_security_group_rule(**security_rule_args)

for security_group in conn.network.security_groups():
    print(security_group)

# step-11
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
'''
userdata_b64str = base64.b64encode(userdata)

# step-12
print('Checking for existing instance...')
instance_name = 'all-in-one'
instance_exists = False
for instance in conn.compute.servers():
    if instance.name == instance_name:
        testing_instance = instance
        instance_exists = True

if instance_exists:
    print('Instance ' + testing_instance.name + ' already exists. Skipping creation.')
else:

    testing_instance_args = {
        'name': instance_name,
        'imageRef': image,
        'flavorRef': flavor,
        'key_name': keypair_name,
        'user_data': userdata_b64str,
        'security_groups': [{'name': all_in_one_security_group.name}]
    }

    testing_instance = conn.compute.create_server(**testing_instance_args)
    conn.compute.wait_for_server(testing_instance)

for instance in conn.compute.servers():
    print(instance)

# step-13
print('Checking if Floating IP is already assigned to testing_instance...')
testing_instance_floating_ip = None
for values in testing_instance.addresses.values():
    for address in values:
        if address['OS-EXT-IPS:type'] == 'floating':
            testing_instance_floating_ip = conn.network.find_ip(address['addr'])

unused_floating_ip = None
if not testing_instance_floating_ip:
    print('Checking for unused Floating IP...')
    for floating_ip in conn.network.ips():
        if not floating_ip.fixed_ip_address:
            unused_floating_ip = floating_ip
            break

if not testing_instance_floating_ip and not unused_floating_ip:
    print('No free unused Floating IPs. Allocating new Floating IP...')
    public_network_id = conn.network.find_network('public').id
    try:
        unused_floating_ip = conn.network.create_ip(floating_network_id=public_network_id)
        unused_floating_ip = conn.network.get_ip(unused_floating_ip)
        print(unused_floating_ip)
    except exceptions.HttpException as e:
        print(e)

# step-14
if testing_instance_floating_ip:
    print('Instance ' + testing_instance.name + ' already has a public ip. Skipping attachment.')
else:
    for port in conn.network.ports():
        if port.device_id == testing_instance.id:
            testing_instance_port = port

    testing_instance_floating_ip = unused_floating_ip
    conn.network.add_ip_to_port(testing_instance_port, testing_instance_floating_ip)

# step-15
print('The Fractals app will be deployed to http://%s' % testing_instance_floating_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.