Puppet manifests. Part 2

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

Початок тут, відштовхуюся від нього.

 
 
Resource: NODE.
Тип ресурсу для керування індивідуальною конфігурацією сервера/групи серверів.

 
Індивідуальна конфігурація серверів/груп серверів

# cat /etc/puppet/manifests/site.pp
node default { # це спрацює лише з тими серверами, що не підпадають ні під які інші правила. Розташування блоку не має значення.
  include filecreate
}

node /^puppet[^\s]*$/ {  # визначення групи серверів через regexp'и (puppet*).
  include filecreate::class2
}

node /debian.*/, other { # кілька визначень серверів, можна застосовувати regexp'и(тут проста форма запису). Спрацює на всіх серверах debian*, та other (для нього лише повне співпадіння)
  class { filecreate::class4: content => 'new content' }
}

Зверніть увагу, що для нод можна застосовувати лише класи та модулі, і не можна напряму писати в них визначення кінцевих об’єктів.

 
 
Resources: PACKAGE and SERVICE.
Керування пакетами на сервері та його сервісами.

Створимо ще один модуль для роботи з пакетами:

# cd /etc/puppet/modules
# puppet module generate user-packages
...
# mv user-packages packages
# cat packages/manifests/nginx.pp
class packages::nginx {
  package { 'nginx':
    ensure => 'latest', # Встановити пакет nginx, якщо не встановлено, та переконатися, що він останньої версії
  }

  service { 'nginx':
    ensure => 'running', # перевіряємо, чи запущений, запускаємо
    enable => 'true', # додаємо в автозапуск
  }
}

# cat /etc/puppet/manifests/site.pp
node /debian.*/, /^puppet[^\s]*$/ {
  include packages::nginx
}
node default {
}

 
 
Resource: CRON.
Установка/керування крон-задачами.

# cat /etc/puppet/modules/packages/manifests/nginxcron.pp
class packages::nginxcron {
  cron { 'nginxcron':
    ensure => 'present', #завжди перевіряємо, чи є така задача
    command => 'echo date >> /tmp/cron', #сама крон-команда
    hour => '*/1', # просто знак "*" писати не можна, буде помилка. Множину можна задавати так hour => [ 4, 7, 10 ],
    minute => '*/2', # кожні 2 хвилини
  }
}
# cat /etc/puppet/manifests/site.pp
node /debian.*/ {
  include packages::nginxcron
}
node default {
}

Якщо не вказати системного користувача, якому присвоїти крон-задачу(user => ‘systemuser’), вона буде вписана руту.
УВАГА! Варто дуже уважно створювати такі задачі, можливі дублікати.
Взагалі, якщо описуєте крон якогось користувача, варто все робити або лиш руками, або ж лише через puppet, щоб цього уникнути.

З детальним списком атрибутів цього ресурсу можна ознайомитися тут.

 
 
Resource: USER.
 
Створення/модифікація користувача
Для роботи з паролями потрібен додатковий модуль на мастері. Встановимо його(якщо він в стандартному репозиторії – Puppet Forge)

# puppet module install puppetlabs-stdlib
Notice: Preparing to install into /etc/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└── puppetlabs-stdlib (v4.12.0)

Підключається автоматично, але при перевірці дає попередження (хоча працювати воно й буде).

# puppet module list
Warning: Missing dependency 'puppetlabs-stdlib':
  'user-filecreate' (v0.1.0) requires 'puppetlabs-stdlib' (>= 1.0.0)
  'user-packages' (v0.1.0) requires 'puppetlabs-stdlib' (>= 1.0.0)
  'user-user' (v0.1.0) requires 'puppetlabs-stdlib' (>= 1.0.0)
...

Для того, щоб позбавитися попереджень, треба змінити одну стрічку в metadata.json кожного модуля

sed -i -e 's|puppetlabs-stdlib|puppetlabs/stdlib|' */metadata.json

тобто, замінити дефіс на слеш в назві модуля.

 
Повернемося до суті.
Тут для деяких параметрів ми задаємо значення за замовчуванням, і тепер їх необов’язково передавати

