Получение списка ресурсов заданного типа

Получение списка ресурсов заданного типа

Я настраиваюдирвишСистема резервного копирования с использованием puppet. В Dirvish есть концепция хранилища — автономного каталога, который содержит данные резервного копирования и конфигурацию того, что и как резервировать. Эти хранилища могут находиться где угодно в файловой системе, поэтому вам нужно явно перечислить их в главном файле конфигурации dirvish.

Способ, который я использовал для этого с puppet, дублирует информацию о хранилищах, сначала создавая их как ресурсы, а затем передавая массив имен хранилищ главному ресурсу 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']
  }

Класс dirvish::vaultвыглядит примерно так

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

Класс dirvishиспользует vaultsпеременную в шаблоне

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

Как удалить это дублирование?

решение1

Если вы перенесете данные конфигурации в Hiera, шаблон сможет использовать те же данные, что и любой класс, объявляющий фактические dirvish::vaults.

Например, создать структуру, которая пригодна для использования ссоздать_ресурсы:

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

И в манифесте:

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

Шаблон может загружать тот же хеш и итерировать его ключи и т. д.

решение2

Я думаю, что лучшим вариантом будет использование модуля concat, напримерэтотили некоторая разделенная конфигурация, если dirvish поддерживает это (каждое хранилище создаст свой собственный файл конфигурации, который затем будет включен в основную конфигурацию). Можно заглянуть в каталог с помощьюоператор космического корабля, но это позволит вам только установить порядок между ресурсами или задать свойства хранилищ внутри класса. Невозможно сделать что-то вроде $vaults = Dirvish::Vault <| |>.

В крайнем случае, вы также можете взломать что-нибудь в Ruby. Экземпляр типа, похоже, передается каталогу в самом начале выполнения, в autorequire. Вы можете сохранить ссылку в этой точке и делать гадости после этого.

Связанный контент