Назад | Перейти на главную страницу

Amazon AWS EC2 + Puppet: узнайте, как Puppet знает теги инстансов AWS

У меня возникла проблема с развертыванием AWS, довольно новая для AWS и Puppet.

Итак, переходя к моему вопросу - можете ли вы различать марионеточные узлы с машинными тегами AWS или доменами CNAME?

Немного предыстории о плане:

Таким образом, в AWS вы получаете эти супер-неприятные DNS-адреса общедоступных / частных машин ... на них невозможно идентифицировать машины. Чтобы решить эту проблему, швы вроде AWS хотят, чтобы вы пометили все - я так и сделал. Нашел скрипт, который делает запись CNAME для каждой машины с тегом «ShortName» благодаря Route53 API.

У каждого компьютера есть тег ShortName, который становится его CNAME, к сожалению, марионетка все еще разрешает частное имя DNS.

Я бы хотел иметь

node 'perl-cluster'{}

в марионетке, кто-нибудь знает, как достичь этого?

Спасибо

Я сделал это так, чтобы написать пользовательский факт для сервера, чтобы определить его роль по пользовательским данным, к которым можно получить доступ на 169.254.169.254, см. Свой собственный данные пользователя...

Документация по пользовательским данным AWS

curl http://169.254.169.254/latest/

поэтому когда я печатаю facter role Я получаю «dbserver», «webserver» что угодно, а затем используйте это для определения узла, важно, чтобы группы автомасштабирования не заботились о том, какое имя сервера.

/etc/puppet/manifests/nodes.pp

node default{
  include nodes::type
}

/etc/puppet/modules/nodes/manifests/init.pp

import “type.pp”

/etc/puppet/modules/nodes/manifests/type.pp

class nodes::type{
   case $role {
     “dbserver” : {
       include mysql
     }
   }
   case $role {
      “webserver” : {
       include httpd
     }
   }
}

/etc/puppet/manifests/modules.pp

 import nodes

Я не хочу рассказывать вам, как именно это сделать в вашем случае, но здесь я покажу вам, как создать собственный факт для сообщения идентификатора экземпляра EC2.

Фастер, завиток, установлены.

mkdir -p /home/ec2-user/lib/ruby/facter
export FACTERLIB=/home/ec2-user/lib/ruby/facter

cat > /home/ec2-user/lib/ruby/facter/instance_id < EOF
# instance_id.rb
#
require 'facter'
Facter.add("instance_id") do
    setcode "/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id"
    end
EOF

И вот, был написан заказной факт.

Теперь я могу использовать его для получения идентификатора экземпляра ec2:

$ facter instance_id
i-a1c0ffee

У меня нет установленной марионетки на этом компьютере, но если я хочу, чтобы она была доступна для марионетки, введите в нее id / var / lib / puppet / lib / facter, а для распространения среди клиентов убедитесь, что pluginsync = true в puppet.conf.

Имейте в виду, все, что я сказал, очень субъективно, просто я это делаю, если есть лучший способ, мне было бы интересно.

Начиная с facter 1.7 (выпущенного в апреле 2013 года), есть встроенные факты, которые сообщают различные детали вашего экземпляра EC2.

Ссылка: http://docs.puppetlabs.com/facter/1.7/core_facts.html#ec2ec2-instance-data

Я согласен с Сирчем в том, что на данном этапе обычаи кажутся подходящим вариантом. AWS описывает использование фактов формирования облака по адресу:

https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithPuppet.pdf

Это интересно, хотя и трудно читать. Заказной факт из этого:

# cfn.rb 
require 'rubygems' 
require 'json' 
filename = "/var/lib/cfn-init/data/metadata.json" 
if not File.exist?(filename) 
 return 
end 
parsed = JSON.load(File.new(filename)) 
parsed.default = Hash.new 
parsed[\"Puppet\"].each do |key, value| 
 actual_value = value 
 if value.is_a? Array 
  actual_value = value.join(',') 
 end 
 Facter.add(\"cfn_\" + key) do 
  setcode do 
   actual_value 
  end 
 end 
end

Затем они настраивают свои узлы следующим образом:

node basenode { 
 include cfn 
} 
node /^.*internal$/ inherits basenode { 
 case $cfn_roles {
   ...cloud formation include...
 } 
} 

Я более склонен реализовать это через hiera, например:

---
:backends:
  - yaml
:yaml:
  :datadir: /etc/puppet/hiera
:hierarchy:
  - "roles/%{::cfn_roles}"
  - common

Затем создайте что-нибудь вроде common.yaml:

classes: cfn # or whatever your custom fact class is

роли / dbserver.yaml:

classes: mysql

роли / webserver.yaml:

classes: httpd
httpd::port: 8080
...

Джефф