加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 干within厨师食谱

发布时间:2020-12-16 20:23:40 所属栏目:百科 来源:网络整理
导读:在厨师食谱中做一点干燥的最好方法是什么?即只是打破了一些Ruby代码,所以我没有复制粘贴一遍又一遍. 以下情况当然不符合: NoMethodError: undefined method `connect_root' for Chef::Resource::RubyBlock 我可能在一个食谱中有多个ruby_blocks,因为它们做
在厨师食谱中做一点干燥的最好方法是什么?即只是打破了一些Ruby代码,所以我没有复制粘贴一遍又一遍.

以下情况当然不符合:

NoMethodError: undefined method `connect_root' for Chef::Resource::RubyBlock

我可能在一个食谱中有多个ruby_blocks,因为它们做不同的事情,需要有不同的not_if块来保持幂等幂.

def connect_root(root_password)
  m = Mysql.new("localhost","root",root_password)
  begin
    yield m
  ensure
    m.close
  end
end

ruby_block "set readonly" do
  block do
    connect_root node[:mysql][:server_root_password] do |connection|
      command = 'SET GLOBAL read_only = ON'
      Chef::Log.info "#{command}"
      connection.query(command)
    end
  end
  not_if do
    ro = nil
    connect_root node[:mysql][:server_root_password] do |connection|
      connection.query("SELECT @@read_only as ro") {|r| r.each_hash {|h| 
        ro = h['ro']
      } }
    end
    ro
  end
end

解决方法

正如您已经想到的那样,您无法在食谱中定义功能.为提供图书馆.您应该在食谱中的库文件夹中创建一个文件(例如mysql_helper.rb),具体如下:
module MysqlHelper
  def self.connect_root( root_password )
    m = Mysql.new("localhost",root_password)
    begin
      yield m
    ensure
      m.close
    end
  end
end

它必须是一个模块,而不是一个类.请注意,我们还将其定义为static(using self.method_name).然后,您将能够使用模块名称与方法名称在您的配方中使用本模块中定义的函数:

MysqlHelper.connect_root node[:mysql][:server_root_password] do |connection|
  [...]
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读