你好,我需要帮助,我做了一个命令,应该读取 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
提前致谢!
这里对于 Chef 如何编译资源存在一个误解。您期望 Chef 执行该命令 15 次,但这不是 Chef 的操作方式。 Chef 运行分为两个阶段:执行阶段和编译阶段。在编译阶段(首先运行),将对 Ruby 进行评估并将资源添加到资源集合中。除一些例外情况外,此阶段确实not改变系统的状态。所以给出你的食谱:
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 将仅使用last的值command
属性。这是因为 Chef 分两个阶段执行(如前所述)。
在资源定义中使用条件逻辑和循环几乎总是会导致问题。在本例中,您需要编译命令outside的执行资源。您要执行的每个 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 中的假设)执行资源放入资源集合中,并按顺序执行它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)