Использование нескольких условий в Chef only_if guard

Я использую следующий ресурс шеф-повара:

execute 'run_command' do
  command "chkconfig service on"
  only_if node['platform_version'].to_i == 6, 5
end

Пожалуйста, дайте мне знать, правильно ли используется защита only_if


person meallhour    schedule 19.10.2016    source источник
comment
Еще only_if %w(6 5).include?(node['platform_version'). Это просто ruby-тест, поэтому, если вы хотите сделать X == 5 или 6, лучше всего создать массив из [5,6] и проверить, включает ли этот массив фактическое значение platform_version.   -  person Tensibai    schedule 19.10.2016
comment
как вы думаете, это может дать неправильный результат, если версия платформы 6.5. я должен вместо этого сделать only_if %w(6 5).include?(node['platform_version'].to_i)   -  person meallhour    schedule 19.10.2016
comment
6.5 при вызове с to_i вернет 6, так что да, так будет лучше.   -  person Tensibai    schedule 19.10.2016


Ответы (1)


Команды ruby ​​в защитном блоке должны быть заключены в {}. Также обратите внимание, что любой код ruby ​​внутри защитного блока будет выполняться на этапе схождения, то есть во время выполнения. У меня был аналогичный сценарий, и, основываясь на комментарии tensibai выше, я просто использовал массив с предварительно включенными значениями для проверки версии ubuntu.

execute "apt-get-update" do
  command "apt-get update"
  ignore_failure true
  notifies :install, 'package[ntp]', :immediately
  not_if {[16.04, 18.04].include?(node['platform_version'].to_f) && (node['packages'].keys.include? "ntp")}
  #not_if {(node['packages'].keys.include? "ntp")}
end

Итак, для вашего сценария я считаю, что защитный блок будет чем-то вроде

execute 'run_command' do
    command "chkconfig service on"
    only_if {[5, 6].include?(node['platform_version'].to_i)} 
end
person Yugendran    schedule 01.02.2019