As a person who uses Puppet Enterprise in ec2 heavily, I've spent a lot of time thinking about, and working around the present ec2 facts. Right now, ec2 facts are merely a flattened version of the ec2 instance metadata, and while it provides quite a lot of information, and a good bit of it being information on would desire, sometimes that information is difficult to access (possibly my ignorance at work). As an example, the fact for the VPC id of an ec2 instance, is ec2_network_interfaces_macs_
$Mac address of interface_vpc_id. Although I've not had to consider the implications of many interfaces attached to an instance, this fact is unwieldy, but often a good item to turn configuration on. I've dealt with it, using a simpler custom fact.
require 'facter'
Facter.add("ec2_vpc_id") do
confine :cloud_provider => 'aws'
setcode do
mac = Facter.value(:ec2_mac)
vpc_id_fact = "ec2_network_interfaces_macs_#{mac}_vpc_id"
Facter.value(vpc_id_fact)
end
end
Forgive the cloud_provider confine, it's a relic of the pre factor 2 in PE days, and I haven't gone back to find the appropriate confine for VPC instances yet.
Anyway, my question is, in general, does it seem a worthwhile effort to refactor the base ec2 facts to use parts of the meta data, instead of the more simple flattening of the entire return (which would also remove some of the undesirable facts created). Also has thought been given to using the ruby SDK to invoke describe methods to get new facts into the core. Of particular interest might be a fact, or set of facts around the ec2 instance tags, which are not in the metadata. Below is my hacky way of accomplishing that at present.
require 'facter'
require 'json'
cloud_provider = Facter.value(:cloud_provider)
case cloud_provider
when 'aws'
instance_id = Facter.value(:ec2_instance_id)
osfamily = Facter.value(:osfamily)
case osfamily
when 'Debian'
tags = Facter::Core::Execution.exec("/usr/local/bin/aws ec2 describe-tags --filters \"Name=resource-id,Values=#{instance_id}\" --output json --region us-east-1")
when 'RedHat'
tags = Facter::Core::Execution.exec("/usr/bin/aws ec2 describe-tags --filters \"Name=resource-id,Values=#{instance_id}\" --output json --region us-east-1")
end
tags_hash = JSON.parse(tags)["Tags"]
begin
tags_hash.each do |tag|
rescue
Facter.add("ec2_tag_" + tag["Key"]) do
setcode do
tag["Value"]
end
end
end
end
end
Please forgive any ignorance to history, convention, or customs, this is my first post, and I'm pretty new to the world of writing anything in ruby. Thoughts, advice, direction would all be appreciated.