Учебники

Кукольный — живой проект

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

Начнем с создания нового модуля.

Создание нового модуля

Первый шаг в тестировании и применении конфигурации httpd — создание модуля. Для этого пользователь должен изменить свой рабочий каталог на каталог модулей Puppet и создать базовую структуру модуля. Создание структуры может быть сделано вручную или с помощью Puppet, чтобы создать шаблон для модуля.

# cd /etc/puppet/modules 
# puppet module generate Live-module

Примечание. Команда создания модуля Puppet требует, чтобы имя модуля принимало формат [имя пользователя] — [модуль] для соответствия спецификациям Puppet Forge.

Новый модуль содержит несколько основных файлов, включая каталог манифеста. Каталог уже содержит манифест с именем init.pp, который является основным файлом манифеста модулей. Это пустое объявление класса для модуля.

class live-module { 
} 

Модуль также содержит тестовый каталог, содержащий манифест с именем init.pp. Этот тестовый манифест содержит ссылку на класс live-module в manifest / init.pp:

include live-module

Puppet будет использовать этот тестовый модуль для проверки манифеста. Теперь мы готовы добавить конфигурацию в модуль.

Установка HTTP-сервера

Модуль Puppet установит необходимые пакеты для запуска http-сервера. Это требует определения ресурса, который определяет конфигурацию пакетов httpd.

В каталоге манифеста модуля создайте новый файл манифеста с именем httpd.pp

# touch test-module/manifests/httpd.pp

Этот манифест будет содержать всю конфигурацию HTTP для нашего модуля. В целях разделения мы будем хранить файл httpd.pp отдельно от файла манифеста init.pp

Нам нужно поместить следующий код в файл манифеста httpd.pp.

class test-module::httpd { 
   package { 'httpd': 
      ensure => installed, 
   } 
}

Этот код определяет подкласс тест-модуля с именем httpd, а затем определяет объявление ресурса пакета для пакета httpd. Атрибут sure => selected проверяет, установлен ли требуемый пакет. Если он не установлен, Puppet использует утилиту yum для его установки. Далее следует включить этот подкласс в наш основной файл манифеста. Нам нужно отредактировать манифест init.pp.

class test-module { 
   include test-module::httpd 
}

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

# puppet apply test-module/tests/init.pp --noop

Команда puppet apply применяет конфигурацию, представленную в файле манифеста в целевой системе. Здесь мы используем тест init.pp, который ссылается на основной init.pp. –Noop выполняет пробный запуск конфигурации, которая показывает только выходные данные, но фактически ничего не делает.

Ниже приводится вывод.

Notice: Compiled catalog for puppet.example.com in environment 
production in 0.59 seconds 

Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure: 
current_value absent, should be present (noop) 

Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 1 
events 

Notice: Stage[main]: Would have triggered 'refresh' from 1 events 
Notice: Finished catalog run in 0.67 seconds 

Выделенная строка является результатом установленного атрибута обеспечивает => установленный. Отсутствует current_value означает, что Puppet обнаружил, что пакет httpd установлен. Без опции –noop Puppet установит пакет httpd.

Запуск сервера httpd

После установки серверов httpd нам нужно запустить службу, используя замедление другого ресурса: Сервис

Нам нужно отредактировать файл манифеста httpd.pp и отредактировать следующее содержимое.

class test-module::httpd { 
   package { 'httpd': 
      ensure => installed, 
   } 
   service { 'httpd': 
      ensure => running, 
      enable => true, 
      require => Package["httpd"], 
   } 
}

Ниже приведен список целей, которые мы достигли из приведенного выше кода.

  • Состояние sure => проверяет, запущена ли служба, а если нет, то включает ее.

  • Атрибут enable => true устанавливает службу для запуска при загрузке системы.

  • Атрибут require => Package [«httpd»] определяет порядок упорядочения между одним замедлением ресурса и другим. В приведенном выше случае он гарантирует, что служба httpd запускается после установки пакета http. Это создает зависимость между службой и соответствующим пакетом.

Состояние sure => проверяет, запущена ли служба, а если нет, то включает ее.

Атрибут enable => true устанавливает службу для запуска при загрузке системы.

Атрибут require => Package [«httpd»] определяет порядок упорядочения между одним замедлением ресурса и другим. В приведенном выше случае он гарантирует, что служба httpd запускается после установки пакета http. Это создает зависимость между службой и соответствующим пакетом.

Запустите команду Puppet apply, чтобы снова проверить изменения.

