Link Search Menu Expand Document

Step 7: The first VM

Start

In the previous steps, we’ve learnt everything needed to create a VM.

On average, it’s more useful to create VMs as part of a stack, and to create these stacks via Heat or other automation tools like Terraform.

To make sure that we know the basics, this step is about creating a single VM manually.

Installation

The basic command to create a single VM is:

$ openstack server create test

If you execute this command as shown above, this error will be returned:

usage: openstack server create [-h] [-f {json,shell,table,value,yaml}]
                               [-c COLUMN] [--max-width <integer>]
                               [--print-empty] [--noindent] [--prefix PREFIX]
                               (--image <image> | --volume <volume>) --flavor
                               <flavor>
                               [--security-group <security-group-name>]
                               [--key-name <key-name>]
                               [--property <key=value>]
                               [--file <dest-filename=source-filename>]
                               [--user-data <user-data>]
                               [--availability-zone <zone-name>]
                               [--block-device-mapping <dev-name=mapping>]
                               [--nic <net-id=net-uuid,v4-fixed-ip=ip-addr,v6-fixed-ip=ip-addr,port-id=port-uuid,auto,none>]
                               [--hint <key=value>]
                               [--config-drive <config-drive-volume>|True]
                               [--min <count>] [--max <count>] [--wait]
                               <server-name>
openstack server create: error: argument --flavor is required

It tells us that we have not specified what flavor our VM should be.

To specify a flavor, we will need to add the flag --flavor with a flavor argument.

Let’s take a look at what flavours are available:

$ openstack flavor list
+--------------------------------------+------------+-------+------+-----------+-------+-----------+
| ID                                   | Name       |   RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+------------+-------+------+-----------+-------+-----------+
| 090bcc91-6207-465d-aff0-bfcc10a9e063 | m1.medium  |  8192 |   20 |         0 |     4 | True      |
| 4ade7a50-f829-4bf6-af15-266798ea8d6f | win.large  | 32768 |   80 |         0 |     8 | True      |
| 5dd72380-088e-48cd-9a18-112cb5a9cab5 | win.small  |  8192 |   80 |         0 |     2 | True      |
| 884d5b93-1467-4bc1-a445-ff7c74271cbd | m1.micro   |  1024 |   20 |         0 |     1 | True      |
| b7c4fa0b-7960-4311-a86b-507dbf58e8ac | m1.small   |  4096 |   20 |         0 |     2 | True      |
| d45e3029-8364-4e4c-beab-242e8b4622a3 | win.medium | 16384 |   80 |         0 |     4 | True      |
| dfead62e-96a8-46e9-bdae-342ecce32d41 | win.micro  |  2048 |   80 |         0 |     1 | True      |
| ed18c320-324a-487f-88e1-3e9eb9244509 | m1.large   | 16384 |   20 |         0 |     8 | True      |
+--------------------------------------+------------+-------+------+-----------+-------+-----------+

If we would add --flavor m1.micro to our command and execute it, it would still not work as OpenStack needs some more data before it has enough to start a new VM.

Besides flavor, we need to supply the key to be installed (--key-name), the operating system image to install (--image), what network the VM will run on (--network) and what security group needs to be applied to it (--security-group).

We already created a security group in a previous step, so we will need to acquire an image and a network to create our first VM.

Let’s take a look what images are already available:

$ openstack image list
+--------------------------------------+---------------------------------------+--------+
| ID                                   | Name                                  | Status |
+--------------------------------------+---------------------------------------+--------+
| fd8ad5aa-6b33-4198-a05d-8be42fc0f20e | CentOS 7 - Latest                     | active |
| 82242d21-d990-4fc2-92a5-c7bd7820e790 | Ubuntu 16.04 Xenial Xerus - Latest    | active |
| 8e82fd42-3d6f-44a7-9f20-92f5661823cf | Windows Server 2012 R2 Std - Latest   | active |
| 536c086c-d2a4-43dd-80ea-a9d05ee2b97f | Windows Server 2016 Std - Latest      | active |
| c94ced87-a03e-4eec-89f7-48f2c0ec6cd2 | debian-9.1.5-20170910-openstack-amd64 | active |
| b1195ddf-9336-42a7-a134-4f2e7ea57710 | iNNOVO-OPNsense-17.7.8                | active |
| 9134b6ed-8c5a-4a9a-907e-733dc2b5f0ef | iNNOVO_pfSense 2.3.4                  | active |
+--------------------------------------+---------------------------------------+--------+

Next up is to select a nework, let’s create a simple network with this command:

$ openstack network create BeispielNetzwerk
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2017-12-08T08:32:44Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | a783d691-7efe-4f67-9226-99a014fa8926 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| mtu                       | 1500                                 |
| name                      | BeispielNetzwerk                     |
| port_security_enabled     | True                                 |
| project_id                | b15cde70d85749689e08106f973bb002     |
| provider:network_type     | None                                 |
| provider:physical_network | None                                 |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 2                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| updated_at                | 2017-12-08T08:32:44Z                 |
+---------------------------+--------------------------------------+

Beware that this network has no internet connection, and no additional configuration, it is not something we would use for a VM we plan to actually use.

We will create a functional network in step 10.

Now to put everything together, and create an our VM. For this example, we will use the default security group, the Ubuntu 16.04 image (we’ll use the ID in the command line) and the previously created network and key:

