Prefácio
Estou construindo um ambiente de virtualização com o Ubuntu 14.04 e o LXC. Não quero escrever meu próprio modelo, pois a atualização de 12.04 a 14.04 mostrou que a compatibilidade com versões anteriores não é garantida.
Portanto, estou implantando minhas máquinas virtuais via lxc-create, usando o modelo padrão do Ubuntu. O DNS para os servidores é fornecido pelo Amazon Route 53, portanto, nenhum servidor DNS local é necessário.
Eu também uso o Puppet para configurar meus servidores, por isso quero manter o esforço manual na implantação mínima.
Agora, o modelo padrão do Ubuntu atribui endereços IP via DHCP. Portanto, eu preciso de um servidor DHCP local para atribuir endereços IP aos nós, para que eu possa fazer SSH neles e colocar o Puppet em funcionamento. Como o Puppet requer uma configuração de DNS adequada, atribuir endereços IP temporários não é uma opção, o cliente precisa obter o nome de host e o endereço IP corretos desde o início.
Pergunta
Qual servidor DHCP eu uso e como posso obtê-lo para atribuir o endereço IP com base apenas na opção DHCP do nome do host executando uma pesquisa de DNS nesse mesmo nome de host?
O que eu tentei
Eu tentei fazer isso funcionar usando o servidor ISC DHCP, no entanto, o manual afirma claramente:
Please be aware that only the dhcp-client-identifier option and the hardware address can be used to match a host declaration, or the host-identifier option parameter for DHCPv6 servers. For example, it is not possible to match a host declaration to a host-name option. This is because the host-name option cannot be guaranteed to be unique for any given client, whereas both the hardware address and dhcp-client-identifier option are at least theoretically guaranteed to be unique to a given client.
Eu também tentei criar uma classe que corresponde ao nome do host assim:
class "my-client-name" {
match if option host-name = "my-client-name";
fixed-address my-client-name.my-domain.com;
}
Infelizmente, a opção endereço fixo não é permitida nas declarações de classe . Posso substituí-lo por um pool de tamanho 1, que funciona como esperado:
subnet 10.103.0.0 netmask 255.255.0.0 {
option routers 10.103.1.1;
class "my-client-name" {
match if option host-name = "my-client-name";
}
pool {
allow members of "my-client-name";
range 10.103.1.2 10.103.1.2;
}
}
No entanto, isso exigiria que eu administrasse os endereços IP em dois locais (Amazon Route53 e o servidor DHCP), que eu preferiria não fazer .
Sobre segurança
Como isso é usado apenas na fase de bootstrapping em uma rede interna e é substituído por uma configuração de rede estática pelo Puppet, isso não deve ser um problema do ponto de vista de segurança. Estou, no entanto, ciente de que a máquina virtual é inicializada com credenciais "ubuntu: ubuntu", que eu pretendo corrigir assim que isso estiver em execução.