Назад | Перейти на главную страницу

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

Я настраиваю смутный система резервного копирования с использованием марионетки. У Дирвиша есть концепция хранилища - автономного каталога, который содержит данные резервного копирования и конфигурацию того, что и как делать резервные копии. Эти хранилища могут находиться где угодно в файловой системе, поэтому вам необходимо явно указать их в файле конфигурации главного dirvish.

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

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

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

Например, создайте структуру, которая подходит для использования с 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',

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

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

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

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

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