Como configurar: datadir: ao usar o Hiera com Puppet e Vagrant

10

Eu gostaria de saber como configurar :datadir:no hiera.yamlpara uma utilização óptima com fantoche e Vagrant. Atualmente, estou usando o vagrant 1.5.0 com o virtualbox 4.2 no Ubuntu 13.10 com um convidado do Ubuntu 12.04 executando o fantoche 3.1.1

Estou tentando configurar um ambiente semelhante a este post do blog, Puppet Best Practices: Configurações específicas do ambiente . Especificamente, meu Vagrantfile contém:

  config.vm.define "servername" do |servername|
    servername.vm.box = "precise-puppet-3"
    servername.vm.network "private_network", ip: "192.168.213.2",
      virtualbox__intnet: "networkname"

    # Provision with puppet.
    servername.vm.provision :puppet do |puppet|
      puppet.hiera_config_path = "puppet/hiera.yaml"
      puppet.manifests_path = "puppet/manifests"
      puppet.module_path = "puppet/modules"
      puppet.manifest_file  = "servername.pp"
      puppet.facter = {
        "vagrant" => "1",
        "server" => "servername",
      }
    end
  end

Posso confirmar que hiera_config_pathestá correto, pois recebo um erro se excluir hiera.yaml.

puppet/hiera.yaml contém:

---
:backends: yaml
:yaml:
  :datadir: "manifests/configuration"
:hierarchy:
  - "%{::clientcert}"
  - "%{::environment}"
  - "virtual_%{::is_virtual}"
  - common
:logger: console

E, além disso, puppet/manifests/configuration/common.yamlcontém:

---
myvar: "test"

Testando isso na linha de comando:

$ hiera -c hiera.yaml myvar
test

Por enquanto, tudo bem. No entanto, se eu tentar testar isso de dentro de um arquivo de manifesto de fantoches, a variável não poderá ser encontrada e recebo um erro. Exemplo de teste:

$myvariable = hiera(myvar)
notice("My variable is: ${myvar}")

O erro é:

Error: Could not find data item myvar in any Hiera data file and no default supplied at...

Se eu entrar na minha máquina via vagrant ssh, posso ver que o Vagrant está montando meu diretório de manifesto em / tmp / vagrant-puppet-2. Se eu editar o hiera.yamlarquivo e substituí :datadir:-lo pelo caminho completo /tmp/vagrant-puppet-2/manifests/configuration, meus manifestos do Puppet poderão acessar meus dados do Hiera. Posso fazer isso com um caminho relativo?

greg_1_anderson
fonte

Respostas:

9

Encontrei a solução enquanto documentava minha pergunta. Alteração: datadir: para ler:

  :datadir: "%{settings::manifestdir}/configuration"

O Puppet fornecerá o caminho para o diretório do manifesto em $ settings :: manifestdir. Armazenar os dados do Hiera dentro do diretório de manifesto é útil porque o Vagrant irá montar esse diretório explicitamente antes de executar o Puppet no sistema convidado, e outros diretórios que você selecionar para esse fim podem não estar disponíveis.

greg_1_anderson
fonte
Isso significa que eu preciso de 2 hiera.yamlarquivos, um para uso com vagrant e outro para uso com Puppet (em produção)?
Felipe Alvarez
Eu só tive um arquivo hiera.yaml. Não estou mais usando essa configuração, mas acredito que a técnica nesta resposta não funcione mais nas versões recentes do Puppet. Se você tiver problemas com isso, consulte algumas das outras respostas.
greg_1_anderson
2

O que hiera.yamleu estou trabalhando especifica :datadir: /etc/puppet/hierae não tive sorte em definir a --yamldiropção, como algumas das outras respostas especificadas. No entanto, percebi depois de um tempo que era possível mapear meus hieradados para esse local na vm convidada:

config.vm.synced_folder "../puppet/hiera", "/etc/puppet/hiera"

Isso funciona muito bem :-)

Stig Brautaset
fonte
Essa foi exatamente a configuração que eu tinha. Criei uma pasta mapeada config.vm.synced_folder("D:/branches/preprod/hieradata", "/etc/puppet/hieradata")e também especifiquei puppet.hiera_config_path = "D:/branches/preprod/hiera.yaml"em estrofes de configuração de fantoches.
Felipe Alvarez
1

