【问题标题】:Ruby code on Chef as a "ruby_block" not workingChef 上的 Ruby 代码作为“ruby_block”不起作用
【发布时间】:2013-11-26 07:19:27
【问题描述】:

我有一个问题要问 Ruby 和 Chef 黑客。

我对 Chef 的了解非常有限,对 Ruby 编程语言的了解更少,但是,我需要在 Chef (chef-solo) 上实现类似于“augeas”的东西(它适用于 Puppet,但在这里我需要一个解决方案厨师)。

我得到了下面的示例代码,但它不起作用,我现在花了几天时间试图找出问题所在。

基本上我需要能够在文本文件中选择特定的字符串并修改这些值。我可以使用 sed,但也许我可以使用 Chef 的 ruby​​_block 以更优雅的方式完成。

请让我知道下面的代码可能有什么问题。为什么我的 /etc/hosts 没有更新为新值?

当我重新运行 chef-solo 时,总是出现以下错误:

NoMethodError
-------------
undefined method `chef' for Chef::Resource::RubyBlock

感谢您的帮助。

遵循我的 default.rb 文件:

ruby_block "edit etc hosts" do
  block do
    rc = Chef::Util::FileEdit.new("/etc/hosts")
    rc.search_file_replace_line(
      /^127\.0\.0\.1 localhost$/,
      "127.0.0.1 #{new_fqdn} #{new_hostname} localhost"
    )
    rc.write_file
  end
end

【问题讨论】:

  • 您找到解决方案了吗?请不要忘记将答案标记为正确! :)

标签: ruby chef-infra


【解决方案1】:

将此行添加为 ruby​​ 块的第一行:

require 'chef/util/file_edit'

根据你的情况,你应该使用食谱hostsfile

hostsfile_entry '127.0.0.1' do
  hostname  new_hostname
  aliases   [new_fqdn]
  comment   'Append by Recipe X'
  action    :append
end

【讨论】:

  • 更新了我的答案。你能在 ruby​​ 块中包含require 节吗?
  • 好吧,它仍然无法正常工作,我在 stackoverflow 上粘贴识别代码时遇到了一些麻烦(我是新来的)。但我基本上只是从文件顶部删除了“require'chef/util/file_edit'”这一行,并将其包含在 ruby​​_block 中。
【解决方案2】:

让 Augeas 与 Chef 合作应该不会太难。 Augeas 是一个 C 库,而 Puppet 只是使用它的 Ruby 绑定。您只需要在 Chef 中使用这些绑定即可。

这里有一个用于 Chef 的 PoC Augeas 资源提供者:https://github.com/craigtracey/augeas

注意:http://lists.opscode.com/sympa/arc/chef/2013-02/msg00337.html 提到将 Augeas 集成到 Chef 中,但显然参与者误解了 Augeas,因为他们提到了幂等性问题和增量。大多数 Augeas 的使用不会导致管理增量,而是管理所需的状态。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2015-12-26
    • 2011-06-02
    • 1970-01-01
    • 2013-11-12
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多