Разница между ":: mysql :: server" и "mysql :: server" - PullRequest
4 голосов
/ 29 марта 2019

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

Я сталкивался с этим

class { '::mysql::server':

}

и это

class { 'mysql::server':
}

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

Ответы [ 2 ]

4 голосов
/ 29 марта 2019

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

Я всегда предполагал, что начальный :: был необходим, чтобы избежать двусмысленности области (где include bar в классе 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
2 голосов
/ 04 апреля 2019

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

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


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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...