« Все это файл » — это очень известный принцип Unix. И из-за этого большинство управлений конфигурации на Unix/Linux вращается вокруг управляющих файлов.
Кукольный, как инструмент управления конфигурацией, не является исключением из этого. Как следствие, есть много способов управления файлами конфигурации с помощью кукол. У всех нас есть причина, чтобы существовать, и цель выполнить.
Знание ваших инструментов — это объект этого поста в блоге, со следующими темами:
- Знать ваши инструменты
- Подходы к управлению файлами
- Управление целыми конфигурациями
- Статический контент
- Развертывание скриптов и двоичных данных
- Остерегайтесь источника
- Динамическое содержание
- Очистительные типы
- Содержание от одного объема
- Содержание из нескольких областей
- Включает в себя
- Впадинат
- Содержание из примера файла
- Управляющие частичные конфигурации
- Родные типы
- Включает в себя
- Аввес Тип
- Строка файлов
- Вывод
Давайте начнем с первого выбора при управлении файлами:
- управление всей конфигурацией
- Управляющие частичные конфигурации
Многие практикующие, которые я встречал, считаю, что управление целыми конфигурациями является единственным приемлемым способом продолжения, поскольку управление частичной конфигурацией не приводит к предсказуемому окончательному состоянию.
Однако управление целыми конфигурациями часто приводит к управлению умолчанию, которые были тщательно выбраны для вашего распределения GNU/Linux и были совершенно хорошими, чтобы сохранить. Он также приводит к поддержанию множества различных по умолчанию в модулях, чтобы попытаться оставаться как можно ближе к стандартам распределения при использовании значений по умолчанию.
Таким образом, оба подхода имеют плюсы и минусы.
Это подход, который вы принимаете, когда хотите контролировать полное содержание конфигурации программного обеспечения. Однако это не означает, что все должно вписаться в один файл; Конфигурация может быть разделена, а расщепление часто делает управление конфигурацией более гибкой.
Статический контент
Самый простой случай — без сомнения, управление статическим содержанием, когда ваш файл всегда одинаково.
Однако проще это может показаться, там все еще могут быть трюки.
Развертывание скриптов и двоичных данных
Например, скрипты и двоичные капли могут легко управлять таким способом в куколке, и мы часто видим код, такой как:
file { '/usr/local/bin/myscript.sh': ensure => file, source => "puppet:///modules/${module_name}/myscript.sh", }
Работает нормально, но если вы пытаетесь развернуть программное обеспечение (может быть, даже с тарболом, используя Modive Mool Archive Module), возможно, лучше упаковать его для вашего распределения и использовать свой диспетчер пакетов (APT/yum/etc.) как слой развертывания. Вы получите гораздо более простой кукольный код, обычно лучшую производительность, и вы полагаетесь на метаданные менеджера пакета для IDEMPottence:
package { 'myscript': ensure => present, }
Другая возможность использует puppetlabs-vcsrepo
Тип ресурса. VCS (E.g. Git) затем предоставляют метаданные для обеспечения IdEmpottence E.:
vcsrepo {'/usr/src/ceph-rbd-backup': ensure => latest, provider => 'git', source => 'https://github.com/camptocamp/ceph-rbd-backup', revision => 'master', }
Остерегайтесь источника
При использовании Файл
Тип, чтобы развернуть статический контент, довольно часто использовать Источник
атрибут, чтобы указать файл для копирования:
file { '/srv/foo': ensure => file, source => "puppet:///modules/${module_name}/foo", }
Это использует Puppeterver’s Функция Fileserver . При использовании этого синтаксиса каждый кукольный прогон приведет к file_metadata
. HTTP-запрос на Puppeterver для каждого удаленного файла, просто чтобы получить метаданные, необходимые для решения того, необходимо ли заменять файл или нет.
Когда многие файлы управляются таким образом на многих агентах, это приводит к множеству HTTP-запросов, выполненных во время приложения каталога, которое будет насыщать нити jruby jruby jruby и предотвратить их компиляции и отчеты о обработке и отчетах.
Вместо этого при развертывании невоикового контента вы можете использовать Файл ()
Функция с относительным путем:
file { '/srv/foo': ensure => file, content => file("${module_name}/foo"), }
Это полностью эквивалентно предыдущему синтаксису, за исключением всего этого файла будет включен в каталог, а не только указатель на файловый сервер.
Динамическое содержание
Очень часто статический контент недостаточно для настройки вашего программного обеспечения. Вам нужны переменные и более гибкий подход.
Очистительные типы
Снадельные типы Ruby Ruby, вероятно, являются наиболее гибким способом управления конфигурацией, поскольку они обеспечивают очень мелкозернистый интерфейс для редактирования файлов конфигурации.
Однако они не управляют всей конфигурацией по умолчанию. То есть, если вы не можете использовать с ними продувки.
Очистные ресурсы в марионетеке требуются два условия:
- Тип, который поддерживает экземпляры листинга (по крайней мере, один поставщик имеет a
self.instances
Метод определен) - параметр, который может обеспечить отсутствие ресурса
Когда оба эти условия будут выполнены, марионетка может очистить ресурсы, которые она не контролирует:
- Перечисление всех известных ресурсов (используя
Self.instances
Метод) - Установка всех из них отсутствует по умолчанию
- Переопределение наличия с явными параметрами ресурсов каталога
Есть два основных способа достижения этого:
- Используя стандарт
Ресурсы
тип - используя
CrayfishF-Purge
модуль
Ресурсы
Тип соответствует основным потребностям, позволяя очистить все ресурсы, не управляемые марионетками. Например:
host { 'localhost': ensure => present, ip => '127.0.0.1', } resources { 'host': purge => true, }
очистит все записи в /etc/hosts
За исключением localhost.
Ресурсы
Тип ресурса также позволяет устанавливать исключения, хотя только для Пользователь
тип:
resources { 'user': purge => true, unless_system_user => true, }
Это твердое ограничение, которое чистка
Тип Исправления, предоставляя более гибкий интерфейс, позволяющий установить:
- Прекрасные условия для очистки ресурсов
- Какой параметр и значение для использования для очищения.
Например:
purge { 'mount': state => unmounted, unless => ['name', '==', ['/', '/var', '/home']], }
Размонтируется все файловые системы, которые не управляются марионетками, если они не установлены на /
, /var
или /дом
.
Для того, чтобы управлять конфигурациями в полном объеме, чистка
Тип можно использовать с собственными типами, которые управляют файлом конфигурации Stanzas и узнают, как перечислить экземпляры.
Это случай:
-
хозяин
тип -
MailAlias
тип - Большинство Типы аввеспровидиров
Например, вы можете управлять sshd_config
в полном объеме, используя herculesteam-auveasproviders_ssh
Модуль с таким кодом, как:
sshd_config { 'X11Forwarding': value => 'yes', ; 'UsePAM': value => 'no', ; } purge { 'sshd_config': }
Содержание от одного объема
Когда в вашем типе файлов конфигурации нет числу типов, и вам нужно управлять контентом из одного объема (один класс для марионеток), наиболее очевидным вариантом является использование простого Файл
Ресурс с шаблоном. Предпочитаю Эпп шаблоны В эти дни, так как они проще и безопаснее, чем шаблоны ERB:
file { '/path/to/foo': ensure => file, content => epp( "${module_name}/foo.epp", { var1 => 'value1', var2 => 'value2', } ), }
Содержание из нескольких областей
Когда ваш контент должен прийти из нескольких областей, один Файл
Ресурс не хватает.
Включает в себя
Если вам повезет, и ваш формат конфигурации поддерживает утверждения, это самый простой способ пойти. Например:
# Deploy a static file to perform the inclusion file { '/etc/sudoers': ensure => file, content => '#includedir /etc/sudoers.d', } # Deploy each rule as a separate file in the directory file { '/etc/sudoers.d/defaults_env': ensure => file, content => 'Defaults env_reset', } file { '/etc/sudoers.d/foo': ensure => file, content => 'foo ALL=(ALL:ALL) ALL', } # Let Puppet purge the directory of all unknown files file { '/etc/sudoers.d': ensure => directory, purge => true, }
Впадинат
Многие форматы конфигурации не поддерживают: все должно быть в одном файле. Управляя таким файлом из нескольких природов требует использования модуля CONCAT.
Наиболее используемый модуль CONCAT является официальным CuppetLabs-Concat.
. Он позволяет объявить целевой файл, где все фрагменты будут объединены, а затем развертывают несколько фрагментов, помеченных для этой цели. Например, пример судёров выше примерно эквивалентен:
concat { '/etc/sudoers': ensure => present, } concat::fragment { 'defaults_env': target => '/etc/sudoers', content => 'Defaults env_reset', order => '01', } concat::fragment { 'foo': target => '/etc/sudoers', content => 'foo ALL=(ALL:ALL) ALL', order => '10', }
Каждый фрагмент развернут отдельно к агенту, затем объединяется для генерации конечного файла.
Содержание из примера файла
Несколько лет назад я экспериментировал с еще одним вариантом для управления полным динамическим содержанием, не теряя преимущества по умолчанию Sane Distrible.
Camptocamp-Aveas_file
Тип ресурса позволяет использовать локальный файл на кукольном агенте как шаблон, на котором применяются изменения AUVEAS, чтобы генерировать конечный файл:
augeas_file { '/etc/apt/sources.list.d/jessie.list': lens => 'Aptsources.lns', base => '/usr/share/doc/apt/examples/sources.list', changes => ['setm ./*[distribution] distribution jessie'], }
Каждый раз, когда бежит кукольный агент, он будет использовать /usr/share/doc/apt/example/sources.blist
как шаблон и применить изменения
используя Augeas для генерации /etc/apt/sources.list.d/jessie.list
Отказ Целевой файл написан только в том случае, если возникают какие-либо изменения, что делает его IDEMPotent. Если шаблон меняется (например, после обновления пакета), цель будет регенерирована.
Частичные конфигурации имеют меньше вариантов, которые нужно управлять. Они по существу, светлые версии параметров, указанных выше:
Родные типы
Так же как Для полных конфигураций , Вы можете использовать родные марионетки ( HOST
, MailAlias
, аввеспровидировщики и т. Д.), Не очищая их.
Кроме того, поскольку вы не против управлять файлами частично, вы также можете использовать типы, которые не поддерживают продувки, такие как ini_setting
Для типов файлов INI:
ini_setting { "sample setting": ensure => present, path => '/tmp/foo.ini', section => 'bar', setting => 'baz', value => 'quux', }
или Shellvar
Тип Для файлов конфигурации оболочки:
shellvar { "ntpd options": ensure => present, target => "/etc/sysconfig/ntpd", variable => "OPTIONS", value => "-g -x -c /etc/myntp.conf", }
Включает в себя
Включает в себя работу так же как для целых конфигураций, но без очистки каталога.
Аввес Тип
Если не существует AUVEASPROVIDERS для вашего типа ресурса, но имеет Доступный объектив Для вашего формата конфигурации вы можете, скорее всего, использовать Аввес
Тип ресурса манипулировать им.
Это часто используется для манипулирования конфигурациями XML, например:
augeas {'foo.xml': incl => '/tmp/foo.xml', context => '/files/tmp/foo.xml/foo', lens => 'Xml.lns', changes => [ 'set bar/#text herp', ], }
File_line.
Я сохранил file_line
Для конца этого списка, потому что это действительно последний вариант, который вы можете посмотреть (так же, как Exec
), поскольку имеет много падений.
Однако, если вы получили это далеко, вы, вероятно, либо:
- пытаясь исправить упакованное программное обеспечение, которое является очень неприятной вещью; Гораздо лучше переупаковать его должным образом (и отправить патч в сопровождающую 😁, вот как работает Open-Source!)
- Отредактируйте странный файл конфигурации, например
.bashrc
(который TheShellvar
Тип обычно анализирует довольно хорошо) или какой-то конфигурация PHP или PERL … Я не завидую вам, если у вас нет возможности использования шаблонов/Concat для этого!
Там много инструментов для управления файлами в кукол.
У вас есть другие модули/типы ресурсов, которые вам нравятся использовать для этого? Дай мне знать в комментариях!
Оригинал: «https://dev.to/camptocamp-ops/how-to-manage-files-with-puppet-55e4»