engineyard-metadata
Presents a simple interface to get metadata about your EngineYard AppCloud instances running on Amazon EC2.
Purpose
To define a simple interface to useful metadata (passwords, IP addresses, etc.) that is otherwise buried deep inside EngineYard's chef config files and various API calls.
Examples
Here's the current method list:
EY.metadata.app_master
EY.metadata.app_name
EY.metadata.app_servers
EY.metadata.app_slaves
EY.metadata.current_path
EY.metadata.database_host
EY.metadata.database_name
EY.metadata.database_password (only works from cloud instances)
EY.metadata.database_username
EY.metadata.db_master
EY.metadata.db_servers
EY.metadata.db_slaves
EY.metadata.environment_name
EY.metadata.mysql_command (only works from cloud instances)
EY.metadata.mysqldump_command (only works from cloud instances)
EY.metadata.present_instance_id (only works from cloud instances)
EY.metadata.present_instance_role (only works from cloud instances)
EY.metadata.present_public_hostname (only works from cloud instances)
EY.metadata.present_security_group (only works from cloud instances)
EY.metadata.repository_uri
EY.metadata.shared_path
EY.metadata.solo
EY.metadata.ssh_aliases
EY.metadata.ssh_password (only works from cloud instances)
EY.metadata.ssh_username
EY.metadata.stack_name
EY.metadata.utilities
public_hostname, amazon_id, etc.
Thanks to Nick Marden, you can do things like:
?> EY.metadata.app_servers('amazon_id')
>> [ 'i-ff17d493', 'i-c217d423' ]
By default, you get the public hostname.
Use
See the documentation at (the engineyard-metadata documentation}[http://rubydoc.info/gems/engineyard-metadata].
When you're executing this gem from INSIDE the cloud
When you're executing the gem from your instances, you don't have to configure anything. Just require the gem.
If you see
Errno::EACCES: Permission denied - /etc/chef/dna.json
then I suggest adding something like this to deploy/before_bundle.rb
sudo 'chmod a+r /etc/chef/dna.json'
or find some other way to make the file readable.
The Engine Yard recipes will often reset the permissions on the file, so you can periodically fix that using a custom chef recipe like this:
# Only run on app server instances.
if ['app','app_master'].include?(node[:instance_role]) then
cron "Make /etc/chef/dna.json readable" do
minute "*/5"
command "chmod a+r /etc/chef/dna.json"
end
end
When you're executing this gem from OUTSIDE the cloud
You must...
- have
~/.eyrc
or setEY.metadata.ey_cloud_token=
or setENV['EY_CLOUD_TOKEN']
. - execute the gem from the local copy of your application's repo or set
EY.metadata.environment_name=
or setENV['EY_ENVIRONMENT_NAME']
.
Where the methods are defined
Metadata getters are defined directly on EY.metadata
(which in turn delegates out to various adapters). Even if EngineYard changes the structure of the config files or Amazon EC2's API changes, these methods will stay the same.
[...]
>> require 'rubygems'
[...]
>> require 'engineyard-metadata'
[...]
>> EY.metadata.database_host
=> "external_db_master.compute-1.amazonaws.com"
>> EY.metadata.app_servers
=> [ 'app_1.compute-1.amazonaws.com' , 'app_master.compute-1.amazonaws.com' ]
>> EY.metadata.db_servers
=> [ 'db_master.compute-1.amazonaws.com', 'db_slave_1.compute-1.amazonaws.com' ]
[...and many more...]
SSH alias helper
You can put the output of ey_ssh_aliases
into ~/.ssh/config
:
$ EY_ENVIRONMENT_NAME=my_env ey_ssh_aliases
Host my_env-app_master
Hostname ec2-11-11-111-11.compute-1.amazonaws.com
User deploy
StrictHostKeyChecking no
Host my_env-db_master
Hostname ec2-111-11-11-11.compute-1.amazonaws.com
User deploy
StrictHostKeyChecking no
Known issues
- Doesn't work with multiple apps per environment. [FIXED!]
- It's not always clear what environment you're running in. For example, you say
EY.metadata.something
and you're just supposed to know what environment you're in. You can use.environment_name=
, but you might not remember. - There are no factory methods. If we fully fleshed this out, it might be like
my_env = EY::Environment.find('my_env')
andmy_app_master = my_env.app_master
. Not sure that complexity would add a lot of value.
History
This is the second generation of http://rubygems.org/gems/ey_cloud_awareness.
Sample test output
engineyard-metadata (master) $ rake
EY.metadata
being executed on an EngineYard AppCloud (i.e. Amazon EC2) instance
it should behave like it does in all execution environments
by getting the database username
by getting the database name
by getting the database host
by getting the ssh username
by getting the app server hostnames
by getting the db server hostnames
by getting the utilities hostnames
by getting the app master hostname
by getting the db master hostname
by getting the db slave hostnames
by getting the app slave hostnames
by getting the solo hostname
by getting the environment name
by getting the stack name
by getting the repository URI
by getting the app name
by getting the current path
by getting the shared path
by getting helpful ssh aliases
it should behave like it's executing inside the cloud
by refusing to get the list of all environment names
by getting the present instance ID
by getting the present instance role (as a string)
by getting the present public hostname
by getting the present security group
by getting the database password
by getting the ssh password
by getting the mysql command
by getting the mysqldump command
being executed from a developer/administrator's local machine
controlled with environment variables
it should behave like it does in all execution environments
by getting the database username
by getting the database name
by getting the database host
by getting the ssh username
by getting the app server hostnames
by getting the db server hostnames
by getting the utilities hostnames
by getting the app master hostname
by getting the db master hostname
by getting the db slave hostnames
by getting the app slave hostnames
by getting the solo hostname
by getting the environment name
by getting the stack name
by getting the repository URI
by getting the app name
by getting the current path
by getting the shared path
by getting helpful ssh aliases
it should behave like it's executing outside the cloud
by getting the list of all environment names
by refusing to get the present instance ID
by refusing to get the present instance role (as a string)
by refusing to get the present public hostname
by refusing to get the present security group
by refusing to get the database password
by refusing to get the ssh password
by refusing to get the mysql command
by refusing to get the mysqldump command
controlled with attr writers
it should behave like it does in all execution environments
by getting the database username
by getting the database name
by getting the database host
by getting the ssh username
by getting the app server hostnames
by getting the db server hostnames
by getting the utilities hostnames
by getting the app master hostname
by getting the db master hostname
by getting the db slave hostnames
by getting the app slave hostnames
by getting the solo hostname
by getting the environment name
by getting the stack name
by getting the repository URI
by getting the app name
by getting the current path
by getting the shared path
by getting helpful ssh aliases
it should behave like it's executing outside the cloud
by getting the list of all environment names
by refusing to get the present instance ID
by refusing to get the present instance role (as a string)
by refusing to get the present public hostname
by refusing to get the present security group
by refusing to get the database password
by refusing to get the ssh password
by refusing to get the mysql command
by refusing to get the mysqldump command
depending on .eyrc
it should behave like it does in all execution environments
by getting the database username
by getting the database name
by getting the database host
by getting the ssh username
by getting the app server hostnames
by getting the db server hostnames
by getting the utilities hostnames
by getting the app master hostname
by getting the db master hostname
by getting the db slave hostnames
by getting the app slave hostnames
by getting the solo hostname
by getting the environment name
by getting the stack name
by getting the repository URI
by getting the app name
by getting the current path
by getting the shared path
by getting helpful ssh aliases
it should behave like it's executing outside the cloud
by getting the list of all environment names
by refusing to get the present instance ID
by refusing to get the present instance role (as a string)
by refusing to get the present public hostname
by refusing to get the present security group
by refusing to get the database password
by refusing to get the ssh password
by refusing to get the mysql command
by refusing to get the mysqldump command
Finished in 0.95816 seconds
112 examples, 0 failures
Copyright
Copyright (c) 2012 Seamus Abshere. See LICENSE for details.