É o que estou fazendo em meus próprios experimentos de marionetes.

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "puppetlabs/debian-7.8-64-puppet" # source box on atlas
  config.vm.hostname = "wheezybox"                  # hostname of box

  # Include Hiera Data Directory (no automatic option for this)
  config.vm.synced_folder "../../hieradata", "/tmp/vagrant-puppet/hieradata"

  # Puppet Configuration
  config.vm.provision :puppet do |puppet|
    puppet.manifests_path    = "../../manifests/"
    puppet.manifest_file     = "site.pp"
    puppet.module_path       = ["../../modules/"]    # shared modules
    puppet.hiera_config_path = "../../hiera.yaml"    # hiera config file
    puppet.working_directory = "/tmp/vagrant-puppet" # default hiera path
    puppet.options           = "--verbose --debug"
  end
end

Meu hiera.yaml minimalista fica assim:

---
:backends:
  - yaml
:yaml:
  :datadir: "hieradata"
:hierarchy:
  - "node/%{::hostname}"

E para fins de ilustração, minha estrutura de diretórios no host (MacBook) é semelhante a esta:

    .
    ├── hiera.yaml
    ├── hieradata
    │   └── node
    │       ├── centos6box.yaml
    │       ├── precisebox.yaml
    │       └── wheezybox.yaml
    ├── manifests
    │   └── site.pp
    ├── modules -> ../puppet-common/modules/
    └── vagrants
        ├── README.md
        ├── centos6
        │   └── Vagrantfile
        ├── precise
        │   └── Vagrantfile
        └── wheezy
            └── Vagrantfile
Joaquin Menchaca
fonte
0

Seu problema original foi / :datadirprecisa ser um caminho absoluto. O Hiera não permite que você especifique caminhos relativos para o :datadir. Se você acha que isso deve ser permitido, envie uma solicitação para alterá-lo .

O manifestdir está obsoleto . Você pode preferir usar o yamldir . Você pode substituir essa configuração quando passar na aplicação de bonecos.

Para vagrant:

 servername.vm.provision :puppet, :options => ["--yamldir some/absolute/path"]  do |puppet|
  puppet.hiera_config_path = "puppet/hiera.yaml"
  puppet.manifests_path = "puppet/manifests"
  puppet.module_path = "puppet/modules"
  puppet.manifest_file  = "servername.pp"
  puppet.facter = {
    "vagrant" => "1",
    "server" => "servername",
  }
end

ATUALIZAÇÃO : Como você precisa fornecer um caminho absoluto (e porque é vagante), configure sua própria pasta compartilhada para ser explícito sobre onde está e não fazer suposições sobre um caminho definido para a execução de fantoches. Adicione isso ao seu Vagrantfile:

config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"

e altere a primeira linha acima para:

servername.vm.provision :puppet, :options => ["--yamldir /hieradata"]  do |puppet|
ferventcoder
fonte
Obrigado pela referência a --yamldir; isso é muito útil. A questão, no entanto, é que eu preciso usar um caminho relativo. Se eu colocasse um caminho absoluto, teria que usar ["--yamldir / tmp / vagrant-puppet-2 / manifestests / configuration"]; no entanto, não posso confiar que / tmp / vagrant-puppet-2 seja um caminho estável. Existe uma variável que eu possa referenciar no arquivo Vagrant que contém esse caminho? Ou posso definir alguma variável para estipular qual caminho usar em vez de / tmp / vagrant-puppet-2? Qualquer coisa que evite fazer suposições sobre quais caminhos o Vagrant vai usar funcionaria.
greg_1_anderson 24/02
@ greg_1_anderson, você pode definir seus próprios diretórios, dessa maneira você é explícito sobre o diretório e não faz suposições sobre vagrant. config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"
Ferventcoder
Atualizado a resposta. Além disso, se você acha que esse caminho relativo seria útil, crie um ticket em tickets.puppetlabs.com/browse/HI - obrigado!
Ferventcoder
O Puppet permite caminhos relativos para a configuração do hiera datadir durante a execução puppet apply. O datadir será relativo ao diretório atual em que o Puppet foi executado.
28416 Nathan