Existe uma maneira de fazer com que o puppet crie a pasta pessoal do usuário (managehome), mas não excluir quando a garantia estiver 'ausente'?

2

Meu primeiro pensamento foi fazer algo assim:

define my_user( $name = $title, $ensure = present, $uid, $gid, $password, $groups, $comment, $shell ) {
    $managehome = $ensure ? {
        present => true,
        default => false,
    }
    user { $name:
        ensure     => $ensure,
        managehome => $managehome,
        uid        => $uid,
        gid        => $gid,
        password   => $password,
        groups     => $groups,
        comment    => $comment,
        shell      => $shell,
     }
}

Alguns problemas com isso:

  • Se eu quisesse usar outro atributo user type, precisaria alterar my_user em dois lugares.
  • Eu precisaria alterar todas as declarações user para usar my_user .
  • Eu preferiria usar um tipo interno, em seguida, um tipo definido.

Talvez haja:

  • Uma maneira de capturar todos os parâmetros para um tipo definido e passá-los como atributos para um tipo interno.
  • Uma maneira ainda mais elegante de fazer isso sem usar tipos definidos.

Alguém tem alguma recomendação?

    
por Belmin Fernandez 02.10.2014 / 15:01

2 respostas

5

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

    
por 02.10.2014 / 22:31
0

Existe uma abordagem menos que elegante para parâmetros opcionais neste cenário.

my_user($ensure = 'present', $uid = undef) {
    if $uid != undef { User { uid => $uid } }
    user { $name: ensure => $ensure }
}

Você acabou de atribuir padrões de recursos para user no escopo da definição. Você pode repetir esse padrão para um número arbitrário de parâmetros.

    
por 02.10.2014 / 21:33