lib/ohai/plugins/ec2.rb in ohai-8.10.0 vs lib/ohai/plugins/ec2.rb in ohai-8.11.1

- old
+ new

@@ -15,76 +15,100 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -require 'ohai/mixin/ec2_metadata' -require 'base64' +require "ohai/mixin/ec2_metadata" +require "base64" Ohai.plugin(:EC2) do include Ohai::Mixin::Ec2Metadata provides "ec2" depends "network/interfaces" depends "dmi" + # look for ec2metadata which is included on paravirt / hvm AMIs + def has_ec2metadata_bin? + if File.exist?("/usr/bin/ec2metadata") + Ohai::Log.debug("ec2 plugin: has_ec2metadata_bin? == true") + true + else + Ohai::Log.debug("ec2 plugin: has_ec2metadata_bin? == false") + false + end + end + # look for arp address that non-VPC hosts will have - def has_ec2_mac? + def has_xen_mac? network[:interfaces].values.each do |iface| unless iface[:arp].nil? if iface[:arp].value?("fe:ff:ff:ff:ff:ff") - Ohai::Log.debug("has_ec2_mac? == true") + # using MAC addresses from ARP is unreliable because they could time-out from the table + # fe:ff:ff:ff:ff:ff is actually a sign of Xen, not specifically EC2 + deprecation_message <<-EOM +ec2 plugin: Detected EC2 by the presence of fe:ff:ff:ff:ff:ff in the ARP table. This method is unreliable and will be removed in a future version of ohai. Bootstrap using knife-ec2 or create "/etc/chef/ohai/hints/ec2.json" instead. +EOM + Ohai::Log.warn(deprecation_message) + Ohai::Log.debug("ec2 plugin: has_xen_mac? == true") return true end end end - Ohai::Log.debug("has_ec2_mac? == false") + Ohai::Log.debug("ec2 plugin: has_xen_mac? == false") false end # look for amazon string in dmi bios data # this only works on hvm instances as paravirt instances have no dmi data def has_ec2_dmi? begin # detect a version of '4.2.amazon' if dmi[:bios][:all_records][0][:Version] =~ /amazon/ - Ohai::Log.debug("has_ec2_dmi? == true") + Ohai::Log.debug("ec2 plugin: has_ec2_dmi? == true") true end rescue NoMethodError - Ohai::Log.debug("has_ec2_dmi? == false") + Ohai::Log.debug("ec2 plugin: has_ec2_dmi? == false") false end end + # rackspace systems look like ec2 so instead of timing out dig a bit deeper + def looks_like_rackspace? + return true if File.exist?("/usr/bin/rackspace-monitoring-agent") + end def looks_like_ec2? - # Try non-blocking connect so we don't "block" if - # the Xen environment is *not* EC2 - hint?('ec2') || ( has_ec2_dmi? || has_ec2_mac?) && can_metadata_connect?(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR,80) + return true if hint?("ec2") + + # Even if it looks like EC2 try to connect first + if has_ec2_dmi? || has_xen_mac? || (has_ec2metadata_bin? && !looks_like_rackspace?) + return true if can_metadata_connect?(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80) + end end collect_data do if looks_like_ec2? - Ohai::Log.debug("looks_like_ec2? == true") + Ohai::Log.debug("ec2 plugin: looks_like_ec2? == true") ec2 Mash.new fetch_metadata.each do |k, v| # fetch_metadata returns IAM security credentials, including the IAM user's # secret access key. We'd rather not have ohai send this information # to the server. # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html#instancedata-data-categories - next if k == 'iam' && !hint?('iam') + next if k == "iam" && !hint?("iam") ec2[k] = v end ec2[:userdata] = self.fetch_userdata - #ASCII-8BIT is equivalent to BINARY in this case + # ASCII-8BIT is equivalent to BINARY in this case if ec2[:userdata] && ec2[:userdata].encoding.to_s == "ASCII-8BIT" - Ohai::Log.debug("Binary UserData Found. Storing in base64") + Ohai::Log.debug("ec2 plugin: Binary UserData Found. Storing in base64") ec2[:userdata] = Base64.encode64(ec2[:userdata]) end else - Ohai::Log.debug("looks_like_ec2? == false") + Ohai::Log.debug("ec2 plugin: looks_like_ec2? == false") false end end end