chef: как перезагрузить узел, только если изменен файл конфигурации

ОКРУЖАЮЩАЯ СРЕДА: aws opsworks chef 11.10 и ubuntu 14.04.

Я использую рецепт шеф-повара, чтобы обновить /etc/dhcp/dhclient.conf файл на узле aws opsworks ec2, чтобы добавить свой собственный суффикс поиска DNS в строку поиска в /etc/resolv.conf файл.

Как мне получить мой рецепт, чтобы перезагрузить узел ТОЛЬКО если file.insert_line_if_no_match обновляет файл? Я, очевидно, не хочу, чтобы узел перезагружался при каждом запуске рецепта.

В моем фрагменте кода ниже значения node['opsworks']['stack']['name'] это что-то вроде a.dev.mydomain.com,

ruby_block "add custom dns domain search suffix" do
  block do
    file = Chef::Util::FileEdit.new("/etc/dhcp/dhclient.conf")
    file.insert_line_if_no_match("/append domain-search/", "append domain-search \"#{node['opsworks']['stack']['name']}\";")
    file.write_file
  end
end

Приведенный выше фрагмент кода добавляет последнюю строку к /etc/dhcp/dhclient.conf:

# Configuration file for /sbin/dhclient, which is included in Debian's
#       dhcp3-client package.
#
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
send host-name = gethostname();
request subnet-mask, broadcast-address, time-offset, routers,
        domain-name, domain-name-servers, domain-search, host-name,
        dhcp6.name-servers, dhcp6.domain-search,
        netbios-name-servers, netbios-scope, interface-mtu,
        rfc3442-classless-static-routes, ntp-servers,
        dhcp6.fqdn, dhcp6.sntp-servers;
append domain-search "a.dev.mydomain.com";

После перезагрузки /etc/dhcp/dhclient.conf изменяется следующим образом:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 172.16.0.23
search ec2.internal a.dev.mydomain.com

ПРИМЕЧАНИЕ: я думаю, что это слишком рискованно, чтобы попытаться реализовать настройку с чем-то вроде sudo dhclient -r; sudo dhclient после обновления файла, но я хотел бы услышать, получил ли кто-либо этот тип обновления для работы без перезагрузки.

2 ответа

Решение

Я настоятельно рекомендую вам найти способ сделать это без перезагрузки машины. Я сделал что-то похожее на Centos, например, что было достигнуто с помощью sudo service network restart, Тем не менее, независимо от того, перезагружаете ли вы компьютер или просто один сервис, вы будете использовать тот же шаблон.

Правильный путь

Правильный способ сделать это с помощью специального ресурса / провайдера. В этом случае (а в сообществе уже может быть один) вы написали бы LWRP, который читает dhclient.conf файл и изменяет его только в случае необходимости изменения. Затем будет установлен updated_by_last_action если файл обновлен. В этот момент вы можете использовать service или же execute ресурс для перезапуска службы / машины. Ресурс перезапуска будет подписываться на изменения ресурса LWRP.

Почти как крутой способ

Или вы делаете что-то вроде этого:

execute "add custom dns domain search suffix" do
  command "echo 'append domain-search \"#{node['opsworks']['stack']['name']}\";' >> /etc/dhcp/dhclient.conf"
  not_if { ::File.open('/etc/dhcp/dhclient.conf').read() =~ /append domain-search/ }
end

execute 'restart machine' do
  command 'shutdown immediate -r'
  action :nothing
  subscribes :run, 'execute[add custom dns domain search suffix]'
end

Огромное спасибо Теджей Кардону, ваш код работает как шарм (обещаю, что когда-нибудь напишу, как написать LWRP)!

FTR следующий код работает для меня на сборке aws ec2 ubuntu 14.04 без перезагрузки. Я даже смог сделать sudo ifdown eth0 && sudo ifup eth0 от сеанса SSH и не отключился.

execute "add custom dns domain search suffix" do
  command "echo 'append domain-search \"#{node['opsworks']['stack']['name']}\";' >> /etc/dhcp/dhclient.conf"
  not_if { ::File.open('/etc/dhcp/dhclient.conf').read() =~ /append domain-search/ }
end

execute 'bounce eth0' do
  command 'sudo ifdown eth0 && sudo ifup eth0'
  action :nothing
  subscribes :run, 'execute[add custom dns domain search suffix]'
end

По какой-то причине sudo service networking restart а также sudo /etc/init.d/networking restart больше не работает после Ubuntu 13.04, и я не делаю это на рабочем столе или sudo service network-manager restart возможно, сработало.

Другие вопросы по тегам