正确的方式

正确的方式

环境:aws opsworks chef 11.10 和 ubuntu 14.04。

我正在使用 chef 配方来更新/etc/dhcp/dhclient.confaws 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文件是否已更新。此时,您可以使用serviceexecute资源重新启动服务/机器。重启资源将订阅对 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可能已经起作用了。

相关内容