You're welcome, I'm doing something similar but the opposite in some ways. I want to wait for the instance to have the endpoint fied populated with a CNAME. This has nothing to do with the whole instance being available.
This is what I've learned since I posted. 1.-DO NOT USE debug combined with an until condition to loop, it won't work. Use gather facts with a do until or wait_for the condition you're looking for. 2.-The rds instance goes through the following status values: creating backing-up modifying available deleting. When the instance transitions from creating to backing-up the endpoint shows up. It doesn't matter what you evaluate you're right, you HAVE To wait for the instance to become available to get any data: https://github.com/ansible/ansible-modules-core/issues/3865 On Friday, June 3, 2016 at 4:25:48 PM UTC-7, Darren S. wrote: > > Thanks for the ideas. I took another look at this using the rds > module's 'wait' and 'wait_timeout' arguments and realized that they > did what I wanted after all. When the instance setup is complete and > it goes to available status, the task immediately completes - and > these set a maximum amount of time to wait for it. Sorry for the > noise, I didn't need to overcomplicate it after all. > > I ended up with this task: > > > - name: "provision rds instance (timeout: {{ rds_instance_deploy_timeout > }}s)" > become: no > local_action: rds > args: > command: create > instance_name: "{{ rds_instance_name }}" > instance_type: "{{ rds_instance_class }}" > vpc_security_groups: "{{ rds_instance_vpc_security_groups }}" > multi_zone: "{{ rds_instance_multi_zone }}" > subnet: "{{ rds_instance_subnet_group }}" > db_engine: "{{ rds_instance_engine }}" > publicly_accessible: "{{ rds_instance_public }}" > maint_window: "{{ rds_instance_maintenance_window }}" > backup_retention: "{{ rds_instance_backup_retention }}" > size: "{{ mysql_app_db_size }}" > db_name: "{{ mysql_app_db_name }}" > username: "{{ mysql_admin_user }}" > password: "{{ mysql_admin_pass }}" > wait: yes > wait_timeout: "{{ rds_instance_deploy_timeout }}" > register: rds > when: rds_create_new_instance > tags: [db, rds] > > > On Fri, Jun 3, 2016 at 2:21 PM, einarc <[email protected] <javascript:>> > wrote: > > Here are two ideas: > > > > I'm about to implement this. > > > > 1.-Do fire and forget then check back when it's ready and you REALLY > need > > it: > > http://docs.ansible.com/ansible/playbooks_async.html (see last example) > > http://toroid.org/ansible-parallel-dispatch > > In my case I have plenty of things to do before I need the endpoint so > is > > fine for me to wait while the instance gets instantiated, > asynchronously. > > > > > > 2.-If you need to do this across plays(or not) you can use the rds_facts > to > > gather the facts of the instance and loop until you get the value that > you > > need. Is basically the same thing you're doing. > > > > > > On Saturday, May 28, 2016 at 2:46:58 PM UTC-7, Darren S. wrote: > >> > >> OS X 10.10.5 > >> Python 2.7.11 > >> Ansible 2.0.2.0 > >> boto 2.40.0 > >> boto3 1.3.1 > >> botocore 1.4.24 > >> > >> > >> Using the following tasks in a play: > >> > >> - name: db | rds | create RDS instance > >> become: no > >> local_action: rds > >> args: > >> command: create > >> instance_name: "{{ rds_instance_name }}" > >> instance_type: "{{ rds_instance_class }}" > >> vpc_security_groups: "{{ rds_instance_vpc_security_groups }}" > >> multi_zone: "{{ rds_instance_multi_zone }}" > >> subnet: "{{ rds_instance_subnet_group }}" > >> db_engine: "{{ rds_instance_engine }}" > >> publicly_accessible: "{{ rds_instance_public }}" > >> db_name: "{{ mysql_app_db_name }}" > >> size: "{{ mysql_app_db_size }}" > >> username: "{{ mysql_admin_user }}" > >> password: "{{ mysql_admin_pass }}" > >> async: 600 > >> poll: 60 > >> register: rds > >> tags: [db, rds] > >> > >> - name: db | rds | output db info > >> debug: > >> msg: "The new MySQL DB endpoint is {{ rds.instance.endpoint }}" > >> #var: rds > >> tags: [db, rds] > >> > >> > >> The result is that data in rds.instance is not populated completely at > >> the time the module returns successfully (changed status in this > >> case). Importantly, the 'endpoint' value is not missing. In the AWS > >> RDS console, it can be seen that the RDS instance is continuing to be > >> deployed (in "modifying" status for several minutes) and has not > >> populated a number of attributes. This is the result in Ansible when > >> it returns "early": > >> > >> > >> TASK [app : db | rds | create RDS instance] > >> ********************************** > >> changed: [example.com -> localhost] > >> > >> > >> TASK [app : db | rds | output db info] > >> **************************************** > >> ok: [example.com] => { > >> "msg": "The new MySQL DB endpoint is " > >> } > >> > >> Though above, the debug 'msg' attribute shows in this case that > >> rd.instance.endpoint is empty, on a previous run I dumped the rds > >> variable and it shows many fields unpopulated: > >> > >> > >> TASK [app : db | rds | output db info] > >> **************************************** > >> ok: [example.com] => { > >> "rds": { > >> "ansible_job_id": "34553352208.25036", > >> "changed": false, > >> "finished": 1, > >> "instance": { > >> "availability_zone": "us-west-2b", > >> "backup_retention": 1, > >> "create_time": 1464425508.477, > >> "endpoint": null, > >> "id": "database", > >> "instance_type": "db.m4.large", > >> "iops": null, > >> "maintenance_window": "sun:10:23-sun:10:53", > >> "multi_zone": false, > >> "port": null, > >> "replication_source": null, > >> "status": "modifying", > >> "username": "mysqladmin", > >> "vpc_security_groups": "sg-4f02f029" > >> } > >> } > >> } > >> > >> > >> In the examples [1] for the Ansible rds module, the task uses > >> wait/wait_timeout before returning and shows that the registered > >> variable has a full set of fields. I assumed that since the RDS > >> instance creation can take a great deal of time on AWS side, it may be > >> better to use asynchronous calls to avoid any long waits/timeouts. > >> Should this work properly using async/poll? Any reason why the module > >> returns but is not able to supply a complete instance dictionary? Is > >> there a better approach for this case? > >> > >> [1] http://docs.ansible.com/ansible/rds_module.html > >> > >> Regards, > >> > >> -- > >> Darren Spruell > >> [email protected] > > > > -- > > 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/51f212ac-d383-49a9-bcc2-4bbf8901a5a4%40googlegroups.com. > > > > For more options, visit https://groups.google.com/d/optout. > > > > -- > Darren Spruell > [email protected] <javascript:> > -- 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/f7e4790c-da4a-4f87-9d4b-b6168de952e2%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
