![正确的方式](https://linux22.com/image/645291/%E6%AD%A3%E7%A1%AE%E7%9A%84%E6%96%B9%E5%BC%8F.png)
环境:aws opsworks chef 11.10 和 ubuntu 14.04。
我正在使用 chef 配方来更新/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
文件更新后之类的操作来实现设置风险太大,但我很想知道是否有人能够在无需重启的情况下让这种类型的更新正常工作。
答案1
我强烈建议您找到一种无需重启机器即可完成此操作的方法。例如,我在 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
答案2
非常感谢 Tejay Cardon,你的代码运行起来非常好(我保证有一天我会考虑编写一个 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
可能已经起作用了。