Detecting Infrastructure Provider in Puppet

3

Nota: usamos Puppet standalone (mestre-menos), ou seja, marionete.

Normalmente, durante a implantação de um aplicativo da Web, há vários serviços e aplicativos de back-end que são executados atrás do aplicativo frontal - coisas como banco de dados, servidor de pesquisa, servidor de armazenamento em cache, outros serviços internos etc. não precisa ouvir nas interfaces de rede pública. Em vez disso, eles podem ouvir na interface de rede privada e todos os aplicativos podem se comunicar com segurança. Isso é algo que eu já faço.

O problema surge quando você deseja implantar automaticamente esses serviços. Usamos o Puppet para infra-provisionamento. Quando esses serviços são implantados, dependemos de fatos para capturar itens como ipaddress e hostname. Dependendo de onde sua máquina está, o nome da interface é diferente. Por exemplo, os identificadores em máquinas fornecidos pela Soft Layer são bond0, bond1, etc. e os mesmos fornecidos pela Digital Ocean são eth0, eth1, etc. Destes, vamos dizer bond0 e eth0 são interfaces públicas e bond1 e eth1 são privados .

O ideal é usar os mesmos scripts de marionete para a infraestrutura de provisionamento, não importa onde você esteja provisionando. E usamos hiera para pegar valores padrão para classes. Então, idealmente, eu gostaria de ter fatos como ipaddress_public, ipaddress_private disponíveis e, em seguida, eu posso usá-los no entanto eu quero para qualquer classe em Puppet. E o fato deve esconder os detalhes sangrentos de descobrir onde a máquina está, ou seja, Soft Layer, Oceano Digital, AWS, etc e me pegar o fato para o trabalho. Ou posso criar uma hierarquia para o provedor de infraestrutura no hiera e ter diferentes padrões para diferentes provedores de infraestrutura.

O problema é que não sei como descobrir o fornecedor de uma máquina específica. Por exemplo, se eu lhe der uma máquina para executar o Puppet, pode haver uma maneira confiável de descobrir se ele está sendo executado em Soft Layer, Digital Ocean, AWS, etc.? Como vocês resolvem problemas como esses?

    
por vaidik 18.02.2015 / 07:17

1 resposta

2

Obviamente não é tão fácil quanto parece em primeiro lugar. No caso da AWS, existem fatos personalizados que informam que você está no aws, por exemplo:

# facter -p | grep ^ec2 |wc -l
33

O IP público é salvo no fato 'ec2_public_ipv4'. Então, é fácil detectar a AWS.

Mas no DigitalOcean - não há nada que indique na própria VM que está sendo executado no DigitalOcean. Apenas um fato interessante que vejo é:

# facter -p | grep kvm
virtual => kvm

A Amazon usa xenhvm. Se o SoftLayer usar algo diferente de xen / kvm, você poderá usar esse fato como ponto de partida. Claro que este método não é muito robusto, porque cada um deles pode mudar a virt tech em algum momento no tempo, o que pode tornar inoperáveis todas as suas VMs naquele provedor.

O que eu sugiro é que você escreva seu próprio fato personalizado, que levará em conta todo o conhecimento que você tem sobre os diferentes provedores de nuvem que você usa e, em seguida, decidirá quais IPs expor a seus scripts. Não há outra maneira, infelizmente.

    
por 18.02.2015 / 14:00