Obtener una lista de recursos de un tipo determinado

Obtener una lista de recursos de un tipo determinado

estoy montando undirvicheSistema de respaldo usando títeres. Dirvish tiene el concepto de bóveda: un directorio autónomo que contiene los datos de la copia de seguridad y la configuración de qué y cómo realizar la copia de seguridad. Estas bóvedas pueden estar en cualquier parte del sistema de archivos, por lo que debe enumerarlas explícitamente en el archivo de configuración maestro del dirvish.

La forma en que hice esto con Puppet duplica la información sobre las bóvedas, creándolas primero como recursos y luego pasando una serie de nombres de bóvedas al recurso dirvish maestro.

  # 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']
  }

La dirvish::vaultclase se parece a esto.

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"]
  }
}

La dirvishclase usa la vaultsvariable en una plantilla.

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

¿Cómo puedo eliminar esta duplicación?

Respuesta1

Si mueve sus datos de configuración a Hiera, la plantilla puede usar los mismos datos que cualquier clase que declare el dirvish::vaults real.

Por ejemplo, crear una estructura que se preste para usar concrear_recursos:

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',

Y en el manifiesto:

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

La plantilla puede cargar el mismo hash e iterar sus claves, etc.

Respuesta2

Creo que tu mejor opción es usar un módulo concat, comoesteo alguna configuración dividida, si dirvish la admite (cada bóveda crearía su propio archivo de configuración que luego se incluiría en la configuración principal). Es posible echar un vistazo al catálogo con eloperador de nave espacial, pero eso solo le permitiría establecer el orden entre los recursos o establecer propiedades de las bóvedas dentro de la clase. No es posible hacer algo así $vaults = Dirvish::Vault <| |>.

Como último recurso, también puedes hackear algo en Ruby. La instancia de tipo parece pasar el catálogo al principio de la ejecución, en autorequire. Puedes guardar la referencia en ese momento y hacer cosas desagradables después.

información relacionada