O provisionador de marionetes do Vagrant não está lendo o backend hiera.yaml corretamente?

3

Eu tenho um problema de marionete que é específico para o modo como o Vagrant usa o manifests / modules / hiera-config com seu provisionador de fantoches, já que um "fantoche aplicar site.pp" funciona bem na máquina virtual implementada localmente no sistema operacional convidado em si). No diretório com o Vagrantfile eu tenho um subdiretório "puppet_files" com os manifestos, módulos e arquivos hiera que serão copiados para / etc / puppet na VM (eu uso um módulo puppet com diretivas "file" para copiar esses arquivos lá ).

Meu ambiente de host é o OSX e estou usando o vagrant para implantar o Centos 6 no VirtualBox.

Informações básicas:

Quando eu digito "vagrant up", vejo isso para começar:

==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Mounting shared folders...
    default: /vagrant => /Users/juser/vm_stuff/vagrant-fresh
    default: /tmp/vagrant-puppet-1/manifests => /Users/juser/vm_stuff/vagrant-fresh/puppet_files/manifests
    default: /tmp/vagrant-puppet-1/modules-0 => /Users/juser/vm_stuff/vagrant-fresh/puppet_files/modules
==> default: Running provisioner: shell...

Portanto, parece que ele cria arquivos temporários no meu sistema de arquivos OSX e copia os diretórios / arquivos de origem de onde eu especifiquei no Vagrantfile. Na própria VM, o diretório de fantoches é apropriadamente montado como / vagrant / puppet_files. Aqui está a seção relevante do Vagrantfile para a configuração do boneco:

config.vm.provision "puppet" do |puppet|
    puppet.manifests_path = "puppet_files/manifests"
    puppet.module_path    = "puppet_files/modules"
    puppet.hiera_config_path = "puppet_files/hiera_config/hiera.yaml"
    puppet.manifest_file  = "site.pp"
    puppet.options = "--verbose --debug"
  end

O site.pp tem apenas duas linhas de importância (chamando dois módulos):

include ::hierasetup
include ::jboss

E o arquivo hiera.yaml tem esta aparência:

:backends:
        - json

:logger: console

:hierarchy:
        - "node/%{::fqdn}"
        - common

:json:
    :datadir: '/etc/puppet/hieradata/'

E meu módulo de hierasetup (chamado em site.pp) também copia um arquivo json hiera para /etc/puppet/hieradata/common.json. E apenas FYI o módulo jboss é o módulo que tenta usar hiera com um "hiera_hash" e "create_resources" (que funciona bem quando aplicado localmente / manualmente na VM Linux).

O problema:

O Vagrant não tem problemas para importar os manifestos e módulos e até mesmo aplicar o manifesto, mas ele constantemente falha em ler o meu arquivo hiera.yaml (corretamente?), porque se o fizesse veria que eu especifiquei json e não yaml como backend:

Debug: importing '/tmp/vagrant-puppet-1/modules-0/hierasetup/manifests/init.pp' in environment production
Debug: Automatically imported hierasetup from hierasetup into production
Debug: importing '/tmp/vagrant-puppet-1/modules-0/jboss/manifests/init.pp' in environment production
Debug: Automatically imported jboss from jboss into production
Debug: hiera(): Hiera YAML backend starting
Debug: hiera(): Looking up jbossas in YAML backend
Debug: hiera(): Looking for data source common
Debug: hiera(): Cannot find datafile /var/lib/hiera/common.yaml, skipping

Error: create_resources(): second argument must be a hash at /tmp/vagrant-puppet-1/modules-0/jboss/manifests/init.pp:14 on node josh-new.morgan.haib.org
Wrapped exception:
create_resources(): second argument must be a hash

Error: create_resources(): second argument must be a hash at /tmp/vagrant-puppet-1/modules-0/jboss/manifests/init.pp:14 on node josh-new.morgan.haib.org
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

puppet apply --verbose --debug --modulepath '/tmp/vagrant-puppet-1/modules-0:/etc/puppet/modules' --hiera_config=/tmp/vagrant-puppet-1/hiera.yaml --manifestdir /tmp/vagrant-puppet-1/manifests --detailed-exitcodes /tmp/vagrant-puppet-1/manifests/site.pp || [ $? -eq 2 ]

Por que está procurando por common.yaml e não /etc/puppet/hieradata/common.json? Por que ele acha que é um backend do YAML e não um JSON? Ele não está lendo o meu arquivo hiera.yaml (que eu dei o caminho relativo correto para o Vagrantfile) e operando em algum tipo de padrão?

Resumindo: O "fantoche aplicar site.pp" funciona perfeitamente se eu estiver no ambiente Linux na VM aplicando-o localmente, mas não funciona "o jeito Vagrant" com o aparelho de fantoches. Eu devo estar faltando alguma coisa sobre como a configuração hiera funciona para o Vagrant.

    
por SeligkeitIstInGott 19.06.2014 / 00:34

