Назад | Перейти на главную страницу

Как настроить марионетку для добавления пользователя в группу sudoers, если она различается в разных системах (или как работают переменные?)

Я начинаю настраивать системы с помощью Puppet, и у меня возникают проблемы с настройкой моей учетной записи.

На нашем сервере CentOS 5.3 группа sudoers - «wheel», gid 10. На нашем сервере Ubuntu 9.10 группа - «sudo», gid 27. Как мне настроить учетную запись группы, чтобы оба поля получали нужную группу, а мои пользователь добавлен в нужную группу?

Я пробовал разделить эту конфигурацию на os_vars.pp, virt_groups.pp и virt_users.pp.

os_vars.pp:

class os_vars {
  case $operatingsystem {
    centos: {
      $os_admin_group = "wheel"
      $os_admin_group_gid = "10"
    }
    ubuntu: {
      $os_admin_group = "sudo"
      $os_admin_group_gid = "27"
    }
  }
  notice("in os_vars, admin group is: ${os_admin_group}, ${os_admin_group_gid}")
}

virt_groups.pp:

class virt_groups {
  include os_vars
  notice("in virt_groups, admin group is: ${os_admin_group}, ${os_admin_group_gid}")
  @group { $os_admin_group:
    gid => $os_admin_group_gid,
    ensure => present,
  }
}

virt_users.pp:

class virt_users {
  include os_vars
  notice("in virt_users, admin group is: ${os_admin_group}, ${os_admin_group_gid}")
  @user { 'my_user':
    home => '/home/my_user',
    uid => '500',
    groups => [$os_admin_group],
    password => $1BigLongEncrypedStuff
    gid => '500',
    ensure => 'present',
    shell => '/bin/bash'
  }
}

В os_vars.pp переменные заданы правильно, но в virt_users.pp и virt_groups.pp они пусты.

Переменные необходимо указать и указать в кавычках. Правильный синтаксис virt_groups.pp:

class virt_groups {
  include os_vars
  notice("in virt_groups, admin group is: ${os_vars::os_admin_group}, ${os_vars::os_admin_group_gid}")
  @group { "${os_vars::os_admin_group}:
    gid => "${os_vars::os_admin_group_gid}",
    ensure => present,
  }
}

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

Как и в предыдущем ответе, переменные должны быть ограничены. Не беспокойтесь о идентификаторе группы: s или виртуальном sudo/wheel группы. Если группа администраторов уже присутствует в системе, вам не нужно ее определять.

Используя ? селектор вместо case делает код менее подробным:

class os_vars {
  $admin_group = $::operatingsystem ? {
     'centos' => 'wheel',
     default  => 'sudo',
  }
  notice("in os_vars, admin group is: ${admin_group}")
}

class virt_users {
  include os_vars
  notice("in virt_groups, admin group is: ${os_vars::admin_group}")
  @user { 'my_user':
    ....
    groups => [$os_vars::admin_group],
  }
}

Если группа не существует, и вам нужно создать ее с помощью Puppet, лучше не использовать GID, чтобы избежать конфликтов. system Параметр присваивает группе идентификатор из системной области:

include os_vars
group {$os_vars::admin_group:
  ensure => present,
  system => true,
}