есть ли в марионетке итераторы и циклы? - PullRequest
35 голосов
/ 19 июня 2011

Когда я определяю (?) Ресурс, например, для обеспечения структуры dir, доступны ли какие-либо циклы?

Например:

  for X in [app1,app2] do:
    file { '/opt/app/' + X:
      ensure => directory,
      owner  => 'root',
      group  => 'root',
      mode   => '0644',
    }

У меня есть десятки каталогов, и я действительнонадоело объявлять это в марионетке .. Это займет 15 лок баш.

Есть идеи?

Ответы [ 4 ]

40 голосов
/ 19 июня 2011

В старых версиях языка кукол нет поддержки циклов.

Но вы можете использовать массив вместо простой строки для заголовка и объявить несколько ресурсов одновременно с одинаковыми параметрами:

$b = '/opt/app'
file { [ "$b/app1", "$b/app2" ]:
  ensure => directory,
  owner  => 'root',
  group  => 'root',
  mode   => 0644,
}

Вы также можете объявить множество ресурсов одного типа с разными параметрами, заканчивая каждый ресурс символом ;, что немного компактнее, чем повторение file, { s и } s:

file {
  [ "$b/app1", "$b/app2" ]:
    ensure => directory,
    owner  => 'root',
    group  => 'root',
    mode   => 0755;
  [ "$b/app1/secret", "$b/app2/secret" ]:
    ensure => directory,
    owner  => 'root',
    group  => 'root',
    mode   => 0700;
}

В конкретном случае файлов вы можете настроить источник и использовать рекурсию:

file { "/opt/app":
  source => "puppet:///appsmodule/appsdir",
  recurse => true;
}

(для этого потребуется наличие источника этой структуры каталогов для использования кукол в качестве источника)

Вы можете определить новый тип ресурса , чтобы многократно использовать часть параметра:

define foo {
  file {
    "/tmp/app/${title}":
      ensure => directory,
      owner  => 'root',
      mode   => 0755;
    "/tmp/otherapp/${title}":
      ensure => link,
      target => "/tmp/app/${title}",
      require => File["/tmp/app/${title}"]
  }
}

foo { ["app1", "app2", "app3", "app4"]: } 

Начиная с Puppet 2.6, существует Ruby DSL, в котором есть все функции циклической обработки, которые вы можете запросить: http://www.puppetlabs.com/blog/ruby-dsl/ (однако я никогда не использовал его). В Puppet 3.2 они добавили экспериментальные циклы , однако эти функции могут измениться или исчезнуть в более поздних выпусках.

25 голосов
/ 31 октября 2013

Начиная с версии 3.2 лямбда

Вы должны установить parser = future в puppet.conf .

$a = [1,2,3]
each($a) |$value| { notice $value }

Еще одна опция для объявления нескольких определенных типов - это create_resources . Передайте хэш хэшей:

create_resources(file, {
 '/tmp/test1' => { 
      ensure => directory,
      owner  => 'root',
      group  => 'root',
      mode   => '0644',
    },  
 '/tmp/test2' => { 
      ensure => directory,
      owner  => 'www-data',
      group  => 'www-data',
      mode   => '0755',
    },  
})
4 голосов
/ 08 декабря 2015

Начиная с Puppet 4 (и «будущего синтаксического анализатора» поздних версий Puppet 3), Puppet DSL имеет итерационные функции, похожие по форме и функциям на некоторые методы Ruby-массивов и хэшей:

  • каждый - оценивает блок кода (формально лямбда) для каждого элемента массива или хеша
  • фильтр - применяет лямбду к каждому элементумассив или хеш и возвращает массив или хеш из тех, для которых лямбда оценивается как истинное
  • map - применяет лямбду к каждому элементу массива или хеша и возвращает массиврезультаты
  • уменьшить - применяет лямбду к каждому элементу массива или хеш-функции для создания одного результата, который он возвращает

Нет индексированныхfor цикл по линиям C или Java, но вы можете комбинировать секционирование массива с любой из вышеперечисленных функций для достижения итерации по подмножеству структуры данных.Не существует неопределенной итерации в соответствии с циклом C или Java while.

Конечно, вы все еще можете использовать подходы, ориентированные на ресурсы, описанные в других ответах, и иногда один из них действительно лучшийдоступный подход.Однако вы больше не можете использовать Ruby DSL;он полностью удален из Puppet 4. Среди функций итерации, возможности определения пользовательских функций, перехода на подходы, ориентированные на данные, и всех исторических стандартных функций Puppet, Ruby DSL, похоже, не так уж много и упустили.

2 голосов
/ 03 июля 2013

Да.«Ruby DSL» может помочь, просто используйте расширение файла «.rb» вместо «.pp» в манифесте, и вы можете определить «тип» марионетки следующим образом:

define 'myapps::structure', :applist do
   @applist.each do |app|
       file( @name+'/'+app, 
             :ensure => directory,
             :owner  => 'root',
             :group  => 'root',
             :mode   => '0644')
   end
end

Также могут быть определены классы и узлыаналогичным образом.Однако обратите внимание, что эта функция устарела с момента выпуска 3

...