Запустите все файлы 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) выполнения ресурсов в коллекцию ресурсов и выполнит их по порядку.

Другие вопросы по тегам