Puppet: Obtener el directorio de inicio de los usuarios

Puppet: Obtener el directorio de inicio de los usuarios

estoy creando unusuariode la siguiente manera

user { $username:
    comment => "$name",
    shell   => "$shell",
    managehome => false,
    password  => "$password",
    groups => $groups
}

Ahora como puedes ver lo estoy haciendoun administrador de casa es falso Ahora, más adelante necesito enviar un archivo al directorio de inicio del usuario.

$key = "${homedir}/${name}/file"

    file { $key:
    ensure => present,
    owner  => $username,
    group  => $username,
    mode   => 600,
    content => "$keyvalue",
    subscribe => User[$username],
}

¿Cómo puedo conseguir eldirectorio de inicio del usuario¿para esto?

Respuesta1

Hm, creo que necesitarás un módulo facter para hacer eso y un pequeño archivo de manifiesto hacky...

Módulo factor: esto registrará variables factoriales para todos los usuarios. como "home_root" o "home_apache".

require 'etc'

Etc.passwd { |user|

   Facter.add("home_#{user.name}") do
      setcode do
         user.dir
      end
   end

}

y luego puedes usarlos dentro de tu archivo de manifiesto de esta manera:

$username = "root"
$home = "home_$username"
$home_path = inline_template("<%= scope.lookupvar('::$home') %>")

file { "$home_path/test.txt":
   content => "huhu",
}

Quizás haya una manera mejor, pero me temo que no.

Respuesta2

Intenté encontrar una solución para exactamente el mismo problema y resultó que era mejor adoptar un enfoque ligeramente diferente.

Defina el directorio de inicio explícitamente, por ejemplo:

user { $username:
    comment    => "comment",
    home       => "/home/${username}",
    managehome => false,
    # ...
}

Cuando managehomees falso, el directorio de inicio ni siquiera se crea. Entonces tienes que definirlo específicamente. A menudo es mejor crear una definición personalizada para todo el usuario:

define custom_user($username, $password) {
    user { $username:
        home     => "/home/${username}",
        password => $password,
        # etc.
    }
    file { "/home/${username}":
        ensure  => directory,
        owner   => $username,
        require => User[$username],
        # etc.
    }
}

Puede agregar más parámetros, por ejemplo $keyvalue, y crear un archivo de claves si se proporciona ese parámetro.

También puede definir una variable global $home = "/home"(específica del sistema operativo, si es necesario) y obtener el directorio de inicio con "${home}/${username}".

Editar: uso de hash para definir directorios de inicio específicos del usuario

Las versiones más recientes de Puppet (>= 2.6) admiten hashes. Sería posible definir un hash que contenga username => /path/to/homeasignaciones para cada usuario:

$home = {
    normal_user => '/home/normal_user',
    backup      => '/var/backup',
    mysql       => '/var/lib/mysql'
}

Para cualquier nombre de usuario, es fácil acceder al directorio de inicio con $home['username'].

Hash del directorio de inicio con respaldo

La mayoría de las veces, sería mejor tener un "valor predeterminado de reserva" si el usuario no existe en el hash.En teoriaEsto es posible, aunque la sintaxis se vuelve un poco críptica y abultada:

$home = { ... }
$default_home = '/home'

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}

Respuesta3

Esta pregunta es antigua, pero sigue siendo relevante. De hecho, ahora existe una manera mejor. Agregar un dato personalizado a[módulo]/lib/facter/home_dirs.rbque contiene lo siguiente:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

    home_dirs = {}   
    Etc.passwd { |user|
      home_dirs[user.name] = user.dir
    }

    home_dirs

  end
end

Luego puede acceder a los datos en el manifiesto de la siguiente manera:

$facts['home_dirs']['some_username']

Tenga en cuenta que esto sólo funciona si el usuario ya existe antes de la ejecución del títere. Si el usuario se crea durante la ejecución, el directorio de inicio ya debería ser conocido o al menos predecible. Después de todo, Puppet está diseñado para crear orden.

Espero que esto ayude a alguien.

Respuesta4

Cuando elcuentasEl módulo está disponible y todas las cuentas se crean a través de hiera, luego el bloque debajo crea un archivo en el directorio de inicio de cada usuario, asumiendo que no le importan las cuentas de usuario del sistema además de la raíz.

require accounts::user::defaults

# filter out accounts with ensure=absent or managehome=false 
$managed_accounts = $accounts::user_list.filter |$name, $account| {
  (!has_key($account, 'managedhome') or $account['managedhome']) and (!has_key($account, 'ensure') or $account['ensure']!='absent')
}

# Add a file to each users
$managed_accounts.each |$name, $account| {
  $user_home_dir = has_key($account, 'home') ? {
    true    => $account['home'],
    default => $name ? {
      'root'  => $accounts::user::defaults::root_home,
      default => $accounts::user::defaults::home_template.sprintf($name),
    },
  }

  # Push a file to the user’s home directory.
  file { "${user_home_dir}/.helloworld":
    ensure  => file,
    owner   => $name,
    content => "Hi ${name}",
    require => User[$name],
  }
}

Debe $user_home_dirser correcto para todos los usuarios que están

  1. manejado con accounts,
  2. están garantizados para serpresent
  3. homepara directorios no estándar .

información relacionada