Mulai

Mulai

Siapa yang harus membaca panduan ini?

Panduan ini untuk pengembang perangkat lunak berpengalaman yang ingin mengerahkan aplikasi ke awan OpenStack.

Jika Anda sudah familiar dengan OpenStack namun belum membuat aplikasi cloud secara umum atau aplikasi OpenStack pada khususnya, bagian ini mengajarkan Anda bagaimana memprogram dengan komponen OpenStack.

Apa yang akan kamu pelajari

Menerapkan aplikasi di lingkungan awan bisa sangat berbeda dengan menerapkannya di lingkungan TI tradisional. Panduan ini mengajarkan Anda cara menerapkan aplikasi pada OpenStack dan beberapa praktik terbaik untuk pengembangan aplikasi awan.

Gambaran umum

Tutorial ini menunjukkan dua aplikasi. Aplikasi pertama adalah generator fraktal sederhana yang menggunakan persamaan matematis untuk menghasilkan keindahan fractal images. Kami menunjukkan aplikasi ini secara keseluruhan sehingga Anda bisa membandingkannya dengan aplikasi kedua yang lebih kuat.

Aplikasi kedua adalah aplikasi OpenStack yang memungkinkan Anda untuk:

  • Buat dan hapus sumber daya komputasi. Sumber daya ini adalah instance mesin virtual tempat aplikasi Fractals berjalan.
  • Buat keputusan arsitektur cloud-related seperti mengubah fraction menjadi layanan micro-service dan memodulasinya.
  • Skala sumber daya yang tersedia naik dan turun.
  • Gunakan penyimpanan Object dan Block untuk file dan database persistence.
  • Gunakan layanan Orchestration untuk menyesuaikan diri secara otomatis dengan lingkungan.
  • Sesuaikan jaringan untuk kinerja dan segregasi yang lebih baik.
  • Jelajahi dan terapkan fitur awan OpenStack yang canggih.

Pilih SDK OpenStack Anda

Siapapun dengan latar belakang pemrograman dapat dengan mudah membaca kode dalam panduan ini. Meskipun panduan ini berfokus pada SDK tertentu, Anda dapat menggunakan bahasa dan toolkit lain dengan awan OpenStack:

OpenStack SDKs
Bahasa Nama Deskripsi URL
Python OpenStack SDK Perpustakaan berbasis Python yang resmi untuk OpenStack. https://docs.openstack.org/openstacksdk/latest/
Python Libcloud Perpustakaan berbasis Python yang dikelola Apache Foundation. Gunakan untuk bekerja dengan beberapa jenis awan. https://libcloud.readthedocs.org/en/latest/compute/drivers/openstack.html
Python Shade Perpustakaan berbasis Python yang dikembangkan oleh tim OpenStack Infra. Gunakan untuk mengoperasikan beberapa awan OpenStack. https://docs.openstack.org/infra/shade/
Java jClouds Perpustakaan berbasis Java yang dikelola Apache Foundation. Gunakan untuk bekerja dengan beberapa jenis awan. https://jclouds.apache.org/guides/openstack/
Ruby fog SDK berbasis Ruby. Gunakan untuk bekerja dengan beberapa awan. https://github.com/fog/fog-openstack/blob/master/docs/getting_started.md
node.js pkgcloud SDK berbasis Node.js. Gunakan bekerja dengan banyak awan. https://github.com/pkgcloud/pkgcloud/tree/master/docs/providers/openstack
PHP php-opencloud Sebuah perpustakaan berbasis PHP. Gunakan untuk menulis kode PHP yang bekerja dengan awan OpenStack. http://php-opencloud.readthedocs.org/en/latest/getting-started-with-openstack.html
.NET Framework OpenStack SDK untuk Microsoft .NET Perpustakaan berbasis .NET. Gunakan untuk menulis kode C ++ atau C # untuk aplikasi Microsoft. https://www.nuget.org/packages/openstack.net
Go gophercloud SDK berbasis go. Gunakan untuk menulis kode Golang yang bekerja dengan awan OpenStack. http://gophercloud.io/

