Кукла - променлив приоритет, когато се прилага с възел

В настройката, с която работя, променливата $var1 е декларирана на няколко места. Не съм сигурен обаче кой ред е приложен последно. Структурата е следната.

Модулът за марионетки, 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 като "value-base".

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

Сега, когато модулът се приложи към определен възел, каква стойност ще съдържа var1?

Дали е „value-vars“, защото блокът на възел се прилага преди класа?

АКТУАЛИЗИРАНЕ

├── 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