使用Chef运行所有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 

我不太熟悉ruby。 这是我收到的错误

  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 

提前致谢!

这里有一个关于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 

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

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

请注意,Chef只会使用command属性的最后一个值。 那是因为Chef分两个阶段执行(如前所述)。

在资源定义中使用条件逻辑和循环几乎总是会导致问题。 在此示例中,您需要在执行资源之外编译命令。 您要执行的每个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)执行资源,并按顺序执行它们。