Estendendo o Puppet (provavelmente com augeas) para o formato de configuração customizado

2

Eu tenho um sistema de firewall personalizado com nosso próprio arquivo de configuração simples. Sua basicamente bash source definindo um bem conhecido variáveis:

SUPERACCESS="127.0.0.1 192.168.11.0/24"
SERVICES="ping 80/tcp 443/tcp 22/tcp"
FORWARDING=1
.....

e gostaria de gerenciar esses arquivos de configuração com o fantoche (provavelmente via augeas se necessário). Porque eu sou novo em todo o ecossistema de marionetes, eu estou procurando por "melhores práticas" de maneira razoavelmente simples e limpa como conseguir isso.

Eu preciso ser capaz de modificar apenas algumas das opções (por isso não posso enviar a configuração como arquivo inteiro do mestre de marionetes) e eu não quero limitar o acesso a esses arquivos exclusivamente para o fantoche. Tudo o que preciso é uma maneira de garantir que determinada sub-rede, serviço, etc ... esteja (ou não) na lista apropriada, ou seja, algo assim:

firewall::superaccess { "LAN" :
         target => "192.168.11.0/24",
          ensure=> "present",
}

Consegui forçar o augeas a usar a lente Shell_variables e consegui alterar os campos "simples" como FORWARDING. Infelizmente, não obtive êxito com os valores da lista (ou seja, SUPERACCESS) usando a lente Shell_variables_list.

Talvez exista uma maneira melhor do que usar o augeas. Eu tentei olhar no fantoche forjar, se houver algum módulo com formato de configuração semelhante, mas não consegui encontrar nenhum. Infelizmente eu não conheço muito de linguagem de lentes ruby e augeas, mas vou aprender algumas se necessário. Eu só não quero começar na direção errada ...

Atualização: Graças ao Raphink, consegui localizar o problema. É o comentário no meio da linha. Se houver essa linha no arquivo:

service_ping="ping/icmp" #ping

Eu recebo este erro:

/tmp/augcheck.TCTUBq/parse_file.aug:3.0-.58:exception thrown in test
/tmp/augcheck.TCTUBq/parse_file.aug:3.5-.54:exception: Iterated lens matched less than it should
    Lens: /usr/share/augeas/lenses/dist/shellvars_list.aug:40.12-.37:
    Error encountered at 176:0 (9906 characters into string)
    <--------\n#Built in services\n|=|service_ping="ping/icmp" #pi>

    Tree generated so far:

Se eu mover o comentário em uma linha separada, ele carregará o arquivo na estrutura da árvore. Até mesmo o augtool funciona como esperado. Eu tenho essa versão de augeas instalada: ruby-augeas-0.4.1-3.fc17.x86_64, augeas-1.0.0-1.fc17.x86_64, augeas-libs-1.0.0-1.fc17.x86_64

Atualização 2: Para resolver o problema com comentários inline, usei o código da lente ShellVars. A mudança é copiar / colar algumas definições de ShellVars e alterar a definição de linha:

  let empty_part_re = Util.empty_generic_re . /\n+/
  let semicol_eol = del (/[ \t]*[;\n]/ . empty_part_re*) "\n"
  let eol_for_comment = del /([ \t]*\n)([ \t]*(#[ \t]*)?\n)*/ "\n"
  (* comment_eol in shell MUST begin with a space *)
  let comment_eol = Util.comment_generic_seteol /[ \t]+#[ \t]*/ " # " eol_for_comment
  let comment_or_eol = comment_eol | semicol_eol

  let kv = [ key key_re . eq . ( squote_arr | dquote_arr | unquot_val ) .  comment_or_eol ]
    
por Radek Hladík 01.05.2013 / 21:17

2 respostas

3

Sim, a lente Shellvars_list deve poder analisar seu arquivo como:

{ "SUPERACCESS"
  { "quote" = """ }
  { "value" = "127.0.0.1" }
  { "value" = "192.168.11.0/24" }
}
{ "SERVICES"
  { "quote" = """ }
  { "value" = "ping" }
  { "value" = "80/tcp" }
  { "value" = "443/tcp" }
  { "value" = "22/tcp" }
}
{ "FORWARDING"
  { "quote" = "" }
  { "value" = "1" }
}

Observação: você pode testar isso usando augcheck :

augcheck /etc/firewall/config Shellvars_list

Agora, o problema é: "Como você sai dessa árvore para a sua definição?", isto é:

firewall::superaccess { "LAN" :
         target => "192.168.11.0/24",
          ensure=> "present",
}

onde você deseja garantir a presença de um elemento em uma lista.

Você poderia fazer:

define firewall::superaccess (
  $target,
  $ensure = 'present',
) {
  case $ensure {
    'present': {
      $changes = "set SUPERACCESS/value[.='${target}'] '${target}'"
    }

    'absent': {
      $changes = "rm SUPERACCESS/value[.='${target}']"
    }

    default: { fail "Wrong value for ensure: '${ensure}'" }
  }

  augeas { "Set target ${target} in /etc/firewall/config":
    lens    => 'Shellvars_list.lns',
    incl    => '/etc/firewall/config',
    changes => $changes,
  }
}
    
por 01.05.2013 / 22:40
0

O que eu provavelmente faria é alterar seu script para que as variáveis venham de um arquivo externo, como / etc / sysconfig / firewall-info ou algo assim (em uma caixa redhat ou similar). Então você não precisa modificar ou gerenciar o script, apenas o arquivo de configuração, e deixar o script ler as variáveis do arquivo de configuração. Então você poderia facilmente gerenciar o arquivo de configuração usando a lente augeas shellvars, ou até mesmo fazer um provedor personalizado.

    
por 01.05.2013 / 21:39

Tags