Я относительно новичок в Chef и пытаюсь использовать таймер :before
для нескольких уведомлений в первый раз.Идея проста: у меня есть пользовательский ресурс, который извлекает артефакт из хранилища, сохраняет его в промежуточный каталог и затем развертывает его в каталоге развертывания.Если пользовательский ресурс обнаружит, что артефакт должен быть развернут, текущее развертывание будет скопировано в каталог резервных копий, а новый артефакт будет развернут.Если нет необходимости развертывать артефакт (из-за строки not_if { some_condition }
ниже), этапы резервного копирования не будут выполняться (в этом весь смысл использования уведомлений, поскольку этапы резервного копирования запускаются только через уведомления).
Чтобы реализовать эту функцию, я создал несколько ресурсов с action :nothing
, и я запускаю их из своего пользовательского ресурса, используя уведомления и таймер :before
(см. Ниже).При каждом запуске, который я пробовал, some_condition
оценивалось как ложное.
# SNIPPET 1 - This is my intended code, whose behavior I can't understand.
# All backup actions are set to :nothing and will be triggered
# only if some_condition is false.
directory "delete #{backup_dir}" do
recursive true
path backup_dir
action :nothing
end
directory "create #{backup_dir}" do
owner node['my_cookbook']['owner']
group node['my_cookbook']['group']
path backup_dir
mode '0755'
recursive true
action :nothing
end
execute 'backup current deployment' do
command "mv #{deployments_dir} #{backup_dir}"
action :nothing
only_if { ::Dir.exists?(deployments_dir) }
end
directory "create #{deployments_dir}" do
path deployments_dir
owner node['my_cookbook']['owner']
group node['my_cookbook']['group']
mode "0755"
recursive true
action :nothing
end
node['my_cookbook']['artifacts'].each do |artifact_name|
config = my_environment(artifact_name, node)
# This custom resource downloads the artifact to a staging directory
# and then moves it to deployments_dir.
my_artifact_cache "my_cookbook::deploy_artifacts - Pull cached artifact #{artifact_name}" do
snapshot config['repository'] == 'snapshot'
group_id config['group_id']
artifact_id config['artifact_id']
version config['version']
filetype config['filename_extension']
path deployments_dir
owner node['my_cookbook']['owner']
group node['my_cookbook']['group']
mode "0755"
action :pull
not_if { some_condition }
notifies :delete, "directory[delete #{backup_dir}]", :before
notifies :create, "directory[create #{backup_dir}]", :before
notifies :run, 'execute[backup current deployment]', :before
notifies :create, "directory[create #{deployments_dir}]", :before
end
end
Однако каждый раз, когда я запускаю приведенный выше код, некоторые действия в пользовательском ресурсе my_artifact_cache
пропускаются, иПонятия не имею почему.Это приводит к сбою запуска, поскольку промежуточный каталог (который не имеет ничего общего с каталогами, которыми я на самом деле манипулирую с помощью уведомлений) не создается из пользовательского ресурса.Без уведомлений журнал показывает - created directory /staging/dir
, а с уведомлениями я получаю - Would create new directory /staging/dir
.
Когда я запускаю второй фрагмент ниже, все работает нормально.Я ожидаю, что эти два фрагмента будут эквивалентны в случае, если some_condition
неверно.Почему уведомления влияют на поведение уведомляющего ресурса?Я что-то упустил?
# SNIPPET 2 - Commented out the :nothing actions, replaced them with the actions
# from the notifications - this snippet works as expected. I expected
# snippet 1 to be equivalent during runtime if some_condition is false
directory "delete #{backup_dir}" do
recursive true
path backup_dir
#action :nothing
action :delete
end
directory "create #{backup_dir}" do
owner node['my_cookbook']['owner']
group node['my_cookbook']['group']
path backup_dir
mode '0755'
recursive true
#action :nothing
end
execute 'backup current deployment' do
command "mv #{deployments_dir} #{backup_dir}"
#action :nothing
only_if { ::Dir.exists?(deployments_dir) }
end
directory "create #{deployments_dir}" do
path deployments_dir
owner node['my_cookbook']['owner']
group node['my_cookbook']['group']
mode "0755"
recursive true
#action :nothing
end
node['my_cookbook']['artifacts'].each do |artifact_name|
config = my_environment(artifact_name, node)
# This custom resource downloads the artifact to a staging directory
# and then moves it to deployments_dir.
my_artifact_cache "my_cookbook::deploy_artifacts - Pull cached artifact #{artifact_name}" do
snapshot config['repository'] == 'snapshot'
group_id config['group_id']
artifact_id config['artifact_id']
version config['version']
filetype config['filename_extension']
path deployments_dir
owner node['my_cookbook']['owner']
group node['my_cookbook']['group']
mode "0755"
action :pull
not_if { some_condition }
#notifies :delete, "directory[delete #{backup_dir}]", :before
#notifies :create, "directory[create #{backup_dir}]", :before
#notifies :run, 'execute[backup current deployment]', :before
#notifies :create, "directory[create #{deployments_dir}]", :before
end
end