Amazon AWS EC2 + Marionete, faça com que o Puppet conheça as tags de instância do AWS

5

Estou tendo um problema com a implantação da AWS, relativamente nova na AWS e na Puppet.

Então, chegando à minha pergunta - você consegue distinguir nós fantoches com tags de máquina da AWS ou domínios CNAME?

Um pequeno histórico sobre o plano:

  • tem vários clusters de máquinas, um cluster php, um cluster php herdado, um cluster java, um cluster perl
  • controla a configuração com o fantoche - ainda é muito novo para o fantoche, mas como desenvolvedor eu gosto da idéia de ser capaz de configurar o controle de versão dos servidores
  • tem o escalonamento automático ativado nesses clusters - obviamente, o principal benefício da nuvem que faz o custo muito alto quando se trata de qualquer desempenho razoável que valha a pena (essas máquinas amazon são mais lentas que meu telefone ...)
  • implantação controlada por Capistrano, isso facilita muito as coisas

Então, na AWS, você obtém esses dns supernames públicos / privados ... de jeito nenhum você pode identificar máquinas naqueles. Para aliviar o problema, as conexões como a AWS querem que você marque tudo - assim eu fiz. Encontrou um script que faz um registro CNAME para cada máquina com a tag "ShortName" graças à API Route53.

Toda máquina tem uma tag ShortName que se torna seu CNAME, mas infelizmente o fantoche ainda resolve o nome do DNS privado.

Eu gostaria de ter

node 'perl-cluster'{}

em fantoche, alguém tem alguma pista para conseguir isso?

Obrigado

    
por Piotr Jasiulewicz 26.06.2013 / 12:13

3 respostas

8

A maneira como fiz isso é escrever um fato personalizado para o servidor identificar sua função a partir dos dados do usuário, que podem ser acessados em 169.254.169.254, ver seus próprios dados do usuário . .

Documentação de dados do usuário da AWS

curl http://169.254.169.254/latest/

então, quando eu digito facter role ill get 'dbserver', 'webserver', use isso para definir um nó, é importante não ter grupos de autoescala preocupados com o nome do servidor.

/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

Eu não quero dizer exatamente como fazer no seu caso, mas aqui vou mostrar como criar um fato personalizado para relatar o ID da instância do EC2.

Facter, curl, estão instalados.

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

E eis que um fato personalizado foi escrito.

Agora posso usá-lo para obter o ID da instância ec2:

$ facter instance_id
i-a1c0ffee

Eu não tenho fantoche instalado nesta máquina, mas se eu queria que ele fosse disponível para fantoche, id colocar nele / var / lib / puppet / lib / facter, e distribuí-lo para os clientes id garantir pluginsync = true no fantoche. conf.

Lembre-se, tudo o que eu disse é altamente subjetivo, é como eu faço, se há uma maneira melhor, eu estaria interessado.

    
por 26.06.2013 / 14:11
3

A partir do facter 1.7 (lançado em abril de 2013), existem fatos incorporados que relatam vários detalhes da sua instância do EC2.

Referência: link

    
por 26.04.2014 / 20:19
1

Concordo com Sirch que neste momento os fatos personalizados parecem ser o caminho a percorrer. A AWS descreve o uso de fatos sobre a formação de nuvens em:

link

Qual é uma leitura interessante, embora difícil. O fato personalizado é:

# 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

Eles então configuram seus nós como:

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

Estou mais inclinado a implementar isso via hiera como:

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

Depois, tenha algo parecido com common.yaml:

classes: cfn # or whatever your custom fact class is

roles / dbserver.yaml:

classes: mysql

roles / webserver.yaml:

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

Jeff

    
por 29.05.2014 / 00:04