# puppet apply test-module/tests/init.pp --noop 
Notice: Compiled catalog for puppet.example.com in environment 
production in 0.56 seconds 

Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure: 
current_value absent, should be present (noop) 

Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure: 
current_value stopped, should be running (noop) 

Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 2 
events 

Notice: Stage[main]: Would have triggered 'refresh' from 1 events 
Notice: Finished catalog run in 0.41 seconds 

Настройка httpd сервера

После выполнения вышеуказанных шагов у нас будет установлен и включен HTTP-сервер. Следующий шаг — предоставить некоторую конфигурацию серверу. По умолчанию httpd предоставляет некоторые конфигурации по умолчанию в /etc/httpd/conf/httpd.conf, который предоставляет порт 80 веб-хоста. Мы добавим несколько дополнительных хостов, чтобы обеспечить некоторые пользовательские возможности для веб-хоста.

Шаблон будет использоваться для предоставления дополнительного порта, так как он требует ввода переменной. Мы создадим каталог с именем template и добавим файл с именем test-server.config.erb в нового директора и добавим следующий контент.

Listen <%= @httpd_port %> 
NameVirtualHost *:<% = @httpd_port %> 

<VirtualHost *:<% = @httpd_port %>> 
   DocumentRoot /var/www/testserver/ 
   ServerName <% = @fqdn %> 
   
   <Directory "/var/www/testserver/"> 
      Options All Indexes FollowSymLinks 
      Order allow,deny 
      Allow from all 
   </Directory> 
</VirtualHost>

Приведенный выше шаблон соответствует стандартному формату конфигурации сервера apache-tomcat. Единственное отличие — использование escape-символа Ruby для вставки переменных из модуля. У нас есть полное доменное имя, в котором хранится полное доменное имя системы. Это известно как системный факт .

Системные факты собираются из каждой системы перед созданием каталога марионеток каждой соответствующей системы. Puppet использует команду facter для получения этой информации, и можно использовать facter для получения других подробностей, касающихся системы. Нам нужно добавить выделенные строки в файле манифеста httpd.pp.

class test-module::httpd { 
   package { 'httpd': 
      ensure => installed, 
   } 
   service { 'httpd': 
      ensure => running, 
      enable => true, 
      require => Package["httpd"], 
   } 
   file {'/etc/httpd/conf.d/testserver.conf': 
      notify => Service["httpd"], 
      ensure => file, 
      require => Package["httpd"], 
      content => template("test-module/testserver.conf.erb"), 
   } 
   file { "/var/www/myserver": 
      ensure => "directory", 
   } 
}

Это помогает в достижении следующих вещей —

  • Это добавляет объявление файлового ресурса для файла конфигурации сервера (/etc/httpd/conf.d/test-server.conf). Содержимое этого файла представляет собой шаблон test-serverconf.erb, который был создан ранее. Мы также проверяем пакет httpd, установленный перед добавлением этого файла.

  • Это добавляет второе объявление файлового ресурса, которое создает каталог (/ var / www / test-server) для веб-сервера.

  • Затем мы добавляем связь между файлом конфигурации и службой https с помощью атрибута notify => Service [«httpd»] . Это проверяет, есть ли какие-либо изменения файла конфигурации. Если есть, то Puppet перезапускает сервис.

Это добавляет объявление файлового ресурса для файла конфигурации сервера (/etc/httpd/conf.d/test-server.conf). Содержимое этого файла представляет собой шаблон test-serverconf.erb, который был создан ранее. Мы также проверяем пакет httpd, установленный перед добавлением этого файла.

Это добавляет второе объявление файлового ресурса, которое создает каталог (/ var / www / test-server) для веб-сервера.

Затем мы добавляем связь между файлом конфигурации и службой https с помощью атрибута notify => Service [«httpd»] . Это проверяет, есть ли какие-либо изменения файла конфигурации. Если есть, то Puppet перезапускает сервис.

Далее следует включить httpd_port в основной файл манифеста. Для этого нам нужно завершить основной файл манифеста init.pp и включить следующий контент.

class test-module ( 
   $http_port = 80 
) { 
   include test-module::httpd 
}

Это устанавливает для порта httpd значение по умолчанию, равное 80. Далее необходимо выполнить команду Puppet apply.

Ниже будет вывод.

# puppet apply test-module/tests/init.pp --noop 
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera 
defaults 

Notice: Compiled catalog for puppet.example.com in environment 
production in 0.84 seconds 

