Puppet: Obtenha o diretório inicial dos usuários

Puppet: Obtenha o diretório inicial dos usuários

Estou criando umdo utilizadorcomo se segue

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

Agora, como você pode ver, estou fazendoum managerhome é falso Agora, mais tarde, preciso enviar um arquivo para o diretório inicial do usuário.

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

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

Como posso obter odiretório inicial do usuáriopor esta?

Responder1

Hm, acho que você precisará de um módulo facter para fazer isso e de um pequeno arquivo de manifesto hacky ...

Módulo facter: Isso registrará variáveis ​​facter para todos os usuários. como "home_root" ou "home_apache".

require 'etc'

Etc.passwd { |user|

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

}

e então você pode usá-los dentro do seu arquivo de manifesto assim:

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

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

Talvez haja uma maneira melhor, mas infelizmente não.

Responder2

Tentei encontrar uma solução exatamente para o mesmo problema e descobri que é melhor adotar uma abordagem um pouco diferente.

Defina o diretório inicial explicitamente, por exemplo:

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

Quando managehomeé falso, o diretório inicial nem mesmo é criado. Então você tem que defini-lo especificamente. Geralmente é melhor criar uma definição personalizada para todo o usuário:

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

Você pode adicionar mais parâmetros, por exemplo $keyvalue, e criar um arquivo-chave se esse parâmetro for fornecido.

Você também pode definir uma variável global $home = "/home"(específica do sistema operacional, se necessário) e obter o diretório inicial com "${home}/${username}".

Editar: usando hash para definir diretórios iniciais específicos do usuário

Versões mais recentes do Puppet (>= 2.6) suportam hashes. Seria possível definir um hash contendo username => /path/to/homemapeamentos para cada usuário:

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

Para qualquer nome de usuário, é fácil obter o diretório inicial com $home['username'].

Hash do diretório inicial com substituto

Na maioria das vezes, seria melhor ter um "padrão substituto" se o usuário não existir no hash.Em teoriaisso é possível, embora a sintaxe se torne um pouco enigmática e inchada:

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

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

Responder3

Esta questão é antiga, mas ainda relevante. Na verdade, existe uma maneira melhor agora. Adicione um fato personalizado a[módulo]/lib/facter/home_dirs.rbcontendo o seguinte:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

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

    home_dirs

  end
end

Então você pode acessar os dados no manifesto desta forma:

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

Lembre-se de que isso só funciona se o usuário já existir antes da execução da marionete. Se o usuário estiver sendo criado durante a execução, o diretório inicial já deverá ser conhecido ou pelo menos previsível. Afinal, o Puppet foi projetado para criar ordem.

Espero que isso ajude alguém.

Responder4

Quando ocontasO módulo está disponível e todas as contas são criadas via hiera, então o bloco abaixo cria um arquivo no diretório inicial de cada usuário, assumindo que você não se importa com contas de usuário do sistema além de root.

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],
  }
}

O $user_home_dirdeve estar correto para todos os usuários que estão

  1. gerenciado com accounts,
  2. estão garantidos para serempresent
  3. homepara diretórios não padrão .

informação relacionada