FYI - http://docs.openstack.org/api/openstack-compute/2/content/POST_multiple-create-v2_createServer__v2__tenant_id__servers_ext-os-multi-server-create.html
To get exact_count semantics, set min_count and max_count to the same value. This is part of the public OpenStack API. Cheers, Bob On Friday, 18 July 2014 14:19:36 UTC-4, Michael DeHaan wrote: > > I'm not sure why you think add_host needs to run in parallel, it completes > in almost zero time since it's just doing some internal inventory "math". > > That all being said, what we really want is OpenStack's module having the > equivalent of exact_count in AWS/Rax other (though the Rackspace > implementation is a bit more low level). > > > > > On Fri, Jul 18, 2014 at 10:33 AM, Tony Kinsley <[email protected] > <javascript:>> wrote: > >> So I currently have an inventory script that creates me "fake" devices >> which I run the nova_compute task against. This allows me to provision all >> the vms in parallel using the native parallelization that ansible provides >> which is nice cause I can set it up to only provision 10 - 20 vms at a time >> using the serial flag. >> >> So this method provisions the VMs great, but since the "fake" devices do >> not have connection information I cannot use any other modules later in the >> playbook. I am trying to add these newly created VMs to a new group using >> the add_host module but I cannot get it to add more than one device to the >> running inventory. >> >> - name: spawn vms >> local_action: >> module: nova_compute >> name: {{ vm_name }} >> ... >> register: nova >> >> - name: add new hosts >> local_action: >> module: add_hosts >> name: {{ nova.private_ip }} >> >> >> >> I saw the fake device approach on another thread and liked the ability to >> use ansible to throttle my provisioning as well as choose the names for the >> vms. I was wondering though if it would be possible to update host with the >> connection information ( specifically the ansible_ssh_host, >> ansible_ssh_private_key_file, and whatever variable specifies how to >> connect to the host ) rather than creating new hosts. >> >> I also am stuck trying to get add_hosts to get all of my hosts. I assumed >> that add_hosts would also run in parallel but after searching around all of >> the examples I have seen show it using a loop. If I need to use a loop is >> there a good way to get the registered output from nova into a list rather >> than per host? I could not figure out any way to use set_fact to append the >> per host values of the registered nova variable into a single variable. >> >> I felt like this approach was pretty clean, but I am definitely open to >> other ideas. My goal is to be able to provision a scalability test >> environment so I am expecting to be provisioning 500 VMs in a private >> Openstack network. >> >> Tony >> >> >> On Thursday, July 17, 2014 7:19:40 AM UTC-7, Kurt Yoder wrote: >>> >>> I forgot to include a critical piece of this solution. Here's how you >>> invoke the task to tell Openstack to start the VMs: >>> - name: Create cluster >>> hosts: os_api >>> gather_facts: no >>> roles: [instantiate] # "instantiate" is a role that includes the >>> Openstack startup task >>> >>> >>> Perhaps this kind of example should be included in docs for parallel >>> execution in Ansible. Let me know if you want me to help with that. >>> >>> -Kurt >>> >>> On Thursday, July 17, 2014 10:04:14 AM UTC-4, Kurt Yoder wrote: >>>> >>>> I found a different approach to this problem. >>>> >>>> >>>> First create a cluster configuration file. >>>> $ cat cluster.yml >>>> --- >>>> cluster: >>>> - cluster1 >>>> - cluster2 >>>> >>>> >>>> Define the first task: setting up one connection to localhost for each >>>> API call. >>>> - include_vars: cluster.yml >>>> >>>> - add_host: >>>> name: "os_api_{{ item }}" >>>> ansible_ssh_host: 127.0.0.1 >>>> groups: os_api >>>> ansible_connection: local >>>> oshost: "{{ item }}" >>>> with_items: cluster >>>> >>>> Define a follow-on task: tell Openstack to start up the VMs. >>>> - name: Show host name >>>> debug: >>>> msg: "API connection: os_api_{{ oshost }}; Openstack host: {{ >>>> oshost }}" >>>> >>>> - name: Launch cluster VM on Openstack >>>> nova_compute: >>>> name: "{{ os_username }}_{{ oshost }}" >>>> state: present >>>> login_username: "{{ os_username }}" >>>> login_tenant_name: "{{ os_tenant }}" >>>> login_password: "{{ os_password }}" >>>> image_id: "{{ os_image_id }}" >>>> key_name: "{{ os_username }}_controller_key" >>>> wait_for: 200 >>>> flavor_id: "{{ os_flavor_id }}" >>>> auth_url: "{{ os_url }}" >>>> user_data: "#cloud-config\nmanage_etc_hosts: true" >>>> >>>> - name: Assign IP address to cluster VM >>>> quantum_floating_ip: >>>> state: present >>>> login_username: "{{ os_username }}" >>>> login_password: "{{ os_password }}" >>>> login_tenant_name: "{{ os_tenant }}" >>>> network_name: "{{ os_network_name }}" >>>> instance_name: "{{ os_username }}_{{ oshost }}" >>>> internal_network_name: "{{ os_internal_network_name }}" >>>> auth_url: "{{ os_url }}" >>>> register: quantum_info >>>> >>>> - name: Wait for cluster SSH to become available >>>> wait_for: >>>> port: 22 >>>> host: "{{ quantum_info.public_ip }}" >>>> timeout: 180 >>>> state: started >>>> >>>> >>>> >>>> This method gives the following benefits: >>>> >>>> - I can define lots of flavors and images in my cluster.yml >>>> definition. >>>> - I can launch them all in parallel using Ansible's built-in, >>>> robust parallel execution. >>>> - I have access to all of Ansible's primitives while doing so, so I >>>> can build in *any* custom logic. >>>> - No need to add options to nova_compute. >>>> >>>> >>>> Overall, I'm extremely happy with this solution. To reiterate: *no code >>>> changes are required*! >>>> >>>> >>>> >>>> On Wednesday, July 16, 2014 5:02:31 PM UTC-4, Michael DeHaan wrote: >>>>> >>>>> Additions of new params to add IP spawning behavior would be >>>>> reasonable. >>>>> >>>>> (assign_public_ip, True/False, etc) >>>>> >>>>> What might you prefer on names? >>>>> >>>>> >>>>> >>>>> >>>>> On Tue, Jul 15, 2014 at 1:27 PM, Kurt Yoder <[email protected]> >>>>> wrote: >>>>> >>>>>> I dug a bit further. The API does allow min_count and max_count, much >>>>>> the way boto does for AWS. >>>>>> >>>>>> When you submit a request with min_count, your instances are named >>>>>> <ansible-provide name>-<instance UUID>. That's acceptable, though not >>>>>> ideal. >>>>>> >>>>>> I'm taking a look at the Ansible ec2 module, and the code for boto >>>>>> instance-launching code looks very different than the nova_compute >>>>>> instance-launching code. I haven't run it yet; I need to dig around to >>>>>> find >>>>>> my ec2 creds so I can run a test. >>>>>> >>>>>> The Ansible ec2 module also allows one to assign public IPs while >>>>>> launching multiple instances. The Ansible nova_compute module does not >>>>>> permit this ATM. >>>>>> >>>>>> >>>>>> On Friday, July 11, 2014 9:50:10 PM UTC-4, Michael DeHaan wrote: >>>>>> >>>>>>> "So should I make a custom module which loops over nova_compute >>>>>>> asynchronously, and also assigns floating IPs?" >>>>>>> >>>>>>> I'd first rather know where the openstack API allows simultaneous >>>>>>> creation of N virtual machines of the same image type. >>>>>>> >>>>>>> I expect the floating IP stuff is fast and a usual with_items loop >>>>>>> isn't a problem there, once those guests exist. >>>>>>> >>>>>>> (Using neutron, I assume?) >>>>>>> >>>>>>> >>>>>>> On Fri, Jul 11, 2014 at 6:54 PM, Kurt Yoder <[email protected] >>>>>>> > wrote: >>>>>>> >>>>>>>> So should I make a custom module which loops over nova_compute >>>>>>>> asynchronously, and also assigns floating IPs? >>>>>>>> >>>>>>>> Would such a module be useful to the wider community, or is it too >>>>>>>> specialized to contribute back? >>>>>>>> >>>>>>>> On Friday, July 11, 2014 6:34:47 PM UTC-4, Michael DeHaan wrote: >>>>>>>> >>>>>>>>> So some of the provisioning modules, like AWS in particular, >>>>>>>>> support spinning up "N" modules at a time by passing "count" or >>>>>>>>> "exact_count". >>>>>>>>> >>>>>>>>> Rackspace I believe does this with manual looping (for now), but I >>>>>>>>> could be wrong and that might have just been historical truth. >>>>>>>>> >>>>>>>>> If the OpenStack API says we can launch 10 at once, it could be >>>>>>>>> made to do similar things. >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Fri, Jul 11, 2014 at 5:28 PM, Kurt Yoder < >>>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>>> I guess that error is because I put a "with_items" in there. >>>>>>>>>> >>>>>>>>>> How does everyone else do this? I don't understand how to loop >>>>>>>>>> asynchronously. See pseudo-code: >>>>>>>>>> >>>>>>>>>> < start all 5 at once: > >>>>>>>>>> < start up openstack host > >>>>>>>>>> < assign it a floating ip > >>>>>>>>>> < capture the floating ip > >>>>>>>>>> < end when all 5 have a floating ip > >>>>>>>>>> < wait for all 5 floating IPs to have an open SSH port > >>>>>>>>>> >>>>>>>>>> On Friday, July 11, 2014 5:20:34 PM UTC-4, Kurt Yoder wrote: >>>>>>>>>>> >>>>>>>>>>> Well, "async" is totally a bust. I got a message: >>>>>>>>>>> >>>>>>>>>>> fatal: [localhost] => lookup plugins (with_*) cannot be used >>>>>>>>>>> with async tasks >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Thursday, July 10, 2014 6:17:48 PM UTC-4, Kurt Yoder wrote: >>>>>>>>>>>> >>>>>>>>>>>> Hello list, >>>>>>>>>>>> >>>>>>>>>>>> I anticipate provisioning 10-20 VMs using Ansible, then >>>>>>>>>>>> assigning floating IPs to each, then waiting for SSH to become >>>>>>>>>>>> available >>>>>>>>>>>> for each VM. I would like to do this in parallel instead of >>>>>>>>>>>> serially. >>>>>>>>>>>> Specifically: >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> - Start the VMs, but don't block >>>>>>>>>>>> - Assign the IPs, but don't block >>>>>>>>>>>> - Wait on SSH until all VMs respond >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> I saw the nova_compute "wait: 'no'" option, but when I use it I >>>>>>>>>>>> get a stack trace: >>>>>>>>>>>> >>>>>>>>>>>> failed: [localhost] => (item=1) => {"failed": true, "item": 1, >>>>>>>>>>>>> "parsed": false} >>>>>>>>>>>>> invalid output was: Traceback (most recent call last): >>>>>>>>>>>>> File "/home/ubuntu/.ansible/tmp/ansible-tmp-1405028178.0- >>>>>>>>>>>>> 234314980043958/nova_compute", line 1490, in <module> >>>>>>>>>>>>> main() >>>>>>>>>>>>> File "/home/ubuntu/.ansible/tmp/ansible-tmp-1405028178.0- >>>>>>>>>>>>> 234314980043958/nova_compute", line 266, in main >>>>>>>>>>>>> _create_server(module, nova) >>>>>>>>>>>>> File "/home/ubuntu/.ansible/tmp/ansible-tmp-1405028178.0- >>>>>>>>>>>>> 234314980043958/nova_compute", line 194, in _create_server >>>>>>>>>>>>> private = [ x['addr'] for x in getattr(server, >>>>>>>>>>>>> 'addresses').itervalues().next() if x['OS-EXT-IPS:type'] == >>>>>>>>>>>>> 'fixed'] >>>>>>>>>>>>> StopIteration >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Perhaps I'm using it incorrectly: >>>>>>>>>>>> >>>>>>>>>>>> - name: Launch cluster VM on Openstack >>>>>>>>>>>>> nova_compute: >>>>>>>>>>>>> name: "{{ os_username }}_cluster1" >>>>>>>>>>>>> state: present >>>>>>>>>>>>> login_username: "{{ os_username }}" >>>>>>>>>>>>> login_tenant_name: "{{ os_tenant }}" >>>>>>>>>>>>> login_password: "{{ os_password }}" >>>>>>>>>>>>> image_id: "{{ os_image_id }}" >>>>>>>>>>>>> key_name: "{{ os_username }}_controller_key" >>>>>>>>>>>>> wait: "no" >>>>>>>>>>>>> flavor_id: "{{ os_flavor_id }}" >>>>>>>>>>>>> auth_url: "{{ os_url }}" >>>>>>>>>>>>> user_data: "#cloud-config\nmanage_etc_hosts: true" >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> So, two questions: >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 1. Am I using "wait" correctly? >>>>>>>>>>>> 2. Should I use "wait" to get to my desired parallel VM >>>>>>>>>>>> launch, as described above, or should I use something else, >>>>>>>>>>>> e.g. "async"? >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Thanks, >>>>>>>>>>>> >>>>>>>>>>>> -Kurt >>>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>> Google Groups "Ansible Project" group. >>>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>>> send an email to [email protected]. >>>>>>>>>> To post to this group, send email to [email protected]. >>>>>>>>>> To view this discussion on the web visit >>>>>>>>>> https://groups.google.com/d/msgid/ansible-project/32b58cdf-1 >>>>>>>>>> 7cd-42c9-8ef6-dc90327e989a%40googlegroups.com >>>>>>>>>> <https://groups.google.com/d/msgid/ansible-project/32b58cdf-17cd-42c9-8ef6-dc90327e989a%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>>>> . >>>>>>>>>> >>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "Ansible Project" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to [email protected]. >>>>>>>> To post to this group, send email to [email protected]. >>>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/ansible-project/2326c06a- >>>>>>>> dec5-43b2-bd22-bb6856d14227%40googlegroups.com >>>>>>>> <https://groups.google.com/d/msgid/ansible-project/2326c06a-dec5-43b2-bd22-bb6856d14227%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> >>>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Ansible Project" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> To post to this group, send email to [email protected]. >>>>>> To view this discussion on the web visit https://groups.google.com/d/ >>>>>> msgid/ansible-project/2949ac2a-e83e-4074-bc26- >>>>>> 02652b90e605%40googlegroups.com >>>>>> <https://groups.google.com/d/msgid/ansible-project/2949ac2a-e83e-4074-bc26-02652b90e605%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> -- >> You received this message because you are subscribed to the Google Groups >> "Ansible Project" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To post to this group, send email to [email protected] >> <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/ansible-project/13cc7a2e-bbb5-49b6-9ab3-ac1893c36d93%40googlegroups.com >> >> <https://groups.google.com/d/msgid/ansible-project/13cc7a2e-bbb5-49b6-9ab3-ac1893c36d93%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "Ansible Project" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/70651470-0e6b-44aa-ae50-6607ca56c3d2%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
