Using results of RDS facts to update a template

242 views
Skip to first unread message

Dave Thomas

unread,
Jul 17, 2015, 10:04:26 PM7/17/15
to ansible...@googlegroups.com

I’d trying to get the database endpoint into a Rails database.ml file. I know the RDS id, so I can get the endpoint using reds/command: facts.

Unfortunately, the RDS play has to use localhost, while the template write uses the actual target host.

So far I’ve done it using

- hosts:      localhost
  connection: local
  gather_facts: False
  vars_files:
    - ../ec2/ec2_params.yml

  tasks:
    - rds:
        command:       facts
        region:        "{{ region }}"
        instance_name: "{{ database_instance }}"
      register:        db_facts

    - name: save remote host
      copy:
        content: "{{ db_facts.instance }}"
        dest:    /tmp/db_facts

- hosts: tag_class_apps
  become: yes
  become_user: "{{ app_user }}"
  gather_facts: False

  vars:
     db_facts: "{{ lookup('file', '/tmp/db_facts')|from_json }}"

  tasks:
    - name: Update database.yml with current rds endpoint
      template:
        src:  ../roles/app_directories/templates/config/database.yml  # this template uses db_facts.endpoint
        dest: "{{ shared_path }}/config/database.yml"I can’t help feeling I’m making this too complex. What should I be doing?

I can't help feeling I'm making this too complicated. What magic am I missing?


Cheers


Dave

Jon Hadfield

unread,
Jul 18, 2015, 1:02:12 PM7/18/15
to ansible...@googlegroups.com
Rather than register the facts and write to a file, you can use a custom lookup to query the endpoint based on the instance name. Then you can put the following in your template file: 
{{ lookup('aws_rds_endpoint_port_from_instance_name', (region, database_instance )) }}
where region is a variable containing the region you use and database_instance is the name.

I've written some additional lookups, including one to get the endpoint of an RDS instance based on name here: https://github.com/jonhadfield/ansible-lookups
I'm also putting together a guide (nearly finished) that includes their use here: http://lessknown.info.

Jon Hadfield

unread,
Jul 18, 2015, 1:08:35 PM7/18/15
to ansible...@googlegroups.com
Oops, that should have read:
{{ lookup('aws_rds_endpoint_name_from_instance_name', (region, database_instance )) }}
The other returns the port.

Baraa Basata

unread,
Jul 18, 2015, 1:33:39 PM7/18/15
to ansible...@googlegroups.com
Hi Dave,

I use a single play to get an RDS endpoint and write database.yml. It uses `local_action` to delegate the rds facts lookup to localhost.

For the example that you've shared, it would look like the following:

- hosts: tag_class_apps
  become
: yes
  become_user
: "{{ app_user }}"
  gather_facts
: False


  tasks
:
   
- local_action:
       
module: rds
        command
: facts
        region
: "{{ region }}"
        instance_name
: "{{ database_instance }}"
     
register: db_facts

   
- name: Update database.yml with current rds endpoint
     
template:
        src
:  ../roles/app_directories/templates/config/database.yml


I hope this is helpful.

-Baraa

Dave Thomas

unread,
Jul 19, 2015, 3:39:25 PM7/19/15
to ansible...@googlegroups.com


On Saturday, July 18, 2015 at 10:33:39 AM UTC-7, Baraa Basata wrote:
Hi Dave,

I use a single play to get an RDS endpoint and write database.yml. It uses `local_action` to delegate the rds facts lookup to localhost.

Of course. Thank you!


Dave 
Reply all
Reply to author
Forward
0 new messages