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

Повторно примените шаблон в разных точках с разными значениями переменных

Похоже, я не понимаю, как изменить содержимое файлового ресурса в разных точках применения манифестов Puppet. Я использую это с Бродяга для настройки среды разработки.

Я хочу установить о-о-о-шелл, который обеспечивает шаблон для файла .zshrc. oh-myzshell имеет концепцию плагинов, поэтому я выбираю, какие плагины мне нужны, добавляю их в шаблон и делаю его шаблоном для манифеста марионетки:

class oh_my_zshell {
  include git
  include zsh

  $oh_my_zshell_dir = "${vagrant_home_dir}/.oh-my-zsh"
  $plugins          = "command-not-found common-aliases sudo"
  $theme            = "ys"
  $zshrc            = "${vagrant_home_dir}/.zshrc"
  $backup           = "${zshrc}.orig"

  @file { "zshrc":
    path    =>  $zshrc,
    ensure  =>  file,
    content =>  template("oh_my_zshell/zshrc.erb"),
  }

  realize( File["zshrc"],Package["zsh"] )

отрезать!

и в шаблоне:

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
plugins=(<%= @plugins %>)

Это нормально работает.

Позже решаю, что хочу установить грубый. Для chruby существует плагин oh-my-zshell, поэтому я хочу повторно применить шаблон с новыми значениями для плагина:

class chruby {
  include apt_update
  include oh_my_zshell
  include stdlib
  $plugins        = "${oh_my_zshell::plugins} chruby"
  $theme          = $oh_my_zshell::theme

отрезать!

  realize(File["zshrc"])

  file_line {"chruby set default ruby":
    path    =>  $oh_my_zshell::zshrc,
    line    =>  'chruby ruby-2.1.2',
    require =>  File["zshrc"],
  }

Это, однако, не меняет файл вообще - нет chruby в операторе plugins, и нет строки для установки ruby ​​по умолчанию.

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

Есть ли что-то, что мне нужно сделать, чтобы эта работа работала, или я работаю против того, как следует использовать Puppet? Альтернатива, которую я вижу, - это взять запись файла из классов и завершить его в основном манифесте, ожидая, пока все переменные не будут заполнены.

Я новичок в Puppet, поэтому буду благодарен за любую помощь или понимание.

Вы не должны использовать виртуальный ресурс (@file и realize) для этого. Переменные для шаблона будут из исходной области, в которой он определен (где @file) есть, а не там, где это реализовано.

Вы хотите определить.

define thingy(
  $path,
  $plugins) {

  file { '$path':
    content => template("oh_my_zshell/zshrc.erb"),
  }
}

И если вы хотите добавить строки, вы должны добавить необязательный параметр в определение и использовать его условно в шаблоне. Определение файла с содержимым или источником и последующая попытка редактировать содержимое этого файла на другом ресурсе не приведет к желаемому результату.

В качестве альтернативы, вместо этого может иметь смысл, чтобы oh_my_zshell был классом, который принимает параметры и передать переменную "additional_plugins" ...

# declare class with param
class oh_my_zshell($additional_plugins = '') {
  # put it into the other variable or use in the template or whatever
}

# instead of the include/require
class { 'oh_my_zshell':
  additional_plugins = 'chruby',
}