2014-09-30 5 views
0

무슨 일이 일어나고 있는지 이해하려고하는 데 문제가 있습니다. 왜 순수 루비 코드가 코드가 마지막에 놓 였는지에도 불구하고 실행되는 이유는 무엇입니까? 포함 :LWRP 순수한 루비 코드 대 다른 요리 책 리소스 실행 순서

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_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  

이 코드가 실행시에 평가하게됩니다 그. 필요한 경우에만 실행되도록 , not_if 또는 action :nothingruby_block에 추가 할 수도 있습니다. 기본적으로 not_if 또는 only_if은 SQL 코드를 실행하여 암호가 설정되었는지 여부를 확인하고 해당 블록이 false를 반환하면 암호 변경이 실행되지 않습니다.

action :nothing을 사용하여 리소스를 실행하지 않도록 설정 한 다음 알림 또는 구독을 사용하여 mysql을 설치 한 후에 만 ​​리소스를 실행할 수 있습니다.

1

요리사가되어야하는 경우 두 개의 패스 시스템 THIS

  • 제 패스 조리법 '컴파일'및
  • 두번째 패스 '수렴'과 각 리소스 체크하는 컬렉션 내부의 자원을 추가 참조 갖는다 결과적으로 업데이트되고 행동합니다. 당신의 lwrp에서

, 그것의 루비, 즉시 처리되는 등의 실행는 수렴 시간에 실행하기위한 ruby_block 자원 (DOC)에 코드를 포함한다.