Разница между «::mysql::server» и «mysql::server»

#puppet

#кукольный

Вопрос:

Я просматривал старый кукольный код. Для установки mysql-сервера использовался модуль mysql puppet.

Я наткнулся на это

 class { '::mysql::server':

}
  

и это

 class { 'mysql::server':
}
  

Теперь я в замешательстве. Означают ли они одно и то же или между ними есть какая-то разница?

Комментарии:

1. Сейчас они означают одно и то же, но так было не всегда.

2. @JohnBollinger Бьюсь об заклад, вы могли бы написать действительно хороший ответ на этот вопрос. Вы не могли бы сделать это?

Ответ №1:

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

Я всегда предполагал, что начальное значение :: было необходимо, чтобы избежать неоднозначности области видимости (где include bar in class foo будет включать ::foo::bar , а не ::bar ), но, проверяя документы, они говорят, что, например, include должно использоваться полное имя класса.

Рабочий пример:

 $ cat scope.pp
class foo {
  class bar {
    notice("foo::bar")
  }
  class { 'bar':
  }
}

class bar {
  notice("bar")
}

class { 'foo':
}
$ puppet apply scope.pp
Notice: Scope(Class[Bar]): bar
  

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

 $ cat var_scope.pp
$bar = "bar"

class foo {
  $bar = "foo::bar"
  notice($::bar)
  notice($bar)
}

include foo
notice($bar)
$ puppet apply var_scope.pp
Notice: Scope(Class[Foo]): bar
Notice: Scope(Class[Foo]): foo::bar
Notice: Scope(Class[main]): bar
  

Комментарии:

1. Ведущее значение :: является излишним в текущем Puppet, но его использование в Puppet 2 было обычной практикой, потому что там оно действительно решало проблемы с областью видимости, такие, как вы предполагаете. Я забыл, было ли это Puppet 3 или Puppet 4, где это изменилось, но определенно, по крайней мере, начиная с Puppet 4, вам не нужно двойное двоеточие в начале.

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

Ответ №2:

Означают ли они одно и то же или между ними есть какая-то разница?

TL; DR: Они означают одно и то же для классов и определенных типов. То, что поддерживается форма с начальным :: , можно рассматривать либо как функцию обратной совместимости, либо как функцию внутренней согласованности, либо и то, и другое. Однако для переменных начало :: указывает на переменную верхнего уровня, которая может быть или не быть тем, что вы получаете, если используете простое имя переменной.


Чтобы прояснить некоторые детали прекрасного ответа, который уже представил @ Jon, мы должны рассмотреть поведение Puppet версии 3 и более ранних. Это больше не документировано на главном сайте документации Puppet, но мы можем найти соответствующие документы в онлайн-архиве устаревшей документации Puppet. В частности, мы хотим взглянуть на пространства имен Puppet и их поведение. Документы которые интересно читать, если вы в такого рода вещи, особенно в исторической перспективе, о том, как марионетки 3 оказалась там, где она была, но вот прихотливую версию событий:

Вначале Кузница была бесформенной и пустой, и в ней не было модулей. Каждый написал свой собственный код для всего, и сторонники devops были сильно угнетены, изобретая множество колес.

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

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

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

И Reductive, тогда называвшая себя Puppet Labs, пожалела о создании относительного разрешения имен и призвала людей следовать совету мудрецов. Но когда это породило Третью эру Puppet, это не могло заставить себя беспокоить тех людей, которые не обращали внимания, поэтому это позволило сохранить относительное разрешение имен.

Но на заре Четвертой эпохи Puppet, больше не labs, нашла в себе смелость, наконец, отказаться от относительного разрешения имен, и этого больше не было. С того дня Puppet больше не призывает поставщиков и пользователей классов и типов использовать двойное двоеточие, однако он чтит наследие прошлой мудрости и испытывает жалость к тем, кто не спешит отучиться от этого.

Тем не менее, Puppet, по своему милосердию, выбрал переменные класса из всех именованных объектов как единственные, которые носят два имени. У них есть области, которые выходят за рамки пространства имен, и в своих областях они могут быть известны под простыми именами своих определений. Однако, как и все именованные объекты, они могут быть известны где угодно по их именам в пространстве имен, образованным из их простых имен и имен их классов, в любой форме. Но что тогда с переменными верхней области видимости? Под каким именем они могут быть известны, когда они скрыты в тени? Здесь пока используется ведущее двойное двоеточие. Его метка верхней области видимости не является избыточной для переменных, и некоторые из мудрецов делают свой код понятным, всегда используя его для таких переменных.