Vagrant chef_solo provisioner 引发 NoMethodError - #<Hash: ....> 的未定义方法 'default_attributes'
Vagrant chef_solo provisioner raising NoMethodError - undefined method 'default_attributes' for #<Hash: ....>
我正在尝试使用 Vagrant 提供 VM 以测试我创建的食谱 (chef-mycookbooks-test)。这取决于 chef-repo 中的 data_bags。我找不到任何关于为什么这不起作用的答案。
VM 启动正常,但在 运行s chef-solo:
时抛出异常
INFO: Setting the run_list to ["recipe[mycookbooks-test::default]"] from CLI options
DEBUG: Applying attributes from json file
Error expanding the run_list:
NoMethodError: undefined method `default_attributes' for #<Hash:0x0000000384e3a7>
我不知道这是否重要,但我使用的环境 (local.json) 已定义 default_attributes。当我登录到 VM 并查看 solo.rb 时,我看到了我的配置中的一些数据(例如环境 "local")但不是全部(例如没有角色设置,默认 cookbook_path, role_path 是 [])。当我尝试从 VM 手动 运行 chef-solo 时出现相同的错误。
主机上的目录结构:
.
├── chef-repo
│ ├── data_bags
│ │ ├── groups
│ │ │ └── test.json
│ │ └── users
│ │ └── test.json
│ ├── environments
│ │ └── local.json
│ └── roles
│ └── test_server.json
└── chef-mycookbooks-test
├── Berksfile
├── Berksfile.lock
├── Vagrantfile
├── files
│ └── default
│ └── sudoers.test
├── metadata.rb
└── recipes
└── default.rb
流浪文件:
Vagrant.configure("2") do |config|
config.omnibus.chef_version = :latest
config.vm.box = "hansode/centos-6.3-x86_64"
config.berkshelf.enabled = true
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ".."
chef.data_bags_path = "../chef-repo/data_bags"
chef.environments_path = "../chef-repo/environments"
chef.environment = "local"
chef.roles_path = "../chef-repo/roles"
chef.add_role("test_server")
chef.run_list = [
"recipe[mycookbooks-test::default]"
]
end
end
有趣的是,如果我删除定义 chef.environment 的行,run_list 会很好地扩展到 [mycookbooks-test::default],但是 chef-solo 稍后在尝试 运行 一些依赖,需要环境数据。
如有任何帮助,我们将不胜感激。我完全没有想法。
注意:为了清楚起见,我清理了目录树(例如 README.md)和 Vagrantfile(例如调试级别)中一些不必要的东西。
像cookbooks_path
这样的东西是相对于主机的,而不是来宾。您确定 /
真的有您的食谱吗?您可能正在加载一堆无效数据,而 Chef 对此感到窒息。您还可以通过 chef.log_level = :debug
.
提高您的日志记录级别
我正在尝试使用 Vagrant 提供 VM 以测试我创建的食谱 (chef-mycookbooks-test)。这取决于 chef-repo 中的 data_bags。我找不到任何关于为什么这不起作用的答案。
VM 启动正常,但在 运行s chef-solo:
时抛出异常INFO: Setting the run_list to ["recipe[mycookbooks-test::default]"] from CLI options
DEBUG: Applying attributes from json file
Error expanding the run_list:
NoMethodError: undefined method `default_attributes' for #<Hash:0x0000000384e3a7>
我不知道这是否重要,但我使用的环境 (local.json) 已定义 default_attributes。当我登录到 VM 并查看 solo.rb 时,我看到了我的配置中的一些数据(例如环境 "local")但不是全部(例如没有角色设置,默认 cookbook_path, role_path 是 [])。当我尝试从 VM 手动 运行 chef-solo 时出现相同的错误。
主机上的目录结构:
.
├── chef-repo
│ ├── data_bags
│ │ ├── groups
│ │ │ └── test.json
│ │ └── users
│ │ └── test.json
│ ├── environments
│ │ └── local.json
│ └── roles
│ └── test_server.json
└── chef-mycookbooks-test
├── Berksfile
├── Berksfile.lock
├── Vagrantfile
├── files
│ └── default
│ └── sudoers.test
├── metadata.rb
└── recipes
└── default.rb
流浪文件:
Vagrant.configure("2") do |config|
config.omnibus.chef_version = :latest
config.vm.box = "hansode/centos-6.3-x86_64"
config.berkshelf.enabled = true
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ".."
chef.data_bags_path = "../chef-repo/data_bags"
chef.environments_path = "../chef-repo/environments"
chef.environment = "local"
chef.roles_path = "../chef-repo/roles"
chef.add_role("test_server")
chef.run_list = [
"recipe[mycookbooks-test::default]"
]
end
end
有趣的是,如果我删除定义 chef.environment 的行,run_list 会很好地扩展到 [mycookbooks-test::default],但是 chef-solo 稍后在尝试 运行 一些依赖,需要环境数据。
如有任何帮助,我们将不胜感激。我完全没有想法。
注意:为了清楚起见,我清理了目录树(例如 README.md)和 Vagrantfile(例如调试级别)中一些不必要的东西。
像cookbooks_path
这样的东西是相对于主机的,而不是来宾。您确定 /
真的有您的食谱吗?您可能正在加载一堆无效数据,而 Chef 对此感到窒息。您还可以通过 chef.log_level = :debug
.