{"id":36757,"date":"2025-01-21T15:14:31","date_gmt":"2025-01-21T14:14:31","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=36757"},"modified":"2025-01-23T08:22:54","modified_gmt":"2025-01-23T07:22:54","slug":"creating-your-private-cloud-using-openstack-4-the-image-and-placement-services","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/","title":{"rendered":"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services"},"content":{"rendered":"\n<p>By the end of the <a href=\"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-3-keystone-the-identity-service\/\" target=\"_blank\" rel=\"noreferrer noopener\">last post<\/a> we finally got the first OpenStack service up and running: Keystone, the Identity Service. Going back to the list of <a href=\"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-1-introduction\/\" target=\"_blank\" rel=\"noreferrer noopener\">services we need at a minimum<\/a>, this still leaves us with some more to setup:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.openstack.org\/keystone\/latest\/\" target=\"_blank\" rel=\"noreferrer noopener\">Keystone<\/a>: Identity service (done)<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.openstack.org\/glance\/latest\/\" target=\"_blank\" rel=\"noreferrer noopener\">Glance<\/a>: Image service<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.openstack.org\/placement\/latest\/\" target=\"_blank\" rel=\"noreferrer noopener\">Placement<\/a>: Placement service<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.openstack.org\/nova\/latest\/\" target=\"_blank\" rel=\"noreferrer noopener\">Nova<\/a>: Compute service<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.openstack.org\/neutron\/latest\/\" target=\"_blank\" rel=\"noreferrer noopener\">Neutron<\/a>: Network service<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.openstack.org\/horizon\/latest\/\" target=\"_blank\" rel=\"noreferrer noopener\">Horizon<\/a>: The OpenStack dashboard<\/li>\n<\/ul>\n\n\n\n<p>In this post we&#8217;ll setup the Image Service (Glance) and the Placement service. The Glance service is responsible for providing virtual machine images and enables users to discover, register, and retrieve them. Glance (as well as Keystone) exposes an API to query image metadata and to retrieve images.<\/p>\n\n\n\n<p>There are several options for storing those virtual machine images (including block storage), but to keep this as simple as possible we&#8217;ll use a directory on the controller node.<\/p>\n\n\n\n<p>Before we start, this is how our setup looks like currently:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"416\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1-1024x416.png\" alt=\"\" class=\"wp-image-36759\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1-1024x416.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1-300x122.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1-768x312.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1.png 1298w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>We&#8217;ve done almost all the work on the controller node, and Glance is no exception to that. As with Keystone, Glance needs to store some stuff in PostgreSQL (remember that you also could use MySQL or SQLite), in this case metadata about the images. Very much the same as we did it for Keystone, we&#8217;ll create a dedicated user and database for that:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,3,5]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ su - postgres -c &quot;psql -c \\&quot;create user glance with login password &#039;admin&#039;\\&quot;&quot;\nCREATE ROLE\n&#x5B;root@controller ~]$ su - postgres -c &quot;psql -c &#039;create database glance with owner=glance&#039;&quot;\nCREATE DATABASE\n&#x5B;root@controller ~]$ su - postgres -c &quot;psql -l&quot;\n                                                       List of databases\n   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | ICU Locale | ICU Rules |   Access privileges   \n-----------+----------+----------+-----------------+-------------+-------------+------------+-----------+-----------------------\n glance    | glance   | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | \n keystone  | keystone | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | \n postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | \n template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =c\/postgres          +\n           |          |          |                 |             |             |            |           | postgres=CTc\/postgres\n template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =c\/postgres          +\n           |          |          |                 |             |             |            |           | postgres=CTc\/postgres\n(5 rows)\n<\/pre><\/div>\n\n\n<p>The next step is creating the Glance service credentials:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,2,18]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ . admin-openrc\n&#x5B;root@controller ~]$ openstack user create --domain default --password-prompt glance\nUser Password:\nRepeat User Password:\nNo password was supplied, authentication will fail when a user does not have a password.\n+---------------------+----------------------------------+\n| Field               | Value                            |\n+---------------------+----------------------------------+\n| default_project_id  | None                             |\n| domain_id           | default                          |\n| email               | None                             |\n| enabled             | True                             |\n| id                  | eea5924c69c040428c5c4ef82f46c61b |\n| name                | glance                           |\n| description         | None                             |\n| password_expires_at | None                             |\n+---------------------+----------------------------------+\n&#x5B;root@controller ~]$  openstack service create --name glance --description &quot;OpenStack Image&quot; image\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| id          | db04f3f7c7014eb7883e074625d31391 |\n| name        | glance                           |\n| type        | image                            |\n| enabled     | True                             |\n| description | OpenStack Image                  |\n+-------------+----------------------------------+\n<\/pre><\/div>\n\n\n<p>Create the endpoints:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,15,29]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ openstack endpoint create --region RegionOne image public http:\/\/controller:9292\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | bde2499cd6c34c19aa221d64b9d0f2a0 |\n| interface    | public                           |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | db04f3f7c7014eb7883e074625d31391 |\n| service_name | glance                           |\n| service_type | image                            |\n| url          | http:\/\/controller:9292           |\n+--------------+----------------------------------+\n&#x5B;root@controller ~]$ openstack endpoint create --region RegionOne image internal http:\/\/controller:9292\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | 046e64889cda43c2bfc36471e40a7a2d |\n| interface    | internal                         |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | db04f3f7c7014eb7883e074625d31391 |\n| service_name | glance                           |\n| service_type | image                            |\n| url          | http:\/\/controller:9292           |\n+--------------+----------------------------------+\n&#x5B;root@controller ~]$ openstack endpoint create --region RegionOne image admin http:\/\/controller:9292\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | c8ddc792772048a18179877355fdbd3f |\n| interface    | admin                            |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | db04f3f7c7014eb7883e074625d31391 |\n| service_name | glance                           |\n| service_type | image                            |\n| url          | http:\/\/controller:9292           |\n+--------------+----------------------------------+\n<\/pre><\/div>\n\n\n<p>Install the operating system package:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ dnf install openstack-glance -y\n<\/pre><\/div>\n\n\n<p>And finally the configuration of the Glance API service:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1]; title: ; notranslate\" title=\"\">\n&#x5B;root@ostack-controller ~]$ egrep -v &quot;^#|^$&quot; \/etc\/glance\/glance-api.conf\n&#x5B;DEFAULT]\nenabled_backends=fs:file\n&#x5B;barbican]\n&#x5B;barbican_service_user]\n&#x5B;cinder]\n&#x5B;cors]\n&#x5B;database]\nconnection = postgresql+psycopg2:\/\/glance:admin@localhost\/glance\n&#x5B;file]\n&#x5B;glance.store.http.store]\n&#x5B;glance.store.rbd.store]\n&#x5B;glance.store.s3.store]\n&#x5B;glance.store.swift.store]\n&#x5B;glance.store.vmware_datastore.store]\n&#x5B;glance_store]\ndefault_backend = fs\n&#x5B;healthcheck]\n&#x5B;image_format]\n&#x5B;key_manager]\n&#x5B;keystone_authtoken]\nwww_authenticate_uri  = http:\/\/controller:5000\nauth_url = http:\/\/controller:5000\nmemcached_servers = controller:11211\nauth_type = password\nproject_domain_name = Default\nuser_domain_name = Default\nproject_name = service\nusername = glance\npassword = admin\n&#x5B;os_brick]\n&#x5B;oslo_concurrency]\n&#x5B;oslo_limit]\nauth_url = http:\/\/controller:5000\nauth_type = password\nuser_domain_id = default\nusername = glance\nsystem_scope = all\npassword = admin\nendpoint_id = 1e7748b2d7d44fb6a0c17edb3c68c4de\nregion_name = RegionOne\n&#x5B;oslo_messaging_amqp]\n&#x5B;oslo_messaging_kafka]\n&#x5B;oslo_messaging_notifications]\n&#x5B;oslo_messaging_rabbit]\n&#x5B;oslo_middleware]\n&#x5B;oslo_policy]\n&#x5B;oslo_reports]\n&#x5B;paste_deploy]\nflavor = keystone\n&#x5B;profiler]\n&#x5B;task]\n&#x5B;taskflow_executor]\n&#x5B;vault]\n&#x5B;wsgi]\n&#x5B;fs]\nfilesystem_store_datadir = \/var\/lib\/glance\/images\/\n<\/pre><\/div>\n\n\n<p>The endpoint_id is the public image endpoint ID:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ openstack endpoint list --service glance --region RegionOne\n+----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------+\n| ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                    |\n+----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------+\n| bde2499cd6c34c19aa221d64b9d0f2a0 | RegionOne | glance       | image        | True    | public    | http:\/\/controller:9292 |\n| 046e64889cda43c2bfc36471e40a7a2d | RegionOne | glance       | image        | True    | internal  | http:\/\/controller:9292 |\n| c8ddc792772048a18179877355fdbd3f | RegionOne | glance       | image        | True    | admin     | http:\/\/controller:9292 |\n+----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------+\n<\/pre><\/div>\n\n\n<p>Make sure that the glance account has reader access to system-scope resources (like limits):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ openstack role add --user glance --user-domain Default --system all reader\n<\/pre><\/div>\n\n\n<p>Populate the Image service database:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ \/bin\/sh -c &quot;glance-manage db_sync&quot; glance\n2025-01-20 14:20:25.319 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.319 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\n2025-01-20 14:20:25.327 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.328 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\n2025-01-20 14:20:25.340 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.340 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\n2025-01-20 14:20:25.350 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade  -&gt; liberty, liberty initial\n2025-01-20 14:20:25.526 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade liberty -&gt; mitaka01, add index on created_at and updated_at columns of &#039;images&#039; table\n2025-01-20 14:20:25.534 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade mitaka01 -&gt; mitaka02, update metadef os_nova_server\n2025-01-20 14:20:25.571 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade mitaka02 -&gt; ocata_expand01, add visibility to images\n2025-01-20 14:20:25.575 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade ocata_expand01 -&gt; pike_expand01, empty expand for symmetry with pike_contract01\n2025-01-20 14:20:25.576 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade pike_expand01 -&gt; queens_expand01\n2025-01-20 14:20:25.576 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade queens_expand01 -&gt; rocky_expand01, add os_hidden column to images table\n2025-01-20 14:20:25.580 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade rocky_expand01 -&gt; rocky_expand02, add os_hash_algo and os_hash_value columns to images table\n2025-01-20 14:20:25.584 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade rocky_expand02 -&gt; train_expand01, empty expand for symmetry with train_contract01\n2025-01-20 14:20:25.585 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade train_expand01 -&gt; ussuri_expand01, empty expand for symmetry with ussuri_expand01\n2025-01-20 14:20:25.586 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade ussuri_expand01 -&gt; wallaby_expand01, add image_id, request_id, user columns to tasks table&quot;\n2025-01-20 14:20:25.598 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade wallaby_expand01 -&gt; xena_expand01, empty expand for symmetry with 2023_1_expand01\n2025-01-20 14:20:25.600 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade xena_expand01 -&gt; yoga_expand01, empty expand for symmetry with 2023_1_expand01\n2025-01-20 14:20:25.602 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade yoga_expand01 -&gt; zed_expand01, empty expand for symmetry with 2023_1_expand01\n2025-01-20 14:20:25.603 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade zed_expand01 -&gt; 2023_1_expand01, empty expand for symmetry with 2023_1_expand01\n2025-01-20 14:20:25.605 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade 2023_1_expand01 -&gt; 2024_1_expand01, adds cache_node_reference and cached_images table(s)\n2025-01-20 14:20:25.677 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.677 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\nUpgraded database to: 2024_1_expand01, current revision(s): 2024_1_expand01\n2025-01-20 14:20:25.681 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.681 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\n2025-01-20 14:20:25.684 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.684 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\nDatabase migration is up to date. No migration needed.\n2025-01-20 14:20:25.692 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.692 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\n2025-01-20 14:20:25.699 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.699 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\n2025-01-20 14:20:25.702 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade mitaka02 -&gt; ocata_contract01, remove is_public from images\n2025-01-20 14:20:25.705 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade ocata_contract01 -&gt; pike_contract01, drop glare artifacts tables\n2025-01-20 14:20:25.711 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade pike_contract01 -&gt; queens_contract01\n2025-01-20 14:20:25.711 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade queens_contract01 -&gt; rocky_contract01\n2025-01-20 14:20:25.712 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade rocky_contract01 -&gt; rocky_contract02\n2025-01-20 14:20:25.712 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade rocky_contract02 -&gt; train_contract01\n2025-01-20 14:20:25.712 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade train_contract01 -&gt; ussuri_contract01\n2025-01-20 14:20:25.713 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade ussuri_contract01 -&gt; wallaby_contract01\n2025-01-20 14:20:25.713 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade wallaby_contract01 -&gt; xena_contract01\n2025-01-20 14:20:25.713 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade xena_contract01 -&gt; yoga_contract01\n2025-01-20 14:20:25.714 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade yoga_contract01 -&gt; zed_contract01\n2025-01-20 14:20:25.714 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade zed_contract01 -&gt; 2023_1_contract01\n2025-01-20 14:20:25.715 35181 INFO alembic.runtime.migration &#x5B;-] Running upgrade 2023_1_contract01 -&gt; 2024_1_contract01\n2025-01-20 14:20:25.717 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.717 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\nUpgraded database to: 2024_1_contract01, current revision(s): 2024_1_contract01\n2025-01-20 14:20:25.719 35181 INFO alembic.runtime.migration &#x5B;-] Context impl PostgresqlImpl.\n2025-01-20 14:20:25.719 35181 INFO alembic.runtime.migration &#x5B;-] Will assume transactional DDL.\nDatabase is synced successfully.\n\n<\/pre><\/div>\n\n\n<p>Create the policy definition to allow creating an image:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ cat \/etc\/glance\/policy.yaml \n{\n    &quot;default&quot;: &quot;&quot;,\n    &quot;add_image&quot;: &quot;role:admin&quot;,\n    &quot;modify_image&quot;: &quot;role:admin&quot;,\n    &quot;delete_image&quot;: &quot;role:admin&quot;\n}\n<\/pre><\/div>\n\n\n<p>Enable and start the service:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,2]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ systemctl enable openstack-glance-api.service\n&#x5B;root@controller ~]$ systemctl start openstack-glance-api.service\n<\/pre><\/div>\n\n\n<p>Verify operation of the Image service using <a href=\"https:\/\/github.com\/cirros-dev\/cirros\" target=\"_blank\" rel=\"noreferrer noopener\">CirrOS<\/a>, a small Linux image that helps you test your OpenStack deployment:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,2,3,4,31]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ mkdir -p \/var\/cache\/glance\/api\/\n&#x5B;root@controller ~]$ . admin-openrc\n&#x5B;root@controller ~]$ wget http:\/\/download.cirros-cloud.net\/0.4.0\/cirros-0.4.0-x86_64-disk.img\n&#x5B;root@controller ~]$ glance image-create --name &quot;cirros&quot; --file cirros-0.4.0-x86_64-disk.img   --disk-format qcow2 --container-format bare   --visibility=public\n+------------------+----------------------------------------------------------------------------------+\n| Property         | Value                                                                            |\n+------------------+----------------------------------------------------------------------------------+\n| checksum         | 443b7623e27ecf03dc9e01ee93f67afe                                                 |\n| container_format | bare                                                                             |\n| created_at       | 2025-01-20T14:15:21Z                                                             |\n| disk_format      | qcow2                                                                            |\n| id               | 150fd48b-8ed4-4170-ad98-213d9eddcba0                                             |\n| min_disk         | 0                                                                                |\n| min_ram          | 0                                                                                |\n| name             | cirros                                                                           |\n| os_hash_algo     | sha512                                                                           |\n| os_hash_value    | 6513f21e44aa3da349f248188a44bc304a3653a04122d8fb4535423c8e1d14cd6a153f735bb0982e |\n|                  | 2161b5b5186106570c17a9e58b64dd39390617cd5a350f78                                 |\n| os_hidden        | False                                                                            |\n| owner            | 920bf34a6c88454f90d405124ca1076d                                                 |\n| protected        | False                                                                            |\n| size             | 12716032                                                                         |\n| status           | active                                                                           |\n| stores           | fs                                                                               |\n| tags             | &#x5B;]                                                                               |\n| updated_at       | 2025-01-20T14:15:22Z                                                             |\n| virtual_size     | 46137344                                                                         |\n| visibility       | public                                                                           |\n+------------------+----------------------------------------------------------------------------------+\n\n&#x5B;root@controller ~]$ glance image-list\n+--------------------------------------+--------+\n| ID                                   | Name   |\n+--------------------------------------+--------+\n| 150fd48b-8ed4-4170-ad98-213d9eddcba0 | cirros |\n+--------------------------------------+--------+\n<\/pre><\/div>\n\n\n<p>Fine, the image is available and now we have this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"476\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack8-1024x476.png\" alt=\"\" class=\"wp-image-36766\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack8-1024x476.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack8-300x139.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack8-768x357.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack8.png 1261w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The next service we need to deploy is the Placement service. This service is used by other services to manage and allocate their resources. Like the Keystone and Glance service, this service needs the database backend:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,3,5]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ su - postgres -c &quot;psql -c \\&quot;create user placement with login password &#039;admin&#039;\\&quot;&quot;\nCREATE ROLE\n&#x5B;root@controller ~]$ su - postgres -c &quot;psql -c &#039;create database placement with owner=placement&#039;&quot;\nCREATE DATABASE\n&#x5B;root@controller ~]$ su - postgres -c &quot;psql -l&quot;\n                                                        List of databases\n   Name    |   Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | ICU Locale | ICU Rules |   Access privileges   \n-----------+-----------+----------+-----------------+-------------+-------------+------------+-----------+-----------------------\n glance    | glance    | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | \n keystone  | keystone  | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | \n placement | placement | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | \n postgres  | postgres  | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | \n template0 | postgres  | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =c\/postgres          +\n           |           |          |                 |             |             |            |           | postgres=CTc\/postgres\n template1 | postgres  | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           | =c\/postgres          +\n           |           |          |                 |             |             |            |           | postgres=CTc\/postgres\n(6 rows)\n\n<\/pre><\/div>\n\n\n<p>In the same way as with the Glance service, the user, role, service and endpoints need to be created:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,2,18,19,30,45,60]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ . admin-openrc\n&#x5B;root@controller ~]$ openstack user create --domain default --password-prompt placement\nUser Password:\nRepeat User Password:\nNo password was supplied, authentication will fail when a user does not have a password.\n+---------------------+----------------------------------+\n| Field               | Value                            |\n+---------------------+----------------------------------+\n| default_project_id  | None                             |\n| domain_id           | default                          |\n| email               | None                             |\n| enabled             | True                             |\n| id                  | 9d1de7fda54a441b9c1289f8dc520e2b |\n| name                | placement                        |\n| description         | None                             |\n| password_expires_at | None                             |\n+---------------------+----------------------------------+\n&#x5B;root@controller ~]$ openstack role add --project service --user placement admin\n&#x5B;root@controller ~]$ openstack service create --name placement --description &quot;Placement API&quot; placement\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| id          | 43865e881fb84730b2bfc7c099c8038d |\n| name        | placement                        |\n| type        | placement                        |\n| enabled     | True                             |\n| description | Placement API                    |\n+-------------+----------------------------------+\n\n&#x5B;root@controller ~]$ openstack endpoint create --region RegionOne placement public http:\/\/controller:8778\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | 5dac42d9532e4fd7b34a8e990ec5d408 |\n| interface    | public                           |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | 43865e881fb84730b2bfc7c099c8038d |\n| service_name | placement                        |\n| service_type | placement                        |\n| url          | http:\/\/controller:8778           |\n+--------------+----------------------------------+\n\n&#x5B;root@controller ~]$ openstack endpoint create --region RegionOne placement internal http:\/\/controller:8778\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | 535c652f6e654f56843076cf91a0fe84 |\n| interface    | internal                         |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | 43865e881fb84730b2bfc7c099c8038d |\n| service_name | placement                        |\n| service_type | placement                        |\n| url          | http:\/\/controller:8778           |\n+--------------+----------------------------------+\n\n&#x5B;root@controller ~]$ openstack endpoint create --region RegionOne placement admin http:\/\/controller:8778\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | 58370b01f8904e1f8aab8c718c8a4cb6 |\n| interface    | admin                            |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | 43865e881fb84730b2bfc7c099c8038d |\n| service_name | placement                        |\n| service_type | placement                        |\n| url          | http:\/\/controller:8778           |\n+--------------+----------------------------------+\n<\/pre><\/div>\n\n\n<p>Install the package which brings the Placement API and configure the service:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,2]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ dnf install openstack-placement-api -y\n&#x5B;root@controller ~]$ egrep -v &quot;^#|^$&quot; \/etc\/placement\/placement.conf\n&#x5B;DEFAULT]\n&#x5B;api]\nauth_strategy = keystone\n&#x5B;cors]\n&#x5B;keystone_authtoken]\nauth_url = http:\/\/controller:5000\/v3\nmemcached_servers = controller:11211\nauth_type = password\nproject_domain_name = Default\nuser_domain_name = Default\nproject_name = service\nusername = placement\npassword = admin\nwww_authenticate_uri  = http:\/\/controller:5000\n&#x5B;oslo_middleware]\n&#x5B;oslo_policy]\n&#x5B;placement]\n&#x5B;placement_database]\nconnection = postgresql+psycopg2:\/\/placement:admin@localhost\/placement\n&#x5B;profiler]\n&#x5B;profiler_jaeger]\n&#x5B;profiler_otlp]\n<\/pre><\/div>\n\n\n<p>Populate the database (this does not produce any output if successful):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ sh -c &quot;placement-manage db sync&quot; placement\n<\/pre><\/div>\n\n\n<p>&#8230; and restart the web server after adding this block:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&amp;lt;Directory \/usr\/bin&amp;gt;\n   &amp;lt;IfVersion &amp;gt;= 2.4&amp;gt;\n      Require all granted\n   &amp;lt;\/IfVersion&amp;gt;\n   &amp;lt;IfVersion &amp;lt; 2.4&amp;gt;\n      Order allow,deny\n      Allow from all\n   &amp;lt;\/IfVersion&amp;gt;\n&amp;lt;\/Directory&amp;gt;\n<\/pre><\/div>\n\n\n<p>&#8230; to the end of &#8220;\/etc\/httpd\/conf.d\/00-placement-api.conf&#8221;.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; highlight: [1]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ systemctl restart httpd\n<\/pre><\/div>\n\n\n<p>If all went fine and was configured correctly, the service can be verified to be working with:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,17,18]; title: ; notranslate\" title=\"\">\n&#x5B;root@controller ~]$ placement-status upgrade check\n+-------------------------------------------+\n| Upgrade Check Results                     |\n+-------------------------------------------+\n| Check: Missing Root Provider IDs          |\n| Result: Success                           |\n| Details: None                             |\n+-------------------------------------------+\n| Check: Incomplete Consumers               |\n| Result: Success                           |\n| Details: None                             |\n+-------------------------------------------+\n| Check: Policy File JSON to YAML Migration |\n| Result: Success                           |\n| Details: None                             |\n\n&#x5B;root@controller ~]$ dnf install python3-osc-placement -y\n&#x5B;root@controller ~]$ openstack --os-placement-api-version 1.2 resource class list\n+----------------------------------------+\n| name                                   |\n+----------------------------------------+\n| VCPU                                   |\n| MEMORY_MB                              |\n| DISK_GB                                |\n| PCI_DEVICE                             |\n| SRIOV_NET_VF                           |\n| NUMA_SOCKET                            |\n| NUMA_CORE                              |\n| NUMA_THREAD                            |\n| NUMA_MEMORY_MB                         |\n| IPV4_ADDRESS                           |\n| VGPU                                   |\n| VGPU_DISPLAY_HEAD                      |\n| NET_BW_EGR_KILOBIT_PER_SEC             |\n| NET_BW_IGR_KILOBIT_PER_SEC             |\n| PCPU                                   |\n| MEM_ENCRYPTION_CONTEXT                 |\n| FPGA                                   |\n| PGPU                                   |\n| NET_PACKET_RATE_KILOPACKET_PER_SEC     |\n| NET_PACKET_RATE_EGR_KILOPACKET_PER_SEC |\n| NET_PACKET_RATE_IGR_KILOPACKET_PER_SEC |\n+----------------------------------------+\n<\/pre><\/div>\n\n\n<p>Fine, now we have the Image and Placement service up and running and our setup looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"420\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack10-1024x420.png\" alt=\"\" class=\"wp-image-36777\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack10-1024x420.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack10-300x123.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack10-768x315.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack10.png 1113w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-5-the-compute-service\/\" target=\"_blank\" rel=\"noreferrer noopener\">In the next post we&#8217;ll continue with setting up the compute service (Nova).<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>By the end of the last post we finally got the first OpenStack service up and running: Keystone, the Identity Service. Going back to the list of services we need at a minimum, this still leaves us with some more to setup: In this post we&#8217;ll setup the Image Service (Glance) and the Placement service. [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[955,1320,83],"tags":[135,73,957,77],"type_dbi":[],"class_list":["post-36757","post","type-post","status-publish","format-standard","hentry","category-cloud","category-devops","category-postgresql","tag-cloud","tag-linux","tag-openstack","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services\" \/>\n<meta property=\"og:description\" content=\"By the end of the last post we finally got the first OpenStack service up and running: Keystone, the Identity Service. Going back to the list of services we need at a minimum, this still leaves us with some more to setup: In this post we&#8217;ll setup the Image Service (Glance) and the Placement service. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-21T14:14:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-23T07:22:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1298\" \/>\n\t<meta property=\"og:image:height\" content=\"527\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services\",\"datePublished\":\"2025-01-21T14:14:31+00:00\",\"dateModified\":\"2025-01-23T07:22:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/\"},\"wordCount\":471,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/01\\\/ostack7-1-1024x416.png\",\"keywords\":[\"Cloud\",\"Linux\",\"openstack\",\"PostgreSQL\"],\"articleSection\":[\"Cloud\",\"DevOps\",\"PostgreSQL\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/\",\"name\":\"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/01\\\/ostack7-1-1024x416.png\",\"datePublished\":\"2025-01-21T14:14:31+00:00\",\"dateModified\":\"2025-01-23T07:22:54+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/01\\\/ostack7-1.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/01\\\/ostack7-1.png\",\"width\":1298,\"height\":527},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\\\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/westermanndanie\"],\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/daniel-westermann\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/","og_locale":"en_US","og_type":"article","og_title":"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services","og_description":"By the end of the last post we finally got the first OpenStack service up and running: Keystone, the Identity Service. Going back to the list of services we need at a minimum, this still leaves us with some more to setup: In this post we&#8217;ll setup the Image Service (Glance) and the Placement service. [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/","og_site_name":"dbi Blog","article_published_time":"2025-01-21T14:14:31+00:00","article_modified_time":"2025-01-23T07:22:54+00:00","og_image":[{"width":1298,"height":527,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1.png","type":"image\/png"}],"author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services","datePublished":"2025-01-21T14:14:31+00:00","dateModified":"2025-01-23T07:22:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/"},"wordCount":471,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1-1024x416.png","keywords":["Cloud","Linux","openstack","PostgreSQL"],"articleSection":["Cloud","DevOps","PostgreSQL"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/","url":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/","name":"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1-1024x416.png","datePublished":"2025-01-21T14:14:31+00:00","dateModified":"2025-01-23T07:22:54+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/01\/ostack7-1.png","width":1298,"height":527},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/creating-your-private-cloud-using-openstack-4-the-image-and-placement-services\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Creating your private cloud using OpenStack \u2013 (4) \u2013 The Image and Placement services"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/36757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=36757"}],"version-history":[{"count":19,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/36757\/revisions"}],"predecessor-version":[{"id":36831,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/36757\/revisions\/36831"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=36757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=36757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=36757"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=36757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}