Ресурс шеф-повара, скрипт внутри "not_if" не работает - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть chef_resource, который выглядит следующим образом

bash 'regenerate-master-list' do
  code <<-EOH
  rm -f /etc/datadog-agent/conf.d/redis_sentinel.d/conf.yaml
  EOH
  action :run
  notifies :create, 'cookbook_file[/etc/datadog-agent/conf.d/redis_sentinel.d/conf.yaml]', :immediately
  not_if "diff <(cat /etc/datadog-agent/conf.d/redis_sentinel.d/master_list) <(redis-cli -p 26379 info sentinel | grep name | sed 's/,.*//' | cut -d '=' -f 2-)"
end

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

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Это немного хакерски, но я только что добавил новый bash ресурс

# diff check_sum of current list vs. existing, drop a file for next resource to pickup
bash 'master-list-checksum' do
  code <<-EOH
  diff <(cat /etc/datadog-agent/conf.d/redis_sentinel.d/master_list) <(redis-cli -p 26379 info sentinel | grep name | sed 's/,.*//' | cut -d '=' -f 2-)
  test $? -eq 0 || touch /etc/datadog-agent/conf.d/redis_sentinel.d/update_list
  EOH
  action :run
end

# remove config to be replaced with new one
bash 'regenerate-master-list' do
  code <<-EOH
  rm -f /etc/datadog-agent/conf.d/redis_sentinel.d/conf.yaml
  rm -f /etc/datadog-agent/conf.d/redis_sentinel.d/update_list
  EOH
  action :run
  notifies :create, 'cookbook_file[/etc/datadog-agent/conf.d/redis_sentinel.d/conf.yaml]', :immediately
  only_if { File.exists?("/etc/datadog-agent/conf.d/redis_sentinel.d/update_list") }
end
1 голос
/ 04 февраля 2020

Вы можете попытаться создать ресурс execute с командой, равной вашему bash not_if охраннику.

execute "diff <(cat /etc/datadog-agent/conf.d/redis_sentinel.d/master_list) <(redis-cli -p 26379 info sentinel | grep name | sed 's/,.*//' | cut -d '=' -f 2-)"

Вы можете сделать это прямо на целевой машине в папке кэша кулинарной книги, а затем запустить chef клиент с chef-client --skip-cookbook-sync, который не обновляет локальный кеш кулинарной книги. Chef завершится неудачно с запуском, и вы увидите вывод.

Я предполагаю, что chef не может запустить redis-cli, потому что он не находится в PATH для chef.

...