web-dev-qa-db-ja.com

PuppetとVagrantでHieraを使用する場合の:datadir:のセットアップ方法

PuppetとVagrantで最適に使用するために:datadir:hiera.yamlを設定する方法を教えてください。現在、puppet 3.1.1を実行しているUbuntu 12.04ゲストでUbuntu 13.10上のvirtualbox 4.2を使用してvagrant 1.5.0を使用しています

このブログ投稿 Puppetのベストプラクティス:環境固有の構成 のような環境をセットアップしようとしています。具体的には、私のVagrantfileには以下が含まれます。

  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

hiera_config_pathを削除するとエラーが発生するため、hiera.yamlが正しいことを確認できます。

puppet/hiera.yamlに含まれるもの:

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

さらに、puppet/manifests/configuration/common.yamlには以下が含まれます:

---
myvar: "test"

コマンドラインからこれをテストする:

$ hiera -c hiera.yaml myvar
test

ここまでは順調ですね。ただし、puppetマニフェストファイル内からこれをテストしようとすると、変数が見つからず、エラーが発生します。テストの例:

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

エラーは:

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

vagrant sshを介してsshでマシンにログインすると、Vagrantがマニフェストディレクトリを/ tmp/vagrant-puppet-2にマウントしていることがわかります。 hiera.yamlファイルを編集し、:datadir:をフルパス/tmp/vagrant-puppet-2/manifests/configurationに置き換えると、PuppetマニフェストがHieraデータにアクセスできます。相対パスでこれを行うことはできますか?

10
greg_1_anderson

質問を文書化しているときに解決策を見つけました。 :datadir:を次のように変更します。

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

Puppetは$ settings :: manifestdirのマニフェストディレクトリへのパスを提供します。 VagrantはゲストシステムでPuppetを実行する前にこのディレクトリを明示的にマウントし、この目的のために選択した他のディレクトリが利用できない場合があるため、マニフェストディレクトリ内にHieraデータを保存すると便利です。

9
greg_1_anderson

hiera.yaml私は指定を使用しています:datadir: /etc/puppet/hieraと私は--yamldirオプションを他の回答の一部として指定。しかし、しばらくすると、hieradataをゲストvmのその場所にマッピングするだけでよいことがわかりました。

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

これはうまく動作します:-)

2
Stig Brautaset

これは私が自分の人形の実験でやっていることです。

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

私のミニマリストhiera.yamlは次のようになります。

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

説明のために、ホスト(MacBook)のディレクトリ構造は次のようになっています。

    .
    ├── 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
1

元の問題は:datadirが絶対パスである必要があるということでした。 Hieraでは、:datadirの相対パスを指定できません。これを許可する必要があると思われる場合は、 変更のリクエストを送信 してください。

manifestdirは 非推奨 です。代わりに yamldir を使用することをお勧めします。 puppet applyを渡すと、その設定をオーバーライドできます。

浮浪者の場合:

 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

[〜#〜] update [〜#〜]:絶対パスを指定する必要があるため(そしてvagrantのため)、独自のパスを設定する必要があります共有フォルダー。これにより、どこにあるかを明示でき、人形の実行用の浮浪者セットのパスを想定しません。これをVagrantfileに追加:

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

上記の最初の行を次のように変更します。

servername.vm.provision :puppet, :options => ["--yamldir /hieradata"]  do |puppet|
0
ferventcoder