Como definir várias entradas do / etc / hosts com o Puppet ENC?

3

Estou escrevendo um Classificador de Nó Externo para minha infraestrutura de Marionetes e tenho a necessidade de manipular o arquivo /etc/hosts em cada nó. O seguinte (devido à chave duplicada) é inválido YAML:

---
  host:
    name: www1.example.com
    host_aliases: www1
    ip: 1.2.3.4
  host:
    name: www2.example.com
    host_aliases: www2
    ip: 1.2.3.5

Eu vejo esta resposta relacionada , que tem o seguinte código:

host {
  # Public IPs - eth0
  'front-01': ip => '192.168.1.103';
  'front-02': ip => '192.168.1.106';

  # Private IPs - eth1
  'priv0-0': ip => '192.169.40.201';
  'priv0-1': ip => '192.169.40.202';
  'priv1-0': ip => '192.169.40.207';
  'priv1-1': ip => '192.169.40.208';

  # Virtual IPs - eth0:1
  'vip-01': ip => '192.169.50.202';
  'vip-02': ip => '192.169.50.205';
}

No entanto,

  1. Não é imediatamente óbvio para mim o que realmente está acontecendo aqui.
  2. Não consigo encontrar documentação para isso em nenhum lugar.
  3. Como esses (não parecem) parâmetros de classe - e por causa do # 1 e # 2 acima - também não é óbvio para mim como eu poderia traduzir isso para o YAML.

Um palpite ingênuo seria:

'host':
  'www1':
    'ip': 1.2.3.4
  'www2':
    'ip': 1.2.3.5

Mas por causa do item 2 acima, não me sinto confortável em seguir em frente com isso na produção. Minha pergunta então:

Onde posso encontrar documentação sobre como usar a classe host dessa maneira?

Ou se falhar

Como posso gerenciar várias entradas de /etc/hosts com uma ENC?

NB: Essas definições estão sendo usadas para configurar rapidamente clusters transientes de vários nós em uma API de serviços em nuvem para fins de desenvolvimento e teste, portanto, embora eu não esteja totalmente disposto a explorar uma solução baseada em DNS (ou outra alternativa), gerenciar /etc/hosts desta maneira (se possível) é uma solução muito mais simples com muito menos partes móveis.

SOLUÇÃO: Postado aqui como referência é o meu código final:

class my_hosts(
  $hosts = {
    'localhost.localdomain' => {
      'ensure'       => 'present',
      'name'         => 'localhost.localdomain',
      'host_aliases' => 'localhost',
      'ip'           => '127.0.0.1',
    },
  },
  ) {

  create_resources host, $hosts

}

E então meu ENC YAML se parece com isso:

classes:
  my_hosts:
    hosts:
      www1.example.com:
        ensure: present
        name: www1.example.com
        host_aliases: www1
        ip: 10.0.0.101
      www2.example.com:
        ensure: present
        name: www2.example.com
        host_aliases: www2
        ip: 10.0.0.102
    
por Chris Tonkinson 28.02.2014 / 12:35

1 resposta

5

ad 1 & 2:

host {
  'front-01': ip => '192.168.1.103';
  'front-02': ip => '192.168.1.106';
}

é apenas uma notação abreviada para

host { 'front-01':
  ip => '192.168.1.103',
}
host { 'front-02':
  ip => '192.168.1.106',
}

anúncio 3:

Quando você tem uma entrada de dados YAML assim:

custom_hosts:
  www1:
    ip: 1.2.3.4
  www2:
    ip: 1.2.3.5
    comment: other attributes work also
  www3:
    name: testserver
    ip: 1.2.3.6

você pode carregá-lo em um hash de fantoche e criar recursos dele

$custom_hosts = hiera('custom_hosts',{})
create_resources(host, $custom_hosts)

Isso produz o mesmo resultado que:

host { 'www1':
  ip => '1.2.3.4',
}
host { 'www2':
  ip      => '1.2.3.5',
  comment => 'other attributes work also',
}
host { 'www3':
  name => 'testserver',
  ip   => '1.2.3.6',
}

Portanto, essas linhas devem ser gravadas em / etc / hosts:

1.2.3.4 www1
1.2.3.5 www2 # other attributes work also
1.2.3.6 testserver
    
por 07.03.2014 / 17:17