Puppet - Pass hash как аргумент класса

4 Mike Purcell [2015-10-30 21:19:00]

Попытка сделать что-то вроде этого:

# nodes.pp
node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {

    class { 'custom::core':
        overrides => {
            'openssh' => {'settings' => {'external_access' => 'true'}}, # Allow direct mounting for dev
            'rsyslog' => {'settings' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}}
        }
    }
}

# custom::core
class custom::core($overrides = {}) {

    if (has_key($overrides, 'openssh')) {

        $settings = $overrides['openssh']['settings']

        # Doesn't work
        create_resources('openssh', $settings)

        # Doesn't work
        class { 'openssh': $settings }
    }
}

Можно ли вызвать класс и передать хэш в качестве аргументов?

Кукольный/Кукольный матер v2.7.26-1 (Centos 6.7)

puppet


2 ответа


2 Решение ptierno [2015-11-03 05:28:00]

Один из моих коллег придумал хорошее решение для чего-то подобного в старые 2+ дни марионетки. Используется create_resources для этого.

http://www.followski.com/quick-note-how-to-use-create_resources-to-initialize-a-class-in-puppet/

ваш код может выглядеть примерно так:

nodes.pp

node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {

    class { 'custom::core':
        overrides => {
            'openssh' => {'settings' => {'external_access' => 'true'}}, # Allow direct mounting for dev
            'rsyslog' => {'settings' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}}
        }
    }
}

заказ:: ядро ​​

class custom::core($overrides = {}) {

    if (has_key($overrides, 'openssh')) {

        $settings = $overrides['openssh']['settings']

        create_resources('class', { 'openssh' => $settings })
    }
}

Вы заметите, что в приведенном выше примере он выглядит как create_resources('class', $params), но предполагается, что у вас есть хеш с ключом, являющимся именем класса (т.е. openssh), и его значением являются параметры, которые нужно задать. Приведенный выше пример, по сути, делает то же самое.

Ваше определение node также может выглядеть следующим образом:

node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {

    class { 'custom::core':
        overrides => {
            'openssh' => {'external_access' => 'true'}, # Allow direct mounting for dev
            'rsyslog' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}
        }
    }
}

и ваш класс примерно так:

class custom::core($overrides = {}) {
  if (has_key($overrides, 'openssh')) {
    create_resources('class', {'openssh' => $overrides['openssh'])
  }

  if (has_key($overrides, 'rsyslog')) {
    create_resources('class', {'rsyslog' => $overrides['rsyslog'])
  }
}

Я думаю, вы догадались.

Мы использовали это довольно часто несколько лет назад. Возможно, вам стоит подумать о том, чтобы перейти к обновлению вашей марионеточной инфраструктуры.

Надеюсь, что это поможет, или, по крайней мере, указывает вам в правильном направлении.


2 Felix Frank [2015-11-01 22:03:00]

Есть способ в Puppet 4.

class { 'ssh':
  * => $settings
}

Узнайте все об этом на блоге roidelapluie.