Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
user { 'bob': ensure => present }
user { 'bob': ensure => absent }
Плюс синтаксис манифестов. Это отдельный разговор. Вермишель из непойми чего. Тут нужны кавычки, там нет. Тут нужна запятая, а там не нужна. Хуже perl. Каждый пишет манифесты как хочет, в итоге читать очень тяжело.
if ( ! defined(User['webUser']) ) { user { 'webUser': ensure => present } }
Я в вашем примере одного не понял: зачем вводить виртуальные ресурсы?
И делать include каждого такого класса-пользователя. Эффект будет точно таким же.
class myUser {
user { 'user1' : ensure => present }
}
class myUser2 {
user { 'user2' : ensure => present }
}
class myUser3 {
user { 'user3' : ensure => present }
}
class myUser4 {
user { 'user4' : ensure => present }
}
node 'supernode.example.com' {
include myUser4
include myUser2
class virtual::users {
@user { 'user1' : ensure => present }
@user { 'user2' : ensure => present }
@user { 'user3' : ensure => present }
@user { 'user4' : ensure => present }
}
node 'supernode.example.com' {
include virtual::users
#Подключаем только определенных пользователей
realize User['user2'], User['user4']
#Вместо 5 include-ов можем сделать так
User <| |>
один пользователь = 1 класс
class virtual::users {
@user { 'bob' : ensure => present }
@user { 'john' : ensure => present }
}
class someAction {
file { '/home/bob/.bashrc' :
ensure => present,
require => User['bob']
}
}
class anotherAction {
file { '/home/john/.bashrc' :
ensure => present,
require => User['john']
}
}
node 'testnode.example.com' {
include virtual::users
include someAction, anotherAction
realize User['john'], User['bob']
}
Invalid relationship… because User['john'] doesn't seem to be in the catalog.
define create_users ($users) {
$users.each |$user| {
include "users::$user"
}
}
class users {
User { ensure => present }
}
class users::user1 inherits users {
user{'user1':}
}
class users::user2 inherits users {
user{'user2':} ->
file{'/mnt/user2':
ensure => 'directory',
owner => 'user2',
}
}
class apache {
create_users{"$name":
users => [ 'user1', 'user2' ],
}
}
class other_service {
create_users{"$name":
users => [ 'user1' ],
}
}
node 'testnode.example.com' {
include apache
include other_service
}
class apache {
@user { ['user1', 'user2']: }
}
class other_service {
@user { 'user2': }
}
define custom_file {
file{"/mnt/${title}":
ensure => 'directory',
owner => $title,
require => User[$title],
}
}
class role {
}
class role::web_server {
include apache
include other_service
custom_file { 'user2': }
realize User['user1'], User['user2']
}
node 'testnode.example.com' {
include role::web_server
}
define custom_file {
file{"/mnt/${title}":
ensure => 'directory',
owner => $title,
require => User[$title],
}
}
class profile {
}
class profile::web_server {
user { ['user1', 'user2']: }
custom_file { 'user2': }
}
node 'testnode.example.com' {
include profile::web_server
}
1) define успешно принимает массив, each не нужен
5) Такое ощущение, что классы писал кто-то, впервые увидевший puppet и использующий одинаковые имена пользователей в разных классах (точнее в том, что при правильном дизайне должно быть разными модулями).
define create_users ($users=$title) {
$users.each |$user| {
include "users::$user"
}
}
class users {
User { ensure => present }
}
class users::user1 inherits users {
user{'user1':}
}
class users::user2 inherits users {
user{'user2':} ->
file{'/mnt/user2':
ensure => 'directory',
owner => 'user2',
}
}
class apache {
create_users{[ 'user1', 'user2' ]: }
}
class other_service {
create_users{[ 'user1' ]: }
}
include apache
include other_service
puppet apply test.pp
Error: Evaluation Error: Error while evaluating a Resource Statement, Duplicate declaration: Create_users[user1] is already declared in file /root/test.pp:23; cannot redeclare at /root/test.pp:26 at /root/test.pp:26:3 on node mynode
Error: Evaluation Error: Error while evaluating a Resource Statement, Duplicate declaration: Create_users[user1] is already declared in file /root/test.pp:23; cannot redeclare at /root/test.pp:26 at /root/test.pp:26:3 on node mynode
вполне бывает так что разным сервисам требуются одинаковые пользователи
Виртуальные ресурсы в Puppet