Existem algumas maneiras de lidar com isso, você pode simplesmente usar sua verificação ternária diretamente na declaração do usuário da seguinte forma:
user { $user:
ensure => $ensure,
managehome => $ensure ? { present => true, default => false, },
uid => $uid,
gid => $gid,
password => $password,
groups => $groups,
comment => $comment,
shell => $shell,
}
Isto está assumindo que você está parametrizando seus valores aqui, e eu estou supondo que não é necessariamente o caso. Você ainda teria o problema de ter que atualizar todas as referências de seu tipo, o que pode ser um pouco doloroso. Em vez disso, você poderia usar algo muito mais poderoso, a função create_resources . Considere o seguinte trecho de um arquivo de bonecos:
class profile::base {
$user_params = {
'user1' => { ensure => absent,
managehome => false,
uid => '1337',
gid => dev,
},
'user2' => { uid => '1338',
gid => ops,
groups => ['wheel', 'company'],
},
}
$user_defaults = {
ensure => present,
managehome => true,
groups => ['users', 'company'],
comment => 'Managed by puppet',
shell => '/bin/bash',
}
create_resources(user, $user_params, $user_defaults)
...
}
Então, o que acaba acontecendo aqui é que a função create_resources usa o hash $ user_params e cria dinamicamente um recurso para cada entrada usando os parâmetros fornecidos. Além disso, quaisquer parâmetros não fornecidos por $ user_params usam valores do hash $ user_defaults . O código acima avalia efetivamente o seguinte trecho. (Se você não estiver familiarizado com a função create_resources, é altamente recomendável ler sobre isso aqui )
class profile::base {
user { 'user1':
ensure => absent,
managehome => false,
uid => 1337,
gid => dev,
groups => ['users', 'company'],
comment => 'Managed by puppet',
shell => '/bin/bash',
}
user { 'user2':
ensure => present,
managehome => true,
uid => 1338,
gid => ops,
groups => ['wheel', 'company'],
comment => 'Managed by puppet',
shell => '/bin/bash',
}
...
}
Isso permite adicionar / alterar rapidamente atributos em todos os usuários que você deseja gerenciar sem precisar encontrar todas as referências. Digamos que se você quiser mudar para o uso do ksh para sua empresa, basta alterar o valor no hash user_defaults para refletir isso. Também não há nada que o impeça de ter diferentes grupos de parâmetros e padrões (digamos $ root_params e $ root_defaults para seus superusuários) e ter outra chamada de função create_resources.
Levando essa ideia um passo adiante, você pode emparelhar esse conceito com dados de Hiera . A solução ficaria assim:
class profile::base {
$user_params = hiera("user-params")
$user_defaults = hiera("user-defaults")
create_resources(user, $user_params, $user_defaults)
...
}
Muito mais limpo e mais fácil de ler. O arquivo json correspondente hieradata ficaria assim:
{
"user-params": {
"user1": {
"ensure": "absent",
"managehome": "false",
"uid": "1337",
"gid": "dev"
},
"user2": {
"uid": "1338",
"gid": "ops",
"groups": ["wheel", "company"]
}
},
"user_defaults": {
"ensure": "present",
"managehome": "true",
"groups": ["users", "company"],
"comment": "Managed by puppet",
"shell": "/bin/bash"
}
}
Eu pessoalmente prefiro o JSON para meus hieradados, mas o YAML também é uma opção viável ( Fontes de dados do Hiera ) O bom sobre Hiera é que você pode usar diferentes fontes de dados com base em qualquer critério que você decidir e configurar no arquivo hiera.yaml (normalmente feito por ambiente, mas poderia ser por nó)
Como um pensamento final, você pode querer considerar escrever um tipo personalizado para envolver o tipo de usuário que:
- Arquivar o diretório pessoal de um usuário se garantir = > ausente
- Pesquise e restaure um diretório arquivado, se garantir = > presente
- Utilize o tipo de usuário interno normalmente com managehome = > verdadeiro
Se você decidir seguir esse caminho, você ainda ganharia muitos benefícios usando a função create_resources e Hiera