Marioneta: Obtener el directorio de inicio de los usuarios

12

Estoy creando un usuario de la siguiente manera

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

Ahora, como pueden ver, estoy haciendo un inicio de gestión es falso Ahora, más adelante en el camino, necesito insertar un archivo en el 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 obtener el directorio de inicio del usuario para esto?

Quintin Par
fuente

Respuestas:

11

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

Módulo facter: Esto registrará variables facter 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 mejor manera, pero me temo que no.

jfried
fuente
¿Me puede dar alguna orientación sobre dónde poner este manifiesto? Tengo mi clase básica en init.pp y ¿a dónde voy desde allí?
Quintin Par
1
@QuintinPar Acabo de empezar a subir algunos ejemplos de títeres o mejores prácticas a github. encontrará este ejemplo (clase facter) aquí: github.com/drandor/puppet-examples/tree/master/modules/user necesita tener activado pluginsync en su maestro y su agente. el segundo código se puede usar en cualquier parte de sus archivos * .pp. La configuración de títeres y los manifiestos de nodo (con etapas) se pueden encontrar aquí: github.com/drandor/puppet-config
jfried
1
Si el usuario aún no existe en la máquina (se agrega un nuevo usuario), el hecho de home_user no está disponible. La creación de nuevos usuarios puede necesitar dos ejecuciones de Puppet. En la primera ejecución, $ home_path está vacío, y esto puede conducir a resultados no deseados.
Mikko
3

Traté de encontrar una solución para el mismo problema, y ​​resultó que es 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 hacer 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 obtener el directorio de inicio $home['username'].

Hash de 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 teoría esto es posible, aunque la sintaxis se vuelve un poco críptica e hinchada:

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

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}
Mikko
fuente
2
Esto no funciona cuando / home no es el valor predeterminado. say / var / lib / psql
Quintin Par
@Barry: ¿Leyó el resto de la respuesta, "directorios de inicio específicos del usuario"? (La respuesta fue editada después del comentario de Quintin Par)
Mikko
@Mikko Yeap, e intenté votar la respuesta correcta (aceptada). Estaba bloqueado.
0

Esta pregunta es antigua, pero sigue siendo relevante. De hecho, hay una mejor manera ahora. Agregue un hecho personalizado a [module] /lib/facter/home_dirs.rb que contenga 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

Entonces puede acceder a los datos en el manifiesto de esta manera:

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

Tenga en cuenta que esto solo funciona si el usuario ya existe antes de la ejecución de la marioneta. Si el usuario se crea durante la ejecución, el directorio de inicio ya debe ser conocido o al menos predecible. Puppet está diseñado para crear orden, después de todo.

Espero que esto ayude a alguien.

C. Taylor
fuente