chef: como reinicializar um nó apenas se um arquivo confg for modificado

1

MEIO AMBIENTE: aws opsworks chef 11.10 e ubuntu 14.04.

Estou usando uma receita de chef para atualizar o arquivo /etc/dhcp/dhclient.conf em um nó aws opsworks ec2 para adicionar meu sufixo de pesquisa de DNS personalizado à linha de pesquisa no arquivo /etc/resolv.conf .

Como obtenho minha receita para reinicializar o nó SOMENTE se o file.insert_line_if_no_match atualizar o arquivo? Eu obviamente não quero que o nó seja reinicializado toda vez que a receita for executada.

No meu snippet de código abaixo do valor de node['opsworks']['stack']['name'] é algo como 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

O snippet de código acima adiciona a última linha a /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";

Após a reinicialização, o /etc/dhcp/dhclient.conf é modificado da seguinte forma:

# 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

NOTA: Acho muito arriscado tentar implementar a configuração com algo como sudo dhclient -r; sudo dhclient após a atualização do arquivo, mas adoraria saber se alguém conseguiu que esse tipo de atualização funcionasse sem uma reinicialização .

    
por Peter M 04.11.2014 / 00:24

2 respostas

2

Eu sugiro strongmente que você encontre uma maneira de fazer isso sem reiniciar a máquina. Eu fiz algo semelhante no Centos, por exemplo, que foi realizado com um sudo service network restart . No entanto, quer você reinicie a máquina ou apenas um único serviço, você usará o mesmo padrão.

O caminho "certo"

O jeito certo de fazer isso é com um recurso / provedor personalizado. Neste caso (e pode muito bem já ser um na comunidade), você escreveria um LWRP que lê o arquivo dhclient.conf e somente o modifica se uma mudança for necessária. Em seguida, definiria updated_by_last_action se o arquivo fosse atualizado. Nesse ponto, você poderia usar um recurso service ou execute para reiniciar o serviço / máquina. O recurso de reinicialização assinaria alterações no recurso LWRP.

A maneira quase tão legal

Ou você faz algo assim:

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
    
por 04.11.2014 / 02:41
0

Muito obrigado Tejay Cardon, seu código funciona como um encanto (eu prometo que vou procurar escrever um LWRP algum dia)!

FTR o seguinte código funciona para mim em um aws ec2 ubuntu 14.04 compilação sem uma reinicialização . Eu consegui fazer um sudo ifdown eth0 && sudo ifup eth0 de uma sessão ssh e não fui desconectado.

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

Por alguma razão sudo service networking restart e sudo /etc/init.d/networking restart não funcionam mais após o Ubuntu 13.04 e eu não estou fazendo isso em um desktop ou sudo service network-manager restart pode ter funcionado.

    
por 04.11.2014 / 04:14