Obtendo uma lista de recursos de um determinado tipo

4

Estou configurando um sistema de backup dirvish usando o fantoche. Dirvish tem o conceito de um cofre - um diretório independente que contém os dados de backup e a configuração de como e como fazer backup. Esses cofres podem estar em qualquer lugar do sistema de arquivos, então você precisa listá-los explicitamente no arquivo de configuração dirvish master.

A maneira como fiz isso com o fantoche duplica as informações sobre os cofres, primeiro criando-os como recursos e, em seguida, passando uma matriz de nomes de cofre para o recurso mestre dirvish.

  # Dirvish vaults, alphabetically sorted
  dirvish::vault { 'server-a-full':
    client      => 'server-a',
    tree        => '/',
    backup_root => $dirvish_backup_root
  }

  dirvish::vault { 'server-b-example.com':
    client       => 'server-b',
    tree         => '/srv/www/vhosts/example.com/backup',
    rsync_option => '--copy-unsafe-links',
    backup_root  => $dirvish_backup_root
  }

  # TODO - we duplicate the vault definitions here, but I don't 
  # see a better way right now
  class {'dirvish': 
    backup_root => $dirvish_backup_root,
    vaults      => ['server-a-full', 'server-b-example.com']
  }

A classe dirvish::vault é parecida com isso

define dirvish::vault($tree, $client, $exclude = [], $rsync_option = '', $backup_root) {
  file {"$backup_root/$name/dirvish/default.conf":
    ensure => present,
    content => template("dirvish/vault.conf.erb"),
    require => File["$backup_root/$name/dirvish"]
  }
}

A classe dirvish usa a variável vaults em um modelo

Runall:
<% vaults.each do |vault| -%>
        <%= vault %>
<% end -%>

Como posso remover essa duplicação?

    
por Robert Munteanu 13.05.2014 / 09:50

2 respostas

2

Se você mover seus dados de configuração para Hiera, o modelo poderá usar os mesmos dados que qualquer classe declara o% realdirvish::vault s.

Por exemplo, crie uma estrutura que possa ser usada com create_resources :

dirvish_vault_defaults:
  backup_root: "<backup-root-value>"

dirvish_vaults:
  'server-a-full':
    client: 'server-a',
    tree: '/',
  'server-b-example.com':
    client: 'server-b',
    tree: '/srv/www/vhosts/example.com/backup',
    rsync_option: '--copy-unsafe-links',

E no manifesto:

create_resources('dirvish::vault', hiera('dirvish_vaults'), hiera('dirvish_vault_defaults'))

O modelo pode carregar o mesmo hash e iterar suas chaves, etc.

    
por 13.05.2014 / 13:44
1

Eu acho que sua melhor opção é usar um módulo de concat, como this ou alguma configuração dividida, se dirvish o suportar (cada cofre criaria seu próprio arquivo de configuração, que seria então incluído na configuração principal). É possível ver o catálogo com o operador de espaçonave , mas isso só permitiria que você definisse a ordem entre os recursos ou definisse as propriedades da cofres dentro da classe. Não é possível fazer algo como $vaults = Dirvish::Vault <| |> .

Como último recurso, você também pode hackear algo em ruby. A instância do tipo parece ter passado no catálogo no início da execução, em autorequire . Você pode salvar a referência nesse ponto e fazer coisas desagradáveis depois.

    
por 13.05.2014 / 12:18

Tags