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
возможно, сработало.