Untuk daftar SDK yang tersedia, lihat Software Development Kits.

Versi lain dari panduan ini menunjukkan cara menggunakan SDK dan bahasa lainnya untuk menyelesaikan tugas ini. Jika Anda adalah pengembang untuk toolkit lain yang ingin disertakan dalam panduan ini, jangan ragu untuk mengirimkan cuplikan kode. Untuk informasi lebih lanjut, hubungi anggota OpenStack Documentation team.

Apa yang kau butuhkan

Kami berasumsi bahwa Anda sudah dapat mengakses awan OpenStack. Anda harus memiliki sebuah proyek, juga dikenal sebagai tenant (penyewa), dengan kuota minimal enam instance. Karena aplikasi Fractals berjalan di distribusi berbasis Ubuntu, Debian, Fedora, dan openSUSE, Anda harus membuat instance yang menggunakan salah satu dari sistem operasi ini.

Untuk berinteraksi dengan awan, Anda juga harus memiliki

a recent version of shade installed.

Catatan

Sebelum melanjutkan, pasang versi terbaru dari shade (naungan).

Dapatkan informasi berikut dari penyedia awan Anda:

  • auth URL
  • user name
  • password
  • ID atau nama proyek (proyek juga dikenal sebagai tenant/penyewa)
  • cloud region

Anda juga bisa mendownload file RC OpenStack dari dashboard Horizon OpenStack. Masuk ke dasbor dan klik Project->Access & Security->API Access->Download OpenStack RC file. Jika Anda menggunakan metode ini, perhatikan bahwa "URL auth" tidak termasuk jalurnya. Misalnya, jika file openrc.sh Anda menunjukkan:

export OS_AUTH_URL=http://controller:5000/v2.0

URL auth sebenarnya adalah:

http://controller:5000

Bagaimana Anda berinteraksi dengan OpenStack

Dalam tutorial ini, Anda berinteraksi dengan awan OpenStack Anda melalui SDK yang Anda pilih di "Choose your OpenStack SDK." Panduan ini mengasumsikan bahwa Anda tahu cara menjalankan code snippet (cuplikan kode) dalam bahasa pilihan Anda.

Catatan

Karena tutorialnya menggunakan kembali obyek conn, pastikan selalu ada yang berguna.

Gunakan kredensial Anda di atas untuk menentukan nama penyedia awan, nama pengguna, kata sandi, project_name dan region_name dalam file ~/.config/openstack/clouds.yml.

clouds:
    myfavoriteopenstack:
        auth:
            auth_url: https://controller:5000/
            username: $YOUR_USERNAME
            password: $YOUR_PASSWORD
            project_name: $YOUR_PROJECT
        region_name: $REGION

Catatan

Jika Anda menggunakan awan publik known by shade, Anda bisa menghindari menentukan auth_url: dan sebaliknya menentukan profile: $PROVIDER_NAME di file clouds.yml

Untuk mengkonfigurasi shade (naungan) menggunakan profil, gunakan kredensial Anda di atas untuk menentukan nama provider awan, nama pengguna, kata sandi, nama proyek, dan nama wilayah dalam file ~/.config/openstack/clouds.yml.

my-provider:
    profile: $PROVIDER_NAME
    auth:
        username: $YOUR_USERNAME
        password: $YOUR_PASSWORD
        project_name: $YOUR_PROJECT
    region_name: $REGION

Lihat configure shade, untuk mengkonfigurasi cloud Anda menggunakan profil.

from shade import *

simple_logging(debug=True)
conn = openstack_cloud(cloud='myfavoriteopenstack')

Flavor dan image

Untuk menjalankan aplikasi Anda, Anda harus meluncurkan sebuah instance. Contoh ini berfungsi sebagai mesin virtual.

Untuk meluncurkan sebuah instance, Anda memilih flavor dan image. Flavor mewakili ukuran instance, termasuk jumlah CPU dan jumlah RAM dan ruang disk. Image adalah instalasi OS yang disiapkan dari mana Anda mengkloning instance Anda. Saat Anda melakukan booting di awan publik, flavor yang lebih besar bisa lebih mahal daripada yang lebih kecil dari segi sumber daya dan biaya moneter.

