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.
--
You received this message because you are subscribed to the Google Groups
"Puppet Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-dev/6105274e-752b-41c5-b688-4c485a91da35%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.