2016-03-16 3 views
2

Я пытаюсь выполнить скрипт bash в среде с ножом/рубином. Например:Как достичь идемпотентности при выполнении скрипта bash в среде ruby ​​/ knife?

cookbook_file "test.sh" do 
    path "/tmp/test.sh" 
    mode "755" 
    action :create 
end 

bash "execute test.sh on #{nodeName}" do 
    code <<-EOH 
    sh test.sh arg1 arg2 
    EOH 
    #only_if { false } 
end 

Как я могу использовать only_if или not_if? Поэтому, когда мы выполняем второй раз, и содержимое «test.sh» не изменяется, оно должно пропустить выполнение. Я получаю это:

* cookbook_file[test.sh] action create (up to date) 

, но он по-прежнему выполняет второй раз, третий раз ...

+0

Вы имеете в виду, что 'test.sh' потенциально различается при каждом запуске ресурса, и вы хотите запустить' test.sh', только если он был изменен с момента его последнего запуска? –

+0

тест.sh - такой же. И я хочу запускать только при его изменении. Как я могу использовать only_if/not_if и контрольные суммы файлов. Или каким-то другим способом. –

+0

У меня тоже есть: cookbook_file "test.sh" do путь "/tmp/test.sh" режим "755" action: create end –

ответ

4

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

execute 'run test' do 
    action :nothing 
    command 'bash /tmp/test.sh arg1 arg2' 
end 

cookbook_file "test.sh" do 
    path "/tmp/test.sh" 
    mode "755" 
    notifies :run, 'execute[run test]', :immediately 
end 

Уведомления запускаются при обновлении ресурсов, поэтому в любое время, когда файл cookbook изменяется, он будет запускать execute. Также вы хотите использовать execute вместо bash или script, потому что вы используете команду, а не встроенный файл сценария.

+0

Спасибо. Это сработало. Это отличный ответ и с большим объяснением. Еще раз спасибо вам большое. –