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

Переход на Puppet 4.5.2

Мы переходим на более поздние версии марионетки.

Новая версия:

# puppet --version
4.5.2

Существующая версия:

#puppet-3.8.7

Наш существующий site.pp выглядит следующим образом:

#A default site.pp to do a quick test run
import "../classes/*"
import "../nodes/*"
   file { 'testfile':
       path => '/home/test/testfile',
       ensure => present,
       mode => 0755,
       content => "A test file to check a different manifestdir" ,
      }
 Exec { path => ["/bin" , "/sbini/", "/usr/bin" , "/usr/sbin/"]  }

Теперь, когда мы переходим на Puppet 4, я думаю, что нижеприведенная функция импорта для включения нескольких файлов pp не будет работать здесь, в Puppet 4

import "../classes/*"
import "../nodes/*" 

Если я не ошибаюсь, я могу скопировать все манифесты из каталога классов и узлов в приведенный ниже каталог манифеста.

/apps/puppetlabs/code/environments/production/manifests/site.pp          

Подскажите, пожалуйста, как обновить манифесты до более поздних версий Puppet, или нет проблем с совместимостью?

Если я не ошибаюсь, я могу скопировать все манифесты из каталога классов и узлов в приведенный ниже каталог манифеста.

Да, каталог манифеста будет импортирован рекурсивно, так что это лучшее, что можно сделать.

Подскажите, пожалуйста, как обновить манифесты до более поздних версий Puppet, или нет проблем с совместимостью?

Есть много тонких изменений, поэтому проверьте свои манифесты на Puppet 3 с будущим парсером (--parser future), чтобы увидеть, насколько хорошо они работают.

Начать с Puppet 3.x до 4.x: подготовьтесь к обновлению, примечания к выпуску и Прекращение поддержки Puppet 3.8.

Ниже приведены изменения, которые мне пришлось внести для переноса кода с Puppet на Puppet 4.

  • Использование функции импорта не рекомендуется.

Код куклы 3:

Мой site.pp использовал функцию импорта для вызова других манифестов, как показано ниже.

 import "../classes/*"
 import "../nodes/*"

Код куклы 4:

Каталог скопированных узлов и классов в каталог манифестов, как указано в `puppet config print manifest '

  # puppet config print manifest
   /etc/puppetlabs/code/environments/production/manifests

  # ls /etc/puppetlabs/code/environments/production/manifests
    classes nodes 

Нет требований для site.pp в моем случае, поскольку у нас есть манифесты для нескольких узлов. Помещение классов и узлов в каталог манифестов приведет к тому, что марионетка будет рекурсивно читать каждый из узлов манифестов node.

  • Изменение синтаксиса при написании шаблонов Puppet

    Код куклы 3:

    <%= ipaddress %> dev.example.com

    При применении на Puppet 4 возникала следующая ошибка

    Call, Failed to parse template /etc/puppet/templates/Node-002/hosts.erb: Filepath: /etc/puppet/templates/Node-002/hosts.erb: Line: 1 Detail: undefined local variable or method 'ipaddress' for #<Puppet::Parser::TemplateWrapper:0x007ffa98fb55c8>

    Код куклы 4:

Обновил код следующим образом, и после этого манифесты применялись нормально
<%= @ipaddress %> node-002.example.com

- Представление числового значения атрибута

Код куклы 3:

 ` file { "/etc/sudoers":
     path => "/etc/sudoers",
     ...
     mode => 440,
    }    `

Это не удалось с ошибкой ниже

     `Error: Failed to apply catalog: Parameter mode failed on File[/etc/sudoers]: The file mode specification must be a string, not 'Fixnum' at /etc/puppetlabs/code/environments/production/manifests/classes/user_default.pp:7`

Код куклы 4: Исправление заключалось в том, чтобы поместить значение режима в кавычки

   `file { "/etc/sudoers":
     path => "/etc/sudoers",
     ...
     mode => "440",
    }      ` 

Это основные проблемы, с которыми я столкнулся при переходе на Puppet 4. После этого миграция прошла гладко.