$ openstack server create BeispielServer --flavor m1.small --key-name Beispiel --image 82242d21-d990-4fc2-92a5-c7bd7820e790 --network=BeispielNetzwerk --security-group default
+-----------------------------+--------------------------------------------------------+
| Field                       | Value                                                  |
+-----------------------------+--------------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL                                                 |
| OS-EXT-AZ:availability_zone | es1                                                    |
| OS-EXT-STS:power_state      | NOSTATE                                                |
| OS-EXT-STS:task_state       | scheduling                                             |
| OS-EXT-STS:vm_state         | building                                               |
| OS-SRV-USG:launched_at      | None                                                   |
| OS-SRV-USG:terminated_at    | None                                                   |
| accessIPv4                  |                                                        |
| accessIPv6                  |                                                        |
| addresses                   |                                                        |
| config_drive                |                                                        |
| created                     | 2017-12-06T14:15:02Z                                   |
| flavor                      | m1.small (676d2587-b5aa-49eb-998d-d91c1bd6c056)        |
| hostId                      |                                                        |
| id                          | 44ff2688-4ce5-417d-962b-3a80199bf1bc                   |
| image                       | cirros-tempest1 (2fbe66ef-adc8-44d0-b2e2-03d95dc36936) |
| key_name                    | cg                                                     |
| name                        | BeispielServer                                         |
| progress                    | 0                                                      |
| project_id                  | 1e775e2cc71a461991be42d4fad8a5cb                       |
| properties                  |                                                        |
| security_groups             | name='3265503b-ac24-4f60-a8d0-466b7c812916'            |
| status                      | BUILD                                                  |
| updated                     | 2017-12-06T14:15:02Z                                   |
| user_id                     | b54fda3f4d1a484797b3ad4de9b3f4f9                       |
| volumes_attached            |                                                        |
+-----------------------------+--------------------------------------------------------+

To see all the possible parameters during the creation of a VM, we can use --help:

$ openstack server create --help
usage: openstack server create [-h] [-f {json,shell,table,value,yaml}]
                               [-c COLUMN] [--max-width <integer>]
                               [--print-empty] [--noindent] [--prefix PREFIX]
                               (--image <image> | --volume <volume>) --flavor
                               <flavor>
                               [--security-group <security-group-name>]
                               [--key-name <key-name>]
                               [--property <key=value>]
                               [--file <dest-filename=source-filename>]
                               [--user-data <user-data>]
                               [--availability-zone <zone-name>]
                               [--block-device-mapping <dev-name=mapping>]
                               [--nic <net-id=net-uuid,v4-fixed-ip=ip-addr,v6-fixed-ip=ip-addr,port-id=port-uuid,auto,none>]
                               [--hint <key=value>]
                               [--config-drive <config-drive-volume>|True]
                               [--min <count>] [--max <count>] [--wait]
                               <server-name>

Create a new server

positional arguments:
  <server-name>         New server name

optional arguments:
  -h, --help            show this help message and exit
  --image <image>       Create server boot disk from this image (name or ID)
  --volume <volume>     Create server using this volume as the boot disk (name
                        or ID)
  --flavor <flavor>     Create server with this flavor (name or ID)
  --security-group <security-group-name>
                        Security group to assign to this server (name or ID)
                        (repeat option to set multiple groups)
  --key-name <key-name>
                        Keypair to inject into this server (optional
                        extension)
  --property <key=value>
                        Set a property on this server (repeat option to set
                        multiple values)
  --file <dest-filename=source-filename>
                        File to inject into image before boot (repeat option
                        to set multiple files)
  --user-data <user-data>
                        User data file to serve from the metadata server
  --availability-zone <zone-name>
                        Select an availability zone for the server
  --block-device-mapping <dev-name=mapping>
                        Map block devices; map is
                        <id>:<type>:<size(GB)>:<delete_on_terminate> (optional
                        extension)
  --nic <net-id=net-uuid,v4-fixed-ip=ip-addr,v6-fixed-ip=ip-addr,port-id=port-uuid,auto,none>
                        Create a NIC on the server. Specify option multiple
                        times to create multiple NICs. Either net-id or port-
                        id must be provided, but not both. net-id: attach NIC
                        to network with this UUID, port-id: attach NIC to port
                        with this UUID, v4-fixed-ip: IPv4 fixed address for
                        NIC (optional), v6-fixed-ip: IPv6 fixed address for
                        NIC (optional), none: (v2.37+) no network is attached,
                        auto: (v2.37+) the compute service will automatically
                        allocate a network. Specifying a --nic of auto or none
                        cannot be used with any other --nic value.
  --hint <key=value>    Hints for the scheduler (optional extension)
  --config-drive <config-drive-volume>|True
                        Use specified volume as the config drive, or 'True' to
                        use an ephemeral drive
  --min <count>         Minimum number of servers to launch (default=1)
  --max <count>         Maximum number of servers to launch (default=1)
  --wait                Wait for build to complete

output formatters:
  output formatter options

  -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                        the output format, defaults to table
  -c COLUMN, --column COLUMN
                        specify the column(s) to include, can be repeated

table formatter:
  --max-width <integer>
                        Maximum display width, <1 to disable. You can also use
                        the CLIFF_MAX_TERM_WIDTH environment variable, but the
                        parameter takes precedence.
  --print-empty         Print empty table if there is no data to show.

json formatter:
  --noindent            whether to disable indenting the JSON

shell formatter:
  a format a UNIX shell can parse (variable="value")

  --prefix PREFIX       add a prefix to all variable names

Conclusion

We have now created our first Instance, and used some basic OpenStack commands. In Step 8 we will delete this Instance.