我正在与 Chef Solo(11.4.4 和 11.6.0)一起玩角色。有点困惑。
对于 Chef Solo 运行,角色应该用 Ruby 还是 JSON 编写?
根据官方文档:关于角色,角色可以存储为特定于域的 Ruby (DSL) 文件或 JSON 数据。
注意:
chef-client
使用 Ruby for Roles,当这些文件上传到 Chef 服务器时,它们会转换为 JSON。每当刷新 chef-repo 时,所有特定于域的 Ruby 文件的内容都会重新编译为 JSON 并重新上传到服务器。
我的问题是,如果需要在没有服务器的情况下以单人模式运行 Chef 并且需要角色,那么角色应该用 Ruby 还是 JSON 编写(我们没有将 Ruby 转换为 JSON 的服务器)?
我的猜测是后者。有人知道正确答案吗?
顺便说一句:我见过人们在角色文件中混合使用 Ruby 和 JSON ......
下面 rbenv.rb 的 Ruby DSL 等效项是什么?
例如,运行rbenv
+ ruby-build
cookbooks 在 Ubuntu 上安装 rbenv。
rbenv.json
{
"run_list": ["role[rbenv]"]
}
角色/rbenv.rb
name "rbenv"
description "rbenv + ruby-build"
run_list(
"recipe[rbenv]",
"recipe[ruby_build]"
)
override_attributes(
:rbenv => {
:git_repository => "https://github.com/sstephenson/rbenv.git"
},
:ruby_build => {
:git_repository => "https://github.com/sstephenson/ruby-build.git"
}
)
Chef Solo 运行chef-solo -c solo.rb -j rbenv.json -l debug
按预期工作。这是为了通过 HTTPS 实现克隆,因为它更容易在防火墙后面。
但是,使用 Ruby DSL 版本的角色 rbenv.rb 如下所示
name "rbenv"
description "rbenv + ruby-build"
run_list "recipe[rbenv]", "recipe[ruby_build]"
# default_attributes ":rbenv" => {":install_prefix" => "/opt"}
override_attributes ":rbenv" => {":git_repository" => "https://github.com/sstephenson/rbenv.git"}, ":ruby_build" => {":git_repository" => "https://github.com/sstephenson/ruby-build.git"}
它似乎不起作用,因为它仍然使用默认属性(通过 git URL 而不是 HTTPS 克隆)。
我是 Ruby 新手,所以很可能我在 DSL 代码中犯了一些错误,请帮忙;-)
* git[/opt/rbenv] action sync[2013-09-03T03:44:53+00:00] INFO: Processing git[/opt/rbenv] action sync (rbenv::default line 91)
[2013-09-03T03:44:53+00:00] DEBUG: git[/opt/rbenv] finding current git revision
[2013-09-03T03:44:53+00:00] DEBUG: git[/opt/rbenv] resolving remote reference
================================================================================
Error executing action `sync` on resource 'git[/opt/rbenv]'
================================================================================
Mixlib::ShellOut::ShellCommandFailed
------------------------------------
Expected process to exit with [0], but received '128'
---- Begin output of git ls-remote "git://github.com/sstephenson/rbenv.git" master* ----
STDOUT:
STDERR: fatal: unable to connect to github.com:
github.com[0: 192.30.252.128]: errno=Connection timed out
---- End output of git ls-remote "git://github.com/sstephenson/rbenv.git" master* ----
Ran git ls-remote "git://github.com/sstephenson/rbenv.git" master* returned 128