Порядок выполнения рецепта шеф-повара

Ниже приведен рецепт, который я использую для копирования и установки программного обеспечения на моем сервере Windows.

batch "Get installed software list" do
  code "wmic /output:C:\\InstallList.txt product get name,version"
end

if File.read('C:/InstallList.txt', mode: 'r:BOM|UTF-16:UTF-8') =~ /.NET Framework 4/
  print "Dotnet framework 4 is already installed."
else
  remote_file 'c:/repo/dotNetFx40_Full_x86_x64.exe' do
    source 'file:////10.132.17.53/e$/CHEFREPO/dotNetFx40_Full_x86_x64.exe'
  end
  batch "Install Dotnet" do
    cwd 'c:/repo/'
    code <<-EOH
        dotNetFx40_Full_x86_x64.exe  #{node['mycloud_dotnet']['passive']} #{node['mycloud_dotnet']['CEIPconsent']} #{node['mycloud_dotnet']['chainingpackage']} #{node['mycloud_dotnet']['createlayout']} #{node['mycloud_dotnet']['lcid']} #{node['mycloud_dotnet']['log']} #{node['mycloud_dotnet']['msioptions']} #{node['mycloud_dotnet']['norestart']} #{node['mycloud_dotnet']['promptrestart']} #{node['mycloud_dotnet']['quit']} #{node['mycloud_dotnet']['repair']} #{node['mycloud_dotnet']['serialdownload']} #{node['mycloud_dotnet']['uninstall']} #{node['mycloud_dotnet']['parameterfolder']} #{node['mycloud_dotnet']['NoSetUpVersionCheck']} #{node['mycloud_dotnet']['uninstallpatch']} 
        del dotNetFx40_Full_x86_x64.exe

    EOH
    not_if {File.read('c:/InstallList.txt', mode: 'r:BOM|UTF-16:UTF-8') =~ /.NET Framework 4/}
  end
end

Пакетный ресурс создал текстовый файл, содержащий список уже установленного программного обеспечения. Затем я читаю этот файл, чтобы проверить, установлено ли уже программное обеспечение. Это так, я печатаю сообщение. В противном случае рецепт перемещается в мою часть else, где я загружаю установку из удаленного репозитория, а затем устанавливаю ее с помощью автоматической установки. Но при запуске клиента я получаю следующую ошибку:

[2014-08-22T05:26:38-07:00] FATAL: Errno::ENOENT: No such file or directory - C:
/InstallList.txt

Мой клиент каким-то образом выполняет код File.read в блоке if перед выполнением первого пакета resource("Get installed Software List"). Любые идеи, что может пойти не так, и обходной путь для того же.


person tortuga    schedule 22.08.2014    source источник


Ответы (1)


Да, ваш if код выполняется на этапе компиляции, а ваш batch ресурс выполняется на этапе конвергенции. См. подробности здесь< /а>.

Вы можете добиться того, чего хотите, запустив ресурс batch во время компиляции, например:

batch "Get installed software list" do
  code "wmic /output:C:\\InstallList.txt product get name,version"
  action :nothing
end.run_action(:run)

В вашем случае включение вашего кода в блок not_if и избавление от части if/else - это еще один вариант, т.е.:

remote_file 'c:/repo/dotNetFx40_Full_x86_x64.exe' do
  source 'file:////10.132.17.53/e$/CHEFREPO/dotNetFx40_Full_x86_x64.exe'
end

batch "Install Dotnet" do
  cwd 'c:/repo/'
  code <<-EOH
    dotNetFx40_Full_x86_x64.exe  #{node['mycloud_dotnet']['passive']} #                 {node['mycloud_dotnet']['CEIPconsent']} #{node['mycloud_dotnet']['chainingpackage']} #{node['mycloud_dotnet']['createlayout']} #{node['mycloud_dotnet']['lcid']} #{node['mycloud_dotnet']['log']} #{node['mycloud_dotnet']['msioptions']} #{node['mycloud_dotnet']['norestart']} #{node['mycloud_dotnet']['promptrestart']} #{node['mycloud_dotnet']['quit']} #{node['mycloud_dotnet']['repair']} #{node['mycloud_dotnet']['serialdownload']} #{node['mycloud_dotnet']['uninstall']} #{node['mycloud_dotnet']['parameterfolder']} #{node['mycloud_dotnet']['NoSetUpVersionCheck']} #{node['mycloud_dotnet']['uninstallpatch']} 
    del dotNetFx40_Full_x86_x64.exe
  EOH
  not_if { `wmic /output:C:\\InstallList.txt product get name,version` =~ /.NET Framework 4/ }
end

Удаленный файл может иметь защиту, чтобы избежать загрузки каждый раз:

not_if { File::exists(...) }
person Tensibai    schedule 22.08.2014
comment
Метод запуска пакетного ресурса во время компиляции работал прелестно. но я предполагаю, что в условии not_if есть ошибка. При загрузке поваренной книги выдает ошибку синтаксиса: «Неожиданный}». - person tortuga; 22.08.2014
comment
Спасибо @sethvargo за уточнение ответа и исправление линии защиты. - person Tensibai; 22.08.2014