1 resposta

2

Ok, parece que me deparei com dois problemas diferentes. O maior problema era que, embora eu tivesse um módulo que eu criei chamado "hieraconfig" que copiava meus arquivos hiera.yaml e common.json pré-criados para / etc / puppet, o módulo jboss que chama hiera estava sendo executado primeiro (embora eu incluísse depois de hieraconfig em manifesto - veja abaixo). Eu tentei corrigir isso para avaliar hierasetup primeiro no manifesto site.pp, mas ele ainda executava o módulo jboss primeiro:

stage { 'pre':
  before => Stage['main']
}

# add the hierasetup module to the new 'pre' run stage
class { 'hierasetup':
  stage => 'pre'
}

include ::hierasetup
include ::jboss

Não tenho correção atual para isso. Mas pelo menos eu sei que parte da falha foi que /etc/puppet/hiera.yaml e /etc/puppet/hieradata/common.json nem estavam presentes na VM quando o hiera estava sendo chamado pelo módulo jboss, já que o hierasetup não tinha corrido ainda. Eu fiz este trabalho temporariamente usando o provisionador de script do Vagrant em vez do fantoche para copiar os arquivos para mim.

O segundo problema foi que porque eu pensei que esses arquivos estavam presentes o tempo todo eu fiquei bastante confuso sobre o que "puppet.hiera_config_path" deveria fazer. Através de várias tentativas de tentativa e erro, aqui está o que descobri:

  1. puppet.manifests_path , puppet.modules_path e puppet.hiera_config_path aponta apenas para caminhos na máquina host (em meu caso no OSX). Não se engane em pensar, se você usar caminhos relativos, que é relativo à montagem / vagrant na VM, e não melhor em relação ao diretório que contém o seu Vagrantfile no máquina host (embora isso é obviamente o que é montado para /vagabundo).

  2. Cada uma dessas variáveis _path , SE e SOMENTE, se forem realmente no Vagrantfile (caso contrário, os diretórios de fantoches padrão serão pesquisado), fará com que o Vagrant copie os módulos, manifestos e hiera config para subdiretórios sob / tmp / vagrant-puppet [-X] (com -X possivelmente sendo um sufixo numérico adicional como / tmp / vagrant-puppet-1) e diga ao fantoche para olhar em / tmp para eles.

    Se você já tem arquivos de fantoches na VM que deseja use mas defina as variáveis _path então o comando puppet do Vagrant é não vai encontrá-los, porque redireciona o boneco para / tmp / vagrant-puppet [-X] quando você os define. Você não pode mudar isso destino na VM, embora a saída "vagrant up" notifique você onde eles estão sendo mapeados assim:

    padrão: / tmp / vagrant-puppet-1 / manifests = > / Users // vm_stuff / vagrant-fresh / puppet_files / manifests

    padrão: / tmp / vagrant-puppet-1 / modules-0 = > / Users // vm_stuff / vagrant-fresh / puppet_files / modules

    O caminho após o = > arrow é o diretório de origem em seu host máquina que você especificou com as variáveis _path no Vagrantfile. O caminho antes do = > arrow é a localização na VM onde o conteúdo do diretório de origem será copiado.

    Se você preferir que o Vagrant tenha um visual fantoche em default diretórios para arquivos que você já colocou na VM (que você não precisa ser copiado pelo Vagrant para você em / tmp) então não especifique qualquer variável _path no Vagrant. Alternadamente, se nem o locais padrão ou a localização / tmp são satisfatórios você pode substituir completamente o comportamento padrão do Vagrant explicitamente especificando onde procurar cada um com as puppet.options variável, assim:

    puppet.options="--hiera_config = / caminho / para / hiera.yaml --modulepath '/ path / to / modules / --manifestdir / path / to / manifests / "

Se algo falhar e você tiver definido --verbose & & --debug como parte do arquivo puppet.options (possivelmente ele será mostrado sem o conjunto também) você receberá um erro mostrando o comando puppet enviado via ssh para a VM guest, assim:

The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

puppet apply --verbose --debug --modulepath '/tmp/vagrant-puppet-1/modules-0:/etc/puppet/modules' --manifestdir /tmp/vagrant-puppet-1/manifests --hiera_config=/tmp/vagrant-puppet-1/hiera.yaml --detailed-exitcodes /tmp/vagrant-puppet-1/manifests/site.pp || [ $? -eq 2 ]

Desde que --hiera_config esteja apontando para o local / arquivo correto neste comando, ele deve ler sua configuração sem problemas. Eu tive um problema temporariamente (antes que eu descobrisse que /etc/puppet/hieradata/common.json não estava presente na VM) para onde ele iria ler o hiera.yaml mas depois falhava porque o common.json estava ausente.

Tudo dito e feito embora hiera olha em locais muito específicos, dependendo se você definir " puppet.hiera_config_path " ou não, a menos que você substituir manualmente o puppet.options.

    
por 20.06.2014 / 01:28