Vagrant 厨师运行列表为空。厨师零流浪食品供应员

Vagrant 厨师运行列表为空。厨师零流浪食品供应员,vagrant,chef-infra,provisioning,vagrantfile,chef-zero,Vagrant,Chef Infra,Provisioning,Vagrantfile,Chef Zero,我正在尝试设置Chef Zero provisioner以从节点JSON文件执行运行列表。这就是我的流浪汉档案 # -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSIO

我正在尝试设置Chef Zero provisioner以从节点JSON文件执行运行列表。这就是我的流浪汉档案

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu-14.04_Base_image"

  config.vm.hostname = "app_node"
  config.omnibus.chef_version = '12.0.3'


  config.vm.provision "chef_zero" do |chef|
    chef.cookbooks_path = ["../kitchen/cookbooks", "../kitchen/site-cookbooks"]
    chef.roles_path = "../kitchen/roles"
    chef.data_bags_path = "../kitchen/data_bags"
    chef.nodes_path = "../kitchen/nodes"
    chef.node_name = "app_node"
  end
end
当我运行vagrant up时,我从chef zero provisioner获得以下输出

==> default: Running provisioner: chef_zero...
==> default: Detected Chef (latest) is already installed
Generating chef JSON and uploading...
==> default: Warning: Chef run list is empty. This may not be what you want.
==> default: Running chef-zero...
==> default: stdin: is not a tty
==> default: [2015-01-08T01:19:51+00:00] INFO: Started chef-zero at http://localhost:8889 with repository at /tmp/vagrant-chef/bec99a1a4e96279669bc5bb3140c0f2e, /tmp/vagrant-chef/2cbca02c0b5c49646d765ae1c9c0738f
==> default:   One version per cookbook
==> default:   data_bags at /tmp/vagrant-chef/72ac2a17a7c339d91d27a954fc49f8c3/data_bags
==> default:   nodes at /tmp/vagrant-chef/83a9002a19a985bce4d26b8c9d050540/nodes
==> default:   roles at /tmp/vagrant-chef/9cdb44a6dfefce6070b32ff28cb96535/roles
==> default: [2015-01-08T01:19:51+00:00] INFO: Forking chef instance to converge...
==> default: [2015-01-08T01:19:51+00:00] INFO: *** Chef 12.0.3 ***
==> default: [2015-01-08T01:19:51+00:00] INFO: Chef-client pid: 1731
==> default: [2015-01-08T01:19:57+00:00] INFO: Run List is []
==> default: [2015-01-08T01:19:57+00:00] INFO: Run List expands to []
==> default: [2015-01-08T01:19:57+00:00] INFO: Starting Chef Run for jira
==> default: [2015-01-08T01:19:57+00:00] INFO: Running start handlers
==> default: [2015-01-08T01:19:57+00:00] INFO: Start handlers complete.
==> default: [2015-01-08T01:19:59+00:00] INFO: Chef Run complete in 1.831177529 seconds
==> default: [2015-01-08T01:19:59+00:00] INFO: Skipping removal of unused files from the cache
==> default: [2015-01-08T01:19:59+00:00] INFO: Running report handlers
==> default: [2015-01-08T01:19:59+00:00] INFO: Report handlers complete
我的问题是为什么运行列表是空的?我在chef_zero provisioner中指定了节点目录和节点名称。指定“app_node”运行列表的JSON文件存在于nodes目录中,我可以看到chef正在将所有cookbook/nodes/roles文件正确复制到服务器


我觉得我错过了一些东西。任何帮助都将不胜感激。如果有任何不清楚的地方,请告诉我。

您没有指定跑步列表。您所说的目录是存储节点数据的地方,而不是获取JSON文件的地方。厨师不知道你现在想做什么

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu-14.04_Base_image"

  config.vm.hostname = "app_node"
  config.omnibus.chef_version = '12.0.3'


  config.vm.provision "chef_zero" do |chef|
    chef.cookbooks_path = ["../kitchen/cookbooks", "../kitchen/site-cookbooks"]
    chef.roles_path = "../kitchen/roles"
    chef.data_bags_path = "../kitchen/data_bags"
    chef.nodes_path = "../kitchen/nodes"
    chef.node_name = "app_node"
    chef.run_list = []
    chef.json = {}
  end
end
这应该允许您设置运行列表,并包括您希望包含在其中的任何JSON属性


如果你能满足你的需求,你可能会考虑更多的选择。p> 我不确定如何指定本地目录(仍在研究中),但当您在

chef.run\u list[“stuff”]
中的vagrant文件中指定此目录时,vagrant将放置一个
/tmp/vagrant chef/dna.json


它还创建了一个
solo.rb
,如果创建了
chef.node\u name
,它将插入node\u name之类的内容。

Vagrant不会就现有节点咨询chef。为了使用您编写的Chef节点文件,您需要告诉vagrant有关它的信息。在您的Vagrant文件中,将此行添加到行
chef.node\u name=“app\u node”
下:


一旦您这样做,Chef和Vagrant将在同一个位置查找节点配置数据。

Vagrant的
Chef_zero
provisioner实际上正在使用
Chef solo-c solo.rb-j dna.json
。您在
节点中的配置
仅用于装载目录

您可以通过这样做来解决这个问题(假设
节点/hostname.json
与放入
config.vm.hostname
中的名称相同):


注意,我只使用了
chef_solo
,作为运行
chef_zero
的目的,当它真正调用
chef_solo

时,指定运行列表的json文件看起来像什么(它是如何命名的)?我可能错了,因为我没有使用chef_zero,但是
nodes_路径
用于在运行结束时保存节点对象,而不是准备它。Vagrant使用从Vagrant文件生成的json文件覆盖运行列表,因此您应该在Vagrant文件中添加配方和角色,或者在Vagrant文件中使用
自定义json数据
选项(请参阅相关文档)。该文件名为“app_node.json”,看起来像这样“{”名称“:“app_node”,“platform”:“debian”,”postgresql:{'password':{“postgres”:“foobar”},“run_list”:[“role[foo],“recipe[auth],“recipe[postgres]”}。是否无法指向Vagrant文件以使用我的JSON文件中的属性和runlist?在我的节点目录中有一个文件“app_node.son”,类似于此。“{”name:“app_node”,“platform”:“debian”,“postgresql”:{'password':{“postgres”:“foobar”},“run_list”:[“角色[foo],“配方[auth],“配方[postgres]”}”因此,无法使用JSON文件中的运行列表和属性?我知道我可以简单地将JSON复制并粘贴到Vagrant文件中,但我希望将代表我节点的JSON文件与Vagrant文件分开。请尝试正确格式化您的答案(在右侧回答时有布局的艺术提示)因此用户可以轻松阅读:)
chef.json = JSON.parse(File.read("../kitchen/nodes/app_node.json"))
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-6.6"

  config.vm.hostname = "foobarhost"
  VAGRANT_JSON = JSON.parse(Pathname(__FILE__).dirname.join('../../nodes', "#{config.vm.hostname}.json").read)

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path  = ["../../cookbooks", "../../site-cookbooks"]
    chef.roles_path      = "../../roles"
    chef.data_bags_path  = "../../data_bags"
    chef.verbose_logging = true

    chef.run_list = VAGRANT_JSON.delete('run_list') if VAGRANT_JSON['run_list']
    # Add JSON Attributes
    chef.json = VAGRANT_JSON
  end
end