Gerencia apenas uma seção de um arquivo de configuração com Puppet (multiline file_line)

5

Existe um ficheiro de configuração, por ex. / etc / network / interfaces. Eu quero gerenciar apenas uma certa seção desse arquivo usando Puppet.

Exemplo:

# At the beginning at least is some dynamic content that can be different
# from machine to machine and changed by an admin manually
auto eth0
iface eth0 inet static
    address 192.168.108.5
    netmask 255.255.255.0

# BEGIN PUPPET WLAN0
allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.109.5
    netmask 255.255.255.0
# END PUPPET WLAN0

# Potentially more stuff that I do not want to touch through Puppet
# But could be static if it makes it more easy. E.g. simply force sections to end of file.

O recurso stdlib file_line é muito próximo do que eu preciso. Um regex e conteúdo para substituir uma correspondência com. No entanto, infelizmente, não há como fazer a correspondência file_line em várias linhas e substituí-las por novos conteúdos.

Alternativa 1: crie um script básico: recursos e arquivos temporários do Exec.

Alternaitve 2: Use Augeas: parece um exagero para uma pesquisa simples & substituir.

Existe outro módulo que stdlib que me permite fazer uma correspondência de regex & substituir várias linhas?

Quaisquer outras soluções de artesanato melhor do que fazer malabarismos com o script temp bash e o recurso Exec?

    
por Alex 06.08.2014 / 21:42

4 respostas

2

Você pode simplesmente usar uma correspondência de linha única como o marcador para um valor de várias linhas :

$wlan_address = [...]
$wlan_netmask = [...]
$wlan_string = "allow-hotplug wlan0
iface wlan0 inet static
    address ${wlan_address}
    netmask ${wlan_netmask}"

file_line { 'wlan0':
  path  => '/etc/network/interfaces',
  line  => $wlan_string,
  match => '^# PUPPET WLAN0$',
}
    
por 21.11.2014 / 17:56
1

O gerenciamento de parte de um arquivo é um padrão anti-gerenciamento de configuração que deve ser desencorajado o máximo possível.

Você já identificou as várias ferramentas que podem fazer isso.

  • Augeas
  • stdlib / file_line
  • exec + sed

Você pode, alternativamente, gerenciar o arquivo inteiro e fazer um 'onlyif' para que o arquivo não seja sobrescrito sempre.

Como você descobriu, file_line só funciona nos arquivos de configuração do estilo init, que são de linha única.

Sua melhor aposta será fazer um exec nesse arquivo com uma inserção sed.

    
por 05.04.2015 / 22:12
0

Se você puder garantir que o outro conteúdo do arquivo seja estático, basta transformá-lo em um modelo e manter as seções estáticas inalteradas. Exemplo:

auto eth0
iface eth0 inet static
address 192.168.108.5
netmask 255.255.255.0

# BEGIN PUPPET WLAN0
allow-hotplug wlan0
iface wlan0 inet static
    address <%= wlan0_address %>
    netmask <%= wlan0_netmask %>
# END PUPPET WLAN0

# More stuff that I do not want to touch through Puppet
# Static content here

Este exemplo assume que você definiu as variáveis $wlan0_address e $wlan0_netmask em outro lugar.

Você então implanta com um recurso de arquivo:

file{'interfaces':
        ensure  => file,
        path    => '/etc/network/interfaces',
        content => template('/path/to/template'),
}
    
por 09.08.2014 / 00:26
0

Existe um módulo no fantoche já instalado por padrão chamado: puppetlabs-stdlib e dentro deste módulo um tipo definido chamado file_line que faz o truque :) Aqui está o meu cenário sob o /manifests/node.pp:

node elk.ershandc.org {
...
file_line { 'backup_authorized_key' :
    ensure => 'present',
    path   => '/root/.ssh/authorized_keys',
    line   =>'ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQC1ZCi/K0hlffi9ZUmveJ05l301RE6u/TzrCK+i54edzN5stR/tTjd28vFIup10HTYoZxbqBgRMrxVGDnfwtaSsCZH31g2/flZBxSZGzjySKeUqnf/YyGJP6my/IjA4xcKVcPDPx2FF/u1Sd07y7wnLizjAhtIOwq1daiCcRbXkIxfpobQt/RtJLAyDA1CwACr9NWmAezS0rnaYXRBQrmrkCBx91fMhKsarvxB3z4mTG8wVNwXvE9g2Hps6bRzff0hIXaIoVFYHwqmyIkN+4xCDGcjt3TjZp0zvTK20RR7DNOHxOGs8GBhcvitEkGY/JXgA4AJ26ncfXaspaUgEM/Rt root@devop-testbed'
 }

...
}
    
por 20.06.2017 / 13:47

Tags