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]> 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].
> 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/51f212ac-d383-49a9-bcc2-4bbf8901a5a4%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
--
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].
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/CAKVSOJU3Vw-wcj1JbXGMFp9yR6XraNWbVSmyZD93aNKmhT%2BX0g%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.