Untuk daftar image yang tersedia di awan Anda, jalankan beberapa panggilan API:

images = conn.list_images()
for image in images:
    print(image)

Kode ini menghasilkan output seperti ini:

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

Anda juga bisa mendapatkan informasi tentang flavor yang tersedia:

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

Kode ini menghasilkan output seperti ini:

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

Flavor dan image Anda akan berbeda, tentu saja.

Pilih flavor dan image untuk instance Anda. Anda memerlukan RAM 1GB, 1 CPU, dan disk 1GB. Contoh ini menggunakan image Ubuntu dengan sedikit flavor, yang merupakan pilihan yang aman. Di bagian tutorial berikutnya dalam panduan ini, Anda harus mengubah ID image dan flavor agar sesuai dengan image dan flavor yang Anda pilih.

Jika image yang Anda inginkan tidak tersedia di awan Anda, biasanya Anda dapat mengunggahnya berdasarkan setelan kebijakan awan Anda. Untuk informasi tentang cara mengunggah image, lihat obtaining images.

Tetapkan variabel image dan ukuran ke nilai yang sesuai untuk awan Anda. Kami akan menggunakan variabel-variabel ini di bagian selanjutnya.

Pertama, beritahu koneksi untuk mendapatkan image tertentu dengan menggunakan ID image yang Anda pilih di bagian sebelumnya:

image_id = 'c55094e9-699c-4da9-95b4-2e2e75f4c66e'
image = conn.get_image(image_id)
print(image)

Kode ini menghasilkan output seperti ini:

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

Selanjutnya, beritahu script yang flavor ingin Anda gunakan:

Tentukan ID flavor yang ingin Anda gunakan.

flavor_id = '100'
flavor = conn.get_flavor(flavor_id)
print(flavor)

Kode ini menghasilkan output seperti ini:

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

Sekarang, Anda bisa meluncurkan instance.

Luncurkan sebuah instance

Gunakan flavor dan image pilihan Anda untuk membuat sebuah instance.

Catatan

Contoh pembuatan instance berikut mengasumsikan bahwa Anda memiliki jaringan single-tenant. Jika Anda menerima kesalahan'Exception: 400 Bad Request Multiple possible networks found, use a Network ID to be more specific', Anda memiliki beberapa jaringan multiple-tenant. Anda harus menambahkan parameter networks ke panggilan yang membuat server. Lihat Appendix untuk rinciannya.

Buat instance.

Catatan

SDK Anda mungkin memanggil instance 'node' atau 'server'.

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)

Jika Anda mendaftar instance yang ada:

instances = conn.list_servers()
for instance in instances:
    print(instance)

Instance baru muncul.

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

Sebelum melanjutkan, Anda harus melakukan satu hal lagi.

Hancurkan instance

Sumber daya awan, seperti instance yang tidak Anda gunakan lagi, bisa menghabiskan biaya. Untuk menghindari biaya tak terduga, hancurkan sumber daya awan.

conn.delete_server(name_or_id=instance_name)

Jika Anda mendaftar instance lagi, instance menghilang.

Biarkan shell Anda terbuka untuk menggunakannya pengerahan instance lain di bagian ini.

Terapkan aplikasi ke instance baru

Sekarang setelah Anda tahu cara membuat dan menghapus instance, Anda dapat menerapkan contoh aplikasi tersebut. Instance yang Anda buat untuk aplikasi ini mirip dengan instance pertama yang Anda buat, tapi kali ini, kami memperkenalkan beberapa konsep tambahan.

Catatan

Konektivitas internet dari instance awan Anda diperlukan untuk mendownload aplikasi.