Notice: /Stage[main]/test-module::Httpd/File[/var/www/myserver]/ensure: 
current_value absent, should be directory (noop) 

Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure: 
current_value absent, should be present (noop) 

Notice: 
/Stage[main]/test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensure: 
current_value absent, should be file (noop) 

Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure: 
current_value stopped, should be running (noop) 

Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 4 
events 

Notice: Stage[main]: Would have triggered 'refresh' from 1 events 
Notice: Finished catalog run in 0.51 seconds 

Настройка брандмауэра

Для связи с сервером требуется открытый порт. Проблема в том, что в разных операционных системах используются разные методы управления брандмауэром. В случае Linux версии ниже 6 используют iptables, а версия 7 использует firewalld.

Решение об использовании соответствующего сервиса несколько принимается Puppet с использованием системных фактов и их логики. Для этого нам нужно сначала проверить ОС, а затем запустить соответствующую команду брандмауэра.

Для этого нам нужно добавить следующий фрагмент кода внутри класса testmodule :: http.

if $operatingsystemmajrelease <= 6 { 
   exec { 'iptables': 
      command => "iptables -I INPUT 1 -p tcp -m multiport --ports 
      ${httpd_port} -m comment --comment 'Custom HTTP Web Host' -j ACCEPT && 
      iptables-save > /etc/sysconfig/iptables", 
      path => "/sbin", 
      refreshonly => true, 
      subscribe => Package['httpd'], 
   } 
   service { 'iptables': 
      ensure => running, 
      enable => true, 
      hasrestart => true, 
      subscribe => Exec['iptables'], 
   } 
}  elsif $operatingsystemmajrelease == 7 { 
   exec { 'firewall-cmd': 
      command => "firewall-cmd --zone=public --addport = $ { 
      httpd_port}/tcp --permanent", 
      path => "/usr/bin/", 
      refreshonly => true, 
      subscribe => Package['httpd'], 
   } 
   service { 'firewalld': 
      ensure => running, 
      enable => true, 
      hasrestart => true, 
      subscribe => Exec['firewall-cmd'], 
   } 
} 

Приведенный выше код выполняет следующее:

  • Используя операционную систему, можно определить, является ли используемая ОС версии 6 или 7.

  • Если версия 6, то он запускает все необходимые команды конфигурации для настройки версии Linux 6.

  • Если версия ОС 7, тогда она запускает все необходимые команды, необходимые для настройки брандмауэра.

  • Фрагмент кода для обеих ОС содержит логику, которая обеспечивает запуск конфигурации только после установки пакета http.

Используя операционную систему, можно определить, является ли используемая ОС версии 6 или 7.

Если версия 6, то он запускает все необходимые команды конфигурации для настройки версии Linux 6.

Если версия ОС 7, тогда она запускает все необходимые команды, необходимые для настройки брандмауэра.

Фрагмент кода для обеих ОС содержит логику, которая обеспечивает запуск конфигурации только после установки пакета http.

Наконец, запустите команду Puppet apply.

# puppet apply test-module/tests/init.pp --noop 
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera 
defaults 

Notice: Compiled catalog for puppet.example.com in environment 
production in 0.82 seconds 

Notice: /Stage[main]/test-module::Httpd/Exec[iptables]/returns: 
current_value notrun, should be 0 (noop) 

Notice: /Stage[main]/test-module::Httpd/Service[iptables]: Would have 
triggered 'refresh' from 1 events 

Конфигурирование SELinux

Поскольку мы работаем на машине с Linux версии 7 и выше, следовательно, нам необходимо настроить ее для установления http-связи. По умолчанию SELinux ограничивает нестандартный доступ к HTTP-серверу. Если мы определяем пользовательский порт, то нам нужно настроить SELinux для предоставления доступа к этому порту.

Puppet содержит некоторый тип ресурса для управления функциями SELinux, например, логические значения и модули. Здесь нам нужно выполнить команду semanage для управления настройками порта. Этот инструмент является частью пакета policycoreutils-python, который по умолчанию не установлен на серверах Red Hat. Для достижения вышесказанного нам нужно добавить следующий код внутри класса test-module :: http.

exec { 'semanage-port': 
   command => "semanage port -a -t http_port_t -p tcp ${httpd_port}", 
   path => "/usr/sbin", 
   require => Package['policycoreutils-python'], 
   before => Service ['httpd'], 
   subscribe => Package['httpd'], 
   refreshonly => true, 
} 

package { 'policycoreutils-python': 
   ensure => installed, 
} 

