2014-09-30 5 views
0

У меня возникают проблемы, пытаясь понять, что происходит, почему чистый рубиновый код выполняется первым, несмотря на то, что код ставится последним, это часть того, что действие: install содержит:LWRP чистый код ruby ​​vs другой порядок выполнения ресурсов поваренной книги

action :install do 

    ... 

    windows_package "#{installation_name}" do 
     source "#{Chef::Config[:file_cache_path]}\\#{installer_filename}" 
     options "INSTALLDIR=\"#{installation_path}\"" 
     action :install 
     not_if {::Dir.exists?("#{installation_path}\\bin")} 
    end 

    env "MYSQL_PATH" do 
     value "#{installation_path}" 
    end 

    windows_path "#{installation_path}\\bin" do 
     action :add 
    end 

    windows_batch "Installing Service" do 
     code <<-EOH 
      set MYSQL_PATH="#{installation_path}" 
      call %MYSQL_PATH%\\bin\\mysqld-nt.exe --install MySQL 
     EOH 
    end 

    service "MySQL" do 
     action :start 
    end 

    service "MySQL" do 
     action :enable 
    end 

    change_pass_str = "call \"#{installation_path}\\bin\\mysql.exe\" -u root --execute \"UPDATE mysql.user SET Password=PASSWORD('#{root_password}') WHERE User='root';FLUSH PRIVILEGES;\"" 
    puts change_pass_str 

    password_set_result = system(change_pass_str) 
    log !password_set_result ? "Password wasn't changed since root already have a password defined. Maybe there's still data from a previous installation." : "Password has been set!" 

end 

Пожалуйста, игнорируйте тот факт, что я не задал определение переменной и не знаю, что они определены. Дело в том, что, когда эта часть lwrp выполнена

change_pass_str = "call \"#{installation_path}\\bin\\mysql.exe\" -u root --execute \"UPDATE mysql.user SET Password=PASSWORD('#{root_password}') WHERE User='root';FLUSH PRIVILEGES;\"" 
puts change_pass_str 
password_set_result = system(change_pass_str) 

он не может найти #{installation_path}\\bin\\mysql.exe, так как он еще не установлен, несмотря на то, что блок находится в конце действия.

Может ли кто-нибудь указать мне, в чем моя ошибка? почему другие (уже определенные в этом случае в Windows LWRP) ресурсы выполняются в конце, а не в начале? Как я могу это исправить?

ответ

1

LWRP не отличаются от рецептов в отношении порядка выполнения. Таким образом, как и в рецепте, любой код ruby, который не находится внутри ресурса, будет выполняться на этапе «сбора ресурсов». В вашем случае, вам нужно обернуть свой код в ruby_block или execute ресурс, как это:

ruby_block 'change the password' do 
    block { 
    change_pass_str = "call \"#{installation_path}\\bin\\mysql.exe\" -u root --execute \"UPDATE mysql.user SET Password=PASSWORD('#{root_password}') WHERE User='root';FLUSH PRIVILEGES;\"" 
    puts change_pass_str 
    password_set_result = system(change_pass_str) 
    end 
end 

ИЛИ

execute'change the password' do 
    command "call \"#{installation_path}\\bin\\mysql.exe\" -u root --execute \"UPDATE mysql.user SET Password=PASSWORD('#{root_password}') WHERE User='root';FLUSH PRIVILEGES;\"" 
end  

Это приведет этот код, чтобы оценить во время выполнения. Вы также захотите добавить only_if, not_if или action :nothing к этому ruby_block, чтобы убедиться, что он запускается только при необходимости. В принципе, not_if или only_if будет запускать код SQL, чтобы проверить, был ли пароль установлен или нет, и если этот блок вернет false, тогда смена пароля не будет выполняться.

В качестве альтернативы вы можете использовать action :nothing, чтобы указать ресурс, который не запускается, а затем использовать уведомление или подписку для запуска ресурса только после установки mysql.

1

Chef имеет систему два прохода см THIS

  • первый проход «компилировать» рецепты и добавлять ресурсы внутри коллекции
  • второй проход «схождения» и для каждой проверки ресурсов, если это необходимо обновляется и действует соответственно.

В вашем lwrp, рубин в ней работать, как только в стадии обработки, включают в свой код в ruby_block ресурс (DOC) для его исполнения в то время сходиться.