Запустите все файлы sql с Chef
Здравствуйте, мне нужна помощь, я сделал команду, которая должна читать все файлы sql внутри папки sql_dumps, но она не работает.. вот что я получил.
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
Заранее спасибо!
1 ответ
Здесь есть неправильное представление о том, как Chef собирает ресурсы. Вы ожидаете, что Шеф выполнит команду 15 раз, но Шеф работает не так. 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
Обратите внимание, что шеф-повар будет использовать только последнее значение для command
приписывать. Это потому, что шеф-повар выполняет в два этапа (как уже упоминалось).
Использование условной логики и циклов внутри определения ресурса почти всегда вызывает проблемы. В этом примере вам нужно скомпилировать команду вне ресурса 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) выполнения ресурсов в коллекцию ресурсов и выполнит их по порядку.