Уведомления ресурса Chef, влияющие на уведомляющий ресурс - PullRequest
0 голосов
/ 21 июня 2019

Я относительно новичок в 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

1 Ответ

0 голосов
/ 21 июня 2019

ресурсы шеф-повара запускаются в том порядке, в котором они написаны.это означает, что вы можете реализовать свою логику по порядку.

мне кажется, что вы используете уведомления для того, чтобы добиться повторного использования кода, но уведомление - это не тот путь, так как каждый поварресурс должен иметь уникальное имя, чтобы избежать любого конфликта ресурсов или неправильных уведомлений, поэтому клонирование ресурса устарело .

, если это так, есть лучшие способы добиться этогов шеф-поваранапример, написание настраиваемого поставщика облегченных ресурсов (lwrp) (также read this ) или написание library (также read this ).

...