Я использую марионетку 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