Puppet manifests. Part 1

Липень 6th, 2016 | Теґи: , , ,

Мова маніфестів puppet – декларативна описова мова, створена спеціально для puppet, основа взята з ruby.
PS. Puppet написано на ruby, тому допускається написання маніфестів і на чистій ruby.
Всі типи ресурсів можна побачити командою

puppet resource --types

Сухої теорії я намагаюся уникати, наводитиму приклади.

Тут користуємося основним маніфестом: /etc/puppet/manifests/site.pp.

Resource: FILE.

Створення файлу з визначеним змістом.

file { '/tmp/testfile':
  ensure => file, # вказуємо, що це файл
  content => 'This is puppet
test file!', # додаємо файл
  owner => 'root', # встановлюємо потрібні власника/групу/права
  group => 'root',
  mode => '444',
}

Завантаження файлу з мастера
Щоб цей варіант працював, потрібно налаштувати файл-сервер та авторизацію на puppetmaster (якщо треба обмежити коло доступу до файлів)

>> /etc/puppet/fileserver.conf
# Задаємо назву шари і де вона фізично на ФС знаходиться (тут обмеження доступу не працює, ще з 3.0) 
[files]
   path /var/puppet
   allow *
>> /etc/puppet/auth.conf
# тут уже обмежуємо доступ до шари
path ~ ^/file_(metadata|content)s?/files/
auth yes
allow_ip 127.0.0.1
allow_ip 192.168.0.0/16

створити директорію /var/puppet і перезавантажити puppet.

file { '/tmp/testfile':
  source => "puppet:///files/tmp/file_2.txt",
}

В цьому випадку файл з мастера /var/puppet/tmp/file_2.txt буде завантажено як /tmp/testfile зі збереженням всіх атрибутів.

Створення списку файлів с однаковим вмістом

      file {[
           "/opt/php5.3/etc/php.ini",
           "/opt/php5.4/etc/php.ini",
           "/opt/php5.5/etc/php.ini",
           "/opt/php5.6/etc/php.ini",
           "/opt/php7.0/etc/php.ini",
           "/opt/php7.1/etc/php.ini",
       ]:
           owner  => "root",
           group  => "root",
           mode   => 0644,
           ensure => present,
           source => "puppet:///files/php_default.ini"
       }

Завантаження того ж файлу, але з різним вмістом для різних серверів

       file { "/etc/cron.d/backup":
           owner => "root",
           group => "root",
           mode  => 600,
           ensure => present,
           source => [
           "puppet:///files/backup-$fqdn",
           "puppet:///files/backup-$type",
           "puppet:///files/backup-default"
           ],
       }

В цьому випадку створюється файл /etc/cron.d/backup, а вміст його визначаєтся першим повним співпадінням зі списку, наведеному в source.

Завантаження директорії

file { '/tmp/dir1': # Тут вказуємо директорію як файл
source => "puppet:///files/dir1/", # директорія на шарі
recurse => true, # явно вказуємо, що по ній треба пройтися рекурсивно і все завантажити
}

Завантаження файлу залежно від ОС клієнта.

file { 'OSDepententFile':
  path => $operatingsystem ? {
    debian => '/tmp/config_debian',
    centos => '/tmp/config_centos',
    other => '/tmp/config_other',
  },
  source => $operatingsystem ? {
    debian => 'puppet:///files/tmp/for_debian',
    centos => 'puppet:///files/tmp/for_centos',
    other => 'puppet:///files/tmp/for_other',
  },
}

Тут в залежності від ОС вибираємо і конфіг, і куди його записати на клієнті.

Завантаження директорії залежно від ОС клієнта.

file { 'OSDepententDir':
  path => $operatingsystem ? {
    debian => '/tmp/config_debian_dir/',
    centos => '/tmp/config_centos_dir/',
    other => '/tmp/config_other_dir/',
  },
  source => $operatingsystem ? {
    debian => 'puppet:///files/tmp/for_debian_dir/',
    centos => 'puppet:///files/tmp/for_centos_dir/',
    other => 'puppet:///files/tmp/for_other_dir/',
  },
  recurse => true,
}

Установка пакету залежно від ОС клієнта.

# тут спочатку визначаємо назву пакета для певної ОС, а потім уже проводиться перевірка/встановлення
$OSDependentVim = $::operatingsystem ? {
centos => 'vim-enhanced',
debian => 'vim',
}
package { $OSDependentVim:
  ensure => latest,
}

Структуризація: використання класів та модулів.
Для уникнення багаторазового опису одних і тих же параметрів в багатьох місцях, а також нагромадження інформації, можна це реалізувати централізовано(та й рекомендується).
# Переходимо в директорію модулів, генеруємо модуль (ім’я модуля: user-modulename, натискаємо enter 8 разів), перейменовуємо за необхідності.

cd /etc/puppet/modules
puppet module generate user-filecreate
...
mv user-filecreate filecreate
# cat /etc/puppet/modules/filecreate/manifests/init.pp
class filecreate {
        file { '/tmp/ClassTestfile':
          source => $operatingsystem ? {
            debian => 'puppet:///files/tmp/for_debian',
            centos => 'puppet:///files/tmp/for_centos',
            other => 'puppet:///files/tmp/for_other',
          },
          owner => root,
          group => root,
          mode => 740,
        }

}
# cat /etc/puppet/modules/filecreate/manifests/class2.pp
class filecreate::class2 {
    file { "/tmp/file":
    ensure => file,
    owner => "root",
    group => "wheel",
    }
}
# cat /etc/puppet/manifests/site.pp
include filecreate
include filecreate::class2

Тобто, в одному модулі можна задати довільну кількість класів для подальшого використання. Ім’я таких файлів повинно збігатися з назвою підкласу(class2.pp), а оголошення має містити назву класу, де розташований(filecreate::class2)

Наслідування класів.
На основі попереднього прикладу унаслідуємо клас filecreate::class2, змінивши деякі його параметри

# cat /etc/puppet/modules/filecreate/manifests/class3.pp
class filecreate::class3 inherits filecreate::class2 {
   File['/tmp/file'] {
    group => 'bin',
    mode => 700,
    }
}
# cat /etc/puppet/manifests/site.pp
include filecreate::class3

В цьому випадку буде створено файл, проте група буде не root, а bin, і права будуть змінені.
При наслідуванні форма запису трохи змінюється.

file { "/tmp/file": ==> File['/tmp/file'] {
service { 'nginx': ==> Service['nginx'] {

Передача параметрів класам

# cat /etc/puppet/modules/filecreate/manifests/class4.pp
class filecreate::class4 ($content) {
    file { "/tmp/file":
    ensure => file,
    owner => 'root',
    content => $content,
    }
}
# cat /etc/puppet/manifests/site.pp
class { 'filecreate::class4': content => 'typical content22', }

Зверніть увагу, що при оголошенні класу в параметрах, що передаються, відсутній знак “$”.
Параметри можна визначати “за замовчуванням” при описуванні класу. Їх потім можна не передавати при оголошенні, при цьому буде значення “за замовчуванням”. Наприклад,

class filecreate::class4 ($content = 'qwe') {

Передача параметрів дочірнім класам
Не можна? Принаймні, я не знайшов способу

# head -1 /etc/puppet/modules/filecreate/manifests/class5.pp
class filecreate::class5 inherits filecreate::class2 ($content='4444') {
...
Error 400 on SERVER: Syntax error at '('; expected ')' at /etc/puppet/modules/filecreate/manifests/class5.pp:1
}

Якщо маєте його, прошу поділитися.

Ще немає коментарів.