Приведенный выше код выполняет следующее:

  • Пакет require => Package [‘policycoreutils-python’] гарантирует, что у нас установлен необходимый модуль python.

  • Puppet использует semanage, чтобы открыть порт, используя httpd_port в качестве проверяемого.

  • Служба before => гарантирует выполнение этой команды до запуска службы httpd. Если HTTPD запускается до команды SELinux, то SELinux запрос на обслуживание и запрос на обслуживание завершаются неудачно.

Пакет require => Package [‘policycoreutils-python’] гарантирует, что у нас установлен необходимый модуль python.

Puppet использует semanage, чтобы открыть порт, используя httpd_port в качестве проверяемого.

Служба before => гарантирует выполнение этой команды до запуска службы httpd. Если HTTPD запускается до команды SELinux, то SELinux запрос на обслуживание и запрос на обслуживание завершаются неудачно.

Наконец, запустите команду Puppet apply

# puppet apply test-module/tests/init.pp --noop 
... 
Notice: /Stage[main]/test-module::Httpd/Package[policycoreutilspython]/ 
ensure: current_value absent, should be present (noop) 
...
Notice: /Stage[main]/test-module::Httpd/Exec[semanage-port]/returns: 
current_value notrun, should be 0 (noop) 
... 
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure: 
current_value stopped, should be running (noop) 

Puppet сначала устанавливает модуль python, затем настраивает доступ к порту и, наконец, запускает службу httpd.

Копирование файлов HTML на веб-хосте

С помощью описанных выше шагов мы завершили настройку http-сервера. Теперь у нас есть готовая платформа для установки веб-приложения, которое Puppet также может настроить. Чтобы проверить, мы скопируем некоторые примеры веб-страниц индекса HTML на сервер.

Создайте файл index.html внутри каталога файлов.

<html> 
   <head> 
      <title>Congratulations</title> 
   <head> 
   
   <body> 
      <h1>Congratulations</h1> 
      <p>Your puppet module has correctly applied your configuration.</p> 
   </body> 
</html> 

Создайте манифест app.pp внутри директории манифеста и добавьте следующее содержимое.

class test-module::app { 
   file { "/var/www/test-server/index.html": 
      ensure => file, 
      mode => 755, 
      owner => root, 
      group => root, 
      source => "puppet:///modules/test-module/index.html", 
      require => Class["test-module::httpd"], 
   } 
}

Этот новый класс содержит одно замедление ресурса. Это копирует файл из файлового каталога модуля на веб-сервер и устанавливает его разрешения. Обязательный атрибут гарантирует, что класс test-module :: http успешно завершит настройку, прежде чем кто-либо применяет test-module :: app.

Наконец, нам нужно включить новый манифест в наш основной init.pp манифест.

class test-module ( 
   $http_port = 80 
) { 
   include test-module::httpd 
   include test-module::app 
} 

Теперь запустите команду apply, чтобы фактически проверить, что происходит. Ниже будет вывод.

# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera 
defaults 

Notice: Compiled catalog for brcelprod001.brcle.com in environment 
production in 0.66 seconds 

Notice: /Stage[main]/Test-module::Httpd/Exec[iptables]/returns: 
current_value notrun, should be 0 (noop) 

Notice: /Stage[main]/Test-module::Httpd/Package[policycoreutilspython]/ 
ensure: current_value absent, should be present (noop) 

Notice: /Stage[main]/Test-module::Httpd/Service[iptables]: Would have 
triggered 'refresh' from 1 events 

Notice: /Stage[main]/Test-module::Httpd/File[/var/www/myserver]/ensure: 
current_value absent, should be directory (noop) 

Notice: /Stage[main]/Test-module::Httpd/Package[httpd]/ensure: 
current_value absent, should be present (noop) 

Notice: 
/Stage[main]/Test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensur 
e: current_value absent, should be file (noop) 

Notice: /Stage[main]/Test-module::Httpd/Exec[semanage-port]/returns: 
current_value notrun, should be 0 (noop) 

Notice: /Stage[main]/Test-module::Httpd/Service[httpd]/ensure: 
current_value stopped, should be running (noop) 

Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 8 
Notice: 
/Stage[main]/test-module::App/File[/var/www/myserver/index.html]/ensur: 
current_value absent, should be file (noop) 

Notice: Class[test-module::App]: Would have triggered 'refresh' from 1 
Notice: Stage[main]: Would have triggered 'refresh' from 2 events Notice: 
Finished catalog run in 0.74 seconds

Выделенная строка показывает результат копирования файла index.html на веб-хост.

Завершение модуля

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