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
jon2
July 18, 2015, 5:02pm
2
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 .
jon2
July 18, 2015, 5:08pm
3
Oops, that should have read:
{{ lookup(‘aws_rds_endpoint_name _from_instance_name’, (region, database_instance )) }}
The other returns the port.
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