Puppet — переменный приоритет при применении с узлом

В настройках, над которыми я работаю, переменная $var1 объявлена ​​в нескольких местах. Однако я не уверен, какая строка применялась последней. Структура следующая.

Модуль puppet, module1, содержит класс vars.pp, который наследуется его манифестом init.pp. В манифесте vars.pp var1 объявлен как «value-vars».

#vars.pp
$var1 = "value-vars"

Этот модуль применяется к любому узлу, который соответствует определенному регулярному выражению, определенному в файле nodes.pp.

#nodes.pp
node "/nodepattern/" inherits base {
require module1
}

nodes.pp наследуется от base.pp, который объявляет var1 как «базу значения».

#base.pp
$var1 = "value-base"

Теперь, когда модуль применяется к определенному узлу, какое значение будет содержать var1?

Это «значение-вары», потому что блок узла применяется перед классом?

ОБНОВИТЬ

├── puppet3
│   ├──**manifests**
│   │   └───**nodes**
│   │     └──base.pp (node "base", $var1 = "value-base") 
│   ├──nodes.pp (various nodes inheriting base node, contains module1 node)
│   ├──**modules**
│   │    ├──**module1**
│   │    │    ├──**manifests**
│   │             ├──vars.pp (class "vars", $var1 = "value-vars")
│   │             ├──init.pp (class "module1", inherits vars class)

person chamilad    schedule 26.08.2014    source источник
comment
Вы можете просто сделать notify {"value: ${var1}":}, чтобы показать значение при тестировании с помощью puppet agent -t или notice("value: ${var1}"), чтобы добавить сообщение в журнал мастера.   -  person webNeat    schedule 26.08.2014
comment
Спасибо за идею webNeat, но эта конкретная настройка довольно сложная, часть кода управления облаком. Для этого мне нужно настроить множество систем и узлов. Я искал теоретическое объяснение этого.   -  person chamilad    schedule 26.08.2014


Ответы (1)


Я чувствую некоторую путаницу здесь. Манифест не может «наследовать» другой манифест. Что еще хуже - из Puppet 4.0 файл манифеста даже не сможет import создать другой.

Это оставляет ограниченные возможности для объявления глобальных переменных. В любом случае вам следует избегать глобального объявления одной и той же переменной в разных .pp файлах, потому что любая компиляция, которая импортирует оба файла, завершится ошибкой!

Структура, которая работает как «если этот узел включает модуль A, используйте значение X для переменной N», с Puppet сложна. Манифесты работают лучше всего, если есть одна центральная часть информации, на которую вы можете положиться, например.

node <long-cloud-instance-name-here> {
    $uses_app_foo = true
    $is_master_server = false
    include my_cloud_app
}

И решение о включении модуля A, и назначение X на N должны основываться на этих переменных области видимости узла.

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

Обновлять

Судя по тому, что вы используете классы, вот дополнительные правила, которые должны внести ясность:

  1. переменная, объявленная в локальной области (класс или тело определения), скрывает переменные из более широких областей, которые имеют то же имя
  2. переменная, объявленная в блоке узлов, скрывает глобальные переменные с тем же именем

Порядок оценки не играет роли. Правила масштабирования применяются всегда. Множественные присваивания в одной и той же области действия запрещены и приводят к ошибке компилятора. Поскольку вы не сталкиваетесь с таким сценарием, применяются приведенные выше правила.

$foo = 'global'

# $foo == 'global'

node default {
    $foo = 'node'
    include bar
    # $foo == 'node'
}

class bar {
    $foo = 'class'
    # $foo == 'class'
    include baz
}

class baz {
    # foo == 'node' (!)
}
person Felix Frank    schedule 26.08.2014
comment
Моя ошибка, Феликс, vars.pp — это класс, который наследует init.pp. Поскольку структура появляется, не будет конфликта, созданного при импорте обоих файлов. Я обновлю исходный вопрос диаграммой структуры. - person chamilad; 26.08.2014
comment
Можете ли вы ясно указать в своих фрагментах кода, объявлены ли переменные внутри соответствующего тела класса? Потому что это имеет решающее значение. - И да, vars.pp не класс - это файл манифеста, содержащий класс module1::vars. Также важны полные имена классов. - person Felix Frank; 26.08.2014
comment
Обновил мой ответ тем, что, как мне кажется, вы хотели знать. - person Felix Frank; 26.08.2014