Create VM with Salt Cloud without profile files

You read everywhere (and especially here) in Salt documentation that you need a profile file to create virtual machines in one of the supported clouds.

I found this approach not to be very dynamic.

It is actually not necessary to have profiles. There is a cloud runner, with a function create, dedicated to creating virtual machines. You can pass VM specifications in a pillar.

Your orchestration state /srv/salt/states/orch_vmware/createvm.sls:

{% from "maps/salt.yaml" import maps_salt with context %} {% from "maps/proxy.yaml" import maps_proxy with context %} {% from "maps/resolver.yaml" import maps_resolver with context %} # Retrieving VM specs {% set data = salt.pillar.get('event_data') %} # VM creation createvm: salt.runner: - name: cloud.create - provider: vmware - instances: {{ data.post['instances'] }} - clonefrom: {{ data.post['clonefrom'] }} - datastore: {{ data.post['datastore'] }} - num_cpu: {{ data.post['num_cpu'] }} - memory: {{ data.post['memory'] }} - datacenter: {{ data.post['datacenter'] }} - folder: {{ data.post['folder'] }} - cluster: {{ data.post['cluster'] }} - ssh_username: {{ data.post['ssh_username'] }} - password: {{ data.post['password'] }} - devices: network: Network adapter 1: name: {{ data.post['vlan'] }} adapter_type: vmxnet3 ip: {{ data.post['ip'] }} subnet_mask: {{ data.post['subnet_mask'] }} gateway: {{ data.post['gateway'] }} switch_type: standard - domain: {{ maps_resolver['search'] }} - dns_servers: {{ maps_resolver['dns'] }} - minion: master: {{ data.post['master'] }} - sync_after_install: all - display_ssh_output: False - script: bootstrap-salt - script_args: -H {{ maps_proxy['proxy'] }} stable {{ maps_salt['upstream-version'] }}.{{ maps_salt['upstream-version-patch'] }}

Instead of using the command salt-cloud, we use salt-run like this:

salt-run state.orchestrate orch_vmware.createvm \ 
	pillar="{event_data: {post: {master: 'master', instances: 'vmname', \
	clonefrom: 'redhat7', datastore: 'datastore1', num_cpu: 2, memory: 4096, \
	datacenter: 'level3', cluster: 'cluster1', vlan: 'VLAN10', ip: '192.168.1.10', \
	subnet_mask: '255.255.255.0', gateway: '192.168.1.1', ssh_username: 'root', \
	password: 'example'}}}"



Thanks for reading this post!


If you found an issue in this article, you can create an issue on Github.

If you have a comment or question, please drop me a line below!