Cómo configurar: datadir: cuando se usa Hiera con Puppet y Vagrant

10

Me gustaría saber cómo configurar :datadir:en hiera.yamlpara un uso óptimo con la marioneta y el vagabundo. Actualmente estoy usando vagrant 1.5.0 con virtualbox 4.2 en Ubuntu 13.10 con un invitado Ubuntu 12.04 ejecutando puppet 3.1.1

Estoy tratando de configurar un entorno similar a esta publicación de blog, Mejores prácticas de Puppet: configuraciones específicas del entorno . Específicamente, mi Vagrantfile contiene:

  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

Puedo confirmar que hiera_config_pathes correcto, porque recibo un error si lo borro hiera.yaml.

puppet/hiera.yaml contiene:

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

Y, además, puppet/manifests/configuration/common.yamlcontiene:

---
myvar: "test"

Probar esto desde la línea de comandos:

$ hiera -c hiera.yaml myvar
test

Hasta ahora tan bueno. Sin embargo, si trato de probar esto desde un archivo de manifiesto de la marioneta, no se puede encontrar la variable y aparece un error. Prueba de ejemplo:

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

El error es:

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

Si accedo a mi máquina mediante vagrant ssh, puedo ver que Vagrant está montando mi directorio de manifiesto en / tmp / vagrant-puppet-2. Si edito el hiera.yamlarchivo y lo reemplazo :datadir:con la ruta completa /tmp/vagrant-puppet-2/manifests/configuration, mis manifiestos de Puppet pueden acceder a mis datos de Hiera. Sin embargo, ¿puedo hacer esto con una ruta relativa?

greg_1_anderson
fuente

Respuestas:

9

Encontré la solución mientras documentaba mi pregunta. Cambio: datadir: para leer:

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

Puppet proporcionará la ruta al directorio de manifiesto en $ settings :: manifestdir. El almacenamiento de los datos de Hiera dentro del directorio de manifiesto es útil porque Vagrant montará este directorio explícitamente antes de ejecutar Puppet en el sistema invitado, y es posible que otros directorios que seleccione para este propósito no estén disponibles.

greg_1_anderson
fuente
¿Significa esto que necesito 2 hiera.yamlarchivos, uno para usar con vagabundo y otro para usar con Puppet (en producción)?
Felipe Alvarez
Solo tuve un archivo hiera.yaml. Ya no estoy usando esta configuración, pero creo que la técnica en esta respuesta ya no funciona en versiones recientes de Puppet. Si tiene problemas con esto, vea algunas de las otras respuestas.
greg_1_anderson
2

El hiera.yamlque estoy trabajando especifica :datadir: /etc/puppet/hieray no tuve suerte con la configuración de la --yamldiropción como algunas de las otras respuestas especificadas. Sin embargo, me di cuenta después de un tiempo que podía asignar mi hieradata a esa ubicación en el vm invitado:

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

Esto funciona muy bien :-)

Stig Brautaset
fuente
Esta fue exactamente la configuración que tuve. Creé una carpeta asignada config.vm.synced_folder("D:/branches/preprod/hieradata", "/etc/puppet/hieradata")y también especifiqué puppet.hiera_config_path = "D:/branches/preprod/hiera.yaml"en las estrofas de configuración de títeres.
Felipe Alvarez
1

Esto es lo que estoy haciendo en mis propios experimentos con títeres.

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

Mi minimalista hiera.yaml se ve así:

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

Y con fines ilustrativos, la estructura de mi directorio en el host (MacBook) se ve así:

    .
    ├── 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
Joaquín Menchaca
fuente
0

Su problema original era / es que :datadirdebe ser un camino absoluto. Hiera no le permite especificar rutas relativas para :datadir. Si cree que esto debería permitirse, envíe una solicitud para cambiarlo .

manifestdir está en desuso . Es posible que prefiera usar yamldir en su lugar. Puede anular esa configuración cuando pasa la aplicación de marionetas.

Para vagabundo:

 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

ACTUALIZACIÓN : dado que debe proporcionar una ruta absoluta (y porque es vagabundo), debe configurar su propia carpeta compartida para que pueda ser explícito sobre dónde está y no hacer suposiciones en una ruta de conjunto vagabundo para la ejecución de títeres. Agregue esto a su Vagrantfile:

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

y luego cambie la primera línea de arriba a:

servername.vm.provision :puppet, :options => ["--yamldir /hieradata"]  do |puppet|
ferventcoder
fuente
Gracias por la referencia a --yamldir; Eso es muy útil. Sin embargo, el problema es que necesito usar una ruta relativa. Si pongo una ruta absoluta, tendría que usar ["--yamldir / tmp / vagrant-puppet-2 / manifests / configuration"]; Sin embargo, no puedo confiar en que / tmp / vagrant-puppet-2 sea un camino estable. ¿Hay alguna variable a la que pueda hacer referencia en el Vagrantfile que contiene esta ruta? ¿O puedo establecer alguna variable para estipular qué ruta usar en lugar de / tmp / vagrant-puppet-2? Cualquier cosa que evite hacer suposiciones sobre qué caminos va a utilizar Vagrant funcionaría.
greg_1_anderson
@ greg_1_anderson puede configurar sus propios directorios, de esa manera es explícito sobre el directorio y no hace suposiciones sobre vagabundo. config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"
ferventcoder
Se actualizó la respuesta. Además, si cree que esa ruta relativa sería útil, cree un ticket en tickets.puppetlabs.com/browse/HI , ¡gracias!
ferventcoder
Puppet sí permite rutas relativas para la configuración de hiera datadir cuando se ejecuta puppet apply. El datadir será relativo al directorio actual donde se ejecutó Puppet.
Nathan