Saat Anda membuat sebuah instance untuk aplikasi ini, Anda ingin memberikan sedikit informasi lebih banyak daripada yang Anda berikan pada instance kosong yang baru saja Anda buat dan hapus. Kami akan membahas lebih terperinci di bagian selanjutnya, tapi untuk saat ini, cukup buat sumber daya berikut sehingga Anda bisa memberi mereka instance:

  • Pasangan kunci Untuk mengakses instance Anda, Anda harus mengimpor kunci publik SSH ke OpenStack untuk membuat pasangan kunci. OpenStack menginstal pasangan kunci ini pada instance baru. Biasanya, kunci publik Anda ditulis ke .ssh/id_rsa.pub. Jika Anda tidak memiliki file kunci publik SSH, ikuti these instructions sebelumnya. Kami akan membahas instruksi ini secara mendalam Pengantar arsitektur aplikasi fraktal.

Pada contoh berikut, mengatur pub_key_file ke lokasi file kunci SSH publik Anda.

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)

  • Akses jaringan. Secara default, OpenStack menyaring semua lalu lintas. Anda harus membuat grup keamanan dan menerapkannya pada instance Anda. Grup keamanan mengizinkan akses HTTP dan SSH. Kami akan membahas lebih rinci Pengantar arsitektur aplikasi fraktal.
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)

  • Userdata (dara pengguna). Selama pembuatan instance, Anda dapat menyediakan userdata ke OpenStack untuk mengonfigurasi instance setelah booting. Layanan cloud-init menerapkan data pengguna ke sebuah instance. Anda harus melakukan pra-instal layanan cloud-init pada image yang Anda pilih. Kami akan membahas lebih rinci Pengantar arsitektur aplikasi fraktal.
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
'''

Sekarang, Anda bisa boot dan mengkonfigurasi instance.

Boot dan konfigurasikan sebuah instance

Gunakan image, flavor, key pair, dan userdata untuk membuat sebuah instance. Setelah Anda meminta instance, tunggulah untuk membangunnya.

Shade framework (kerangka teduh) dapat memilih dan menetapkan floating IP (IP apung) bebas dengan cepat

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)

Ketika instance boot, nilai variabel ex_userdata menginstruksikan instance untuk menerapkan aplikasi Fractals.

Mengaitkan IP terapung untuk konektivitas eksternal

Kami meliput networking secara rinci di Jaringan.

Untuk melihat aplikasi berjalan, Anda harus tahu di mana mencarinya. Secara default, instance Anda memiliki akses jaringan keluar. Untuk membuat instance Anda dapat dijangkau dari Internet, Anda memerlukan alamat IP. Secara default dalam beberapa kasus, instance Anda tersedia dengan alamat IP yang dapat digunakan secara publik. Dalam kasus ini, Anda melihat alamat IP yang tercantum di bawah public_ips atau` private_ips` saat Anda mencantumkan instance. Jika tidak, Anda harus membuat dan menghubungkan alamat IP mengambang ke instance Anda.

f_ip = conn.available_floating_ip()

Jalankan skrip untuk memulai pengerahan.

Akses aplikasi

Menyebarkan data dan konfigurasi aplikasi ke instance bisa memakan waktu lama. Pertimbangkan menikmati secangkir kopi sambil menunggu. Setelah aplikasi menyebar, Anda dapat menggunakan browser pilihan Anda untuk mengunjungi antarmuka grafis yang mempesona di link berikut.

print('The Fractals app will be deployed to http://%s' % f_ip['floating_ip_address'] )

Catatan

Jika Anda tidak menggunakan alamat IP mengambang, ganti alamat IP lain, jika sesuai.

screenshot of the webinterface

Langkah selanjutnya

Jangan khawatir jika konsep ini belum sepenuhnya jelas. Dalam Pengantar arsitektur aplikasi fraktal, kami mengeksplorasi konsep ini secara lebih rinci.

Sampel kode lengkap

File berikut berisi semua kode dari bagian tutorial ini. Sampel kode komprehensif ini memungkinkan Anda melihat dan menjalankan kode sebagai satu skrip.

Sebelum menjalankan skrip ini, konfirmasikan bahwa Anda telah menyetel informasi autentikasi, flavor ID, dan image ID.

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