小编典典

使用Chef运行所有sql文件

sql

您好,我需要帮助,我做了一个命令,该命令应该读取sql_dumps文件夹内的所有sql文件,但是它不起作用..这就是我得到的。

execute "Run_SQL_Files" do
  dirResults = Dir.glob("/tmp/sql_dumps/*.sql") 
  var = 0
  while var < 15 do
    var = var + 1 
    command "mysql --user=root --password=toomba source" + dirResults[var]
    # Already tried this also
    # command "mysql --user=root --password=toomba < "  dirResults[var]
    puts dirResults[var]
  end
end

我对红宝石不是很熟悉。这是我收到的错误

 default: Errno::ENOENT
 default: -------------
 default: No such file or directory - Run_SQL_Files
 default:
 default: Resource Declaration:
 default: ---------------------
 default: # In /tmp/vagrant-chef-3/chef-solo-1/cookbooks/main/recip
 default.rb
 default:
 default: 214:
 default: 215: execute "Run_SQL_Files" do
 default: 216:   dirResults = Dir.glob("/tmp/sql_dumps/*.sql")
 default: 217:   var = 0
 default: 218:   while var < 15 do
 default: 219:     var = var + 1
 default: 220:     puts `mysql --user=root --password=toomba source
 {dirResults[var]}`
 default: 221:     puts dirResults[var]
 default: 222:   end
 default: 223:   #command "mysql --user=root --password=toomba < "
 iles
 default: 224: end

提前致谢!


阅读 152

收藏
2021-04-07

共1个答案

小编典典

这里有一个关于Chef如何编译资源的误解。您期望Chef执行15次命令,但这不是Chef的操作方式。Chef运行于两个阶段,即执行阶段和编译阶段。在编译阶段(首先运行),将评估Ruby并将资源添加到资源集合中。也有一些例外,这个阶段也
不会 改变系统的状态。所以给你的食谱:

execute "Run_SQL_Files" do
  dirResults = Dir.glob("/tmp/sql_dumps/*.sql") 
  var = 0
  while var < 15 do
    var = var + 1 
    command "mysql --user=root --password=toomba source" + dirResults[var]
    # Already tried this also
    # command "mysql --user=root --password=toomba < "  dirResults[var]
    puts dirResults[var]
  end
end

这在功能上等同于这样编写的配方(在编译阶段完成之后)”

execute "Run_SQL_Files" do
  command "mysql --user=root --password=toomba source /tmp/sql_dumps/15.sql"
end

请注意,Chef仅将利用该属性的 最后一个command。这是因为Chef在两个阶段中执行(如上所述)。

在资源定义中使用条件逻辑和循环几乎总是会引起问题。在此示例中,您需要在execute资源 之外
编译命令。您要执行的每个SQL命令都必须具有自己的execute块。这是一个简单的重构示例:

Dir["/tmp/sql_dumps/*.sql"].each do |path|
  execute "run_sql_#{path}" do
    command "mysql --user=root --password=toomba < #{path}"
  end
end

这会将15个(从OP假定)执行资源放入资源集合中,并按顺序执行它们。

2021-04-07