Назад | Перейти на главную страницу

марионетка: факт в манифесте с точкой

Я использую марионетку 4.10.9 с фактером 3.6.8. У меня есть вопросы относительно использования фактов в манифесте, которые я задам в простой и более сложной форме. Во-первых, простой вопрос.

На агенте я вижу следующие адреса:

facter --show-legacy | grep ipaddress
ipaddress => 192.168.25.75
ipaddress_enp0s3 => 10.0.2.15
ipaddress_enp0s8.25 => 192.168.25.75
ipaddress_lo => 127.0.0.1

Я хочу использовать ipaddress_enp0s8.25 (интерфейс vlan) в манифесте. Да, я понимаю, что могу использовать ipaddress, но по причинам, которые я объясню позже, я хотел бы использовать именно интерфейс vlan.

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

   listenip => $ipaddress_enp0s8.25

Эти ссылки ДЕЙСТВУЮТ, но опять же, я хочу использовать именно интерфейс vlan:

   listenip => $ipaddress

   listenip => $networking['ip']

Итак, как я могу использовать ipaddress_enp0s8.25?

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

'Evaluation Error: Operator '[]' is not applicable to an Undef Value.' 

Потому что в то время я пытался использовать:

$networking['interfaces']['enp0s8.25']['ip']

И этого не существует при первоначальном запуске. Я не мог пройти мимо "Загрузка фактов"

Поэтому я остановился на '$ network [' ip ']', который отлично работает. Однако при первом запуске это возвращает 10.0.2.15. При последующих запусках он возвращает желаемый адрес 192.168.25.75. Результатом является, как правило, работающий узел, но для некоторых услуг существует 30-минутный перерыв.

Что я могу использовать здесь, чтобы желаемый адрес vlan стал значением? Я бы хотел попробовать ipaddress_enp0s8.25, но не могу по причинам, указанным выше.

Пару разн. на заметку:

В версии 4 был изменен доступ к фактам. Попробуйте получить доступ к фактам через хэш $ fact, $ fact ['ipaddress_enp0s8.25'], вместо использования переменной верхнего уровня.

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

В этом случае кажется, что этот факт изменил имена, и это проблема, с которой вы столкнулись. В предыдущей версии имя facter было экранировано подчеркиванием, в то время как в более новой версии есть точки, которые не могут быть экранированы (насколько я знаю) при доступе к факту с использованием переменной верхнего уровня, отсюда необходимость использования $ fact хэш.

$ ipaddress_enp0s8.25 будет неправильно интерполирован, так как точка должна быть экранирована.

$ fact ['ipaddress_enp0s8.25'] не будет интерполироваться, поскольку мы обращаемся к элементу хэша в одинарных кавычках.

Подробнее о том, как используются факты в Puppet 4, читайте здесь:

https://puppet.com/docs/puppet/4.10/lang_facts_and_builtin_vars.html