Multiple instances in OpenStack CLI
I have been developing Infrastructure as code. Openstack is getting more powerful and popular everyday. You quickly get to a point when you need multiple instances. I am presently installing Openshift, which rfequires several instances. Here I will show you how to make multiple instances of the same size and flavor using Heat Stacks.
Basically all you need to do is to call your favorite heat stack from another heat stack that uses
OS::Heat::ResourceGroup .
Single Openstack Instance
First, here is a comprehensive stack that creates the single instance.
create-instance.yaml
heat_template_version: ocata description: > HOT template to create one small VM to test the compute deployment parameters: image: type: string default: 'rhel-server-7.5-update-4-x86_64-kvm.qcow2' flavor: type: string default: 'M5 Large' availability_zone: type: string default: nova net_mng: type: string default: YOUR-NETWORK net_data: type: string default: None key_name: type: string default: YOUR-KEY conditions: have_data: {not: {equals: [{get_param: net_data}, "None"]}} resources: vm_name: type: OS::Heat::Value properties: type: string value: {get_param: 'OS::stack_name'} fw_open_ping_ssh: type: OS::Neutron::SecurityGroup properties: name: fw_open_ping_ssh description: Ping and SSH rules: - protocol: icmp - protocol: tcp port_range_min: 1 port_range_max: 65535 mng_port: type: OS::Neutron::Port properties: network: {get_param: net_mng} name: list_join: ['-', [{get_attr: [vm_name, value]}, 'mng']] data_port: type: OS::Neutron::Port condition: have_data properties: network: {get_param: net_data} binding:vnic_type: direct port_security_enabled: false name: list_join: ['-', [{get_attr: [vm_name, value]}, 'data']] ports: type: OS::Heat::Value properties: type: comma_delimited_list value: filter: - ["none"] - - {get_resource: mng_port} - if: - "have_data" - {get_resource: data_port} - "none" hostname_config: type: OS::Heat::CloudConfig properties: cloud_config: merge_how: 'dict(recurse_array,no_replace)+list(append)' hostname: str_replace: params: hostname: {get_attr: [vm_name, value]} template: hostname server_init: type: OS::Heat::MultipartMime properties: parts: - config: {get_resource: hostname_config} server: type: OS::Nova::Server properties: image: {get_param: image} flavor: {get_param: flavor} availability_zone: {get_param: availability_zone} name: {get_attr: [vm_name, value]} networks: repeat: for_each: <%port%>: {get_attr: [ports, value]} template: port: <%port%> permutations: false config_drive: true key_name: {get_param: key_name} user_data_format: RAW user_data: {get_resource: server_init}
You can launch this with the CLI command:
openstack stack create --template create-instance.yaml STACK-NAME --wait
Create Mutiple Instances
When you desire multiple instances run this as a nested stack from another template.
multiple-instances.yaml
heat_template_version: 2013-05-23 resources: rg: type: OS::Heat::ResourceGroup properties: count: 5 resource_def: {type: create-instance.yaml}
Note that the last line calls the name of your file that launches the single instance.
You can replace “count” and “resource_def” with parameters called from CLI, but here we just fil them in the template.
To launch 5 instances from your cli via ssh.
openstack stack create --template multiple-instances.yaml YOUR-STACKNAME --wait
Be careful not give too long a stack name since Openstack will add to the a number followed by a random string to each server name.