# cat /etc/puppet/modules/user/manifests/create.pp
class user::create ($username, $fullname = undef, $password, $shell = '/bin/bash', $comment = undef, $grouplist) {
  user { $username:
    ensure => present,
    name => $username,
    password => pw_hash( $password, 'SHA-512', 'sith40fp' ),
    home => "/home/$username",
    groups => $grouplist,
    comment => $comment,
    shell => $shell,
    managehome => true, # без true для цього параметра коренева директорія користувача не буде створена, і це потрібно буде робити вручну.
  }
}
# cat /etc/puppet/manifests/site.pp
node /puppet.*/ {
  class { 'user::create':
    username => 'testuser',
    fullname => 'Full username',
    password => '%User17Pass29$x',
    shell => '/bin/sh',
    grouplist => [ 'adm', 'sshd' ],
  }
}
node default {
}

Функція пароля має вигляд pw_hash(‘password’, ‘SHA-512’, ‘salt’), детальніше можна прочитати в документації: тут. salt у мене наперед згенерований, але можна й передавати, модифікувавши клас.
Результати можна побачити на підпорядкованому сервері:

# puppet resource user testuser
user { 'testuser':
  ensure           => 'present',
  gid              => '1000',
  groups           => ['adm', 'sshd'],
  home             => '/home/testuser',
  password         => '$6$sith40fp$0bw9BymfJscQqPLG6WmBF4yx0Q8HFFuFuwqDMOp6.4vCKfDCdrjfBICbxRRkraE78t4s53o9yW3BrFgZ7Dl2l/',
  password_max_age => '99999',
  password_min_age => '0',
  shell            => '/bin/sh',
  uid              => '1000',
}

 
Видалення користувача.

# cat /etc/puppet/modules/user/manifests/delete.pp
class user::delete ($username) {
  user { $username:
    ensure => absent,
  }
  file { "/home/$username": #теж, директорія не буде видалена разом з користувачем, треба зачищати.
    ensure => absent,
    recurse => true,
    force => true,
  }
}
# cat /etc/puppet/manifests/site.pp
node /puppet.*/ {
  class { 'user::delete': username => 'testuser', }
}
node default {
}

 
 
Resource: SSH_AUTHORIZED_KEY

Керування ключами на підпорядкованих серверах.
 
Додаємо ключ.
Припустимо, ключ має вигляд.

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLXs5u6/nQjpuq4Bp63kSQUBa8yRafSU6NflPgEAiXEaOLqwrSx0EVxJ9aC+M3h183JZI1AZzzxiMP6SB+BvvzOC9Jz6vmn2b028azS8raELjYS0aOVzeacguLn5BporFJQ5GqhOA7zud5pPwRqSvBtSFpJQzN2g7ZAkspMBduWmEJTm08LJn7lQYnkQcEpo+qs02x8dKUNKT7/z6jUpAZ92dupKuvTRF56VENaiBU+Lomq1eLNVLph5Ih0RKKEPnxzHiLQUjujAAIshfk65C4HG+NyDq2xGU8IZXlyKnzFFw58OjL5HFbQwh4oKKKlslYCU6uIghty9Sg880d0Vuj

Тоді параметри будуть такими:

# cat /etc/puppet/manifests/site.pp
node /puppet.*/ {
class { 'user::sshauthkey':
    username => 'testuser',
    keytype => 'rsa',
    key => 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDLXs5u6/nQjpuq4Bp63kSQUBa8yRafSU6NflPgEAiXEaOLqwrSx0EVxJ9aC+M3h183JZI1AZzzxiMP6SB+BvvzOC9Jz6vmn2b028azS8raELjYS0aOVzeacguLn5BporFJQ5GqhOA7zud5pPwRqSvBtSFpJQzN2g7ZAkspMBduWmEJTm08LJn7lQYnkQcEpo+qs02x8dKUNKT7/z6jUpAZ92dupKuvTRF56VENaiBU+Lomq1eLNVLph5Ih0RKKEPnxzHiLQUjujAAIshfk65C4HG+NyDq2xGU8IZXlyKnzFFw58OjL5HFbQwh4oKKKlslYCU6uIghty9Sg880d0Vuj',
  }
}
node default {
}
# cat /etc/puppet/modules/user/manifests/sshauthkey.pp
class user::sshauthkey ($username, $keytype, $key) {
  ssh_authorized_key { 'sshauthkey':
    user => $username,
    type => $keytype,
    key => $key,
  }
}
Ще немає коментарів.