【问题标题】:Vagrant chef_solo provisioner raising NoMethodError - undefined method 'default_attributes' for #<Hash: ....>Vagrant chef_solo 供应商引发 NoMethodError - #<Hash: ....> 的未定义方法“default_attributes”
【发布时间】:2015-01-22 23:59:22
【问题描述】:

我正在尝试使用 Vagrant 配置 VM 以测试我创建的食谱 (chef-mycookbooks-test)。它取决于 chef-repo 中的 data_bags。我找不到任何关于为什么这不起作用的答案。

VM 启动正常,但在运行 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 时,我看到了来自我的配置的一些数据(例如,环境“本地”)但不是全部(例如,没有设置角色,默认的 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(例如调试级别)中的一些不必要的东西。

【问题讨论】:

    标签: json vagrant chef-infra provisioning chef-solo


    【解决方案1】:

    cookbooks_path 这样的东西是相对于主机的,而不是客户机。你确定你真的在/ 有你的食谱吗?您可能正在加载一堆无效数据,而 Chef 对此感到窒息。您还可以通过chef.log_level = :debug 提高您的日志记录级别。

    【讨论】:

    • 对不起,我应该提到我清理了文件中的一些内容以便于阅读。我确实将日志级别设置为调试,并且我正在测试食谱路径,但最初将其设置为“..”。我已经在我的原始帖子中修复了这两个问题。谢谢。
    • 你还有chef.roles_path = "/chef-repo/roles"。你的东西真的在/chef-repo吗?
    • 谢谢,我想我认为这些东西与 VM 上的位置有关(因此同步了我的 chef-repo)。我猜 Vagrant 会处理这些事情。我将 data_bags_path 和 roles_path 更改为相对于主机,但仍然出现相同的错误。
    • 您的角色 JSON 是否包含必需的 json_classchef_type 键?
    • 它不在环境中。添加 ..."json_class": "Chef::Environment", "chef_type": "environment",... 到环境 JSON 并修复它。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    相关资源
    最近更新 更多