Substituindo Parâmetros no Recurso de Marionetes Declarado Anteriormente

5

Estou tentando reconstruir o módulo de fantoches sssd do nwaller para ser totalmente baseado em LDAP e ser um pouco mais limpo. Nele temos um recurso definido para cada domínio de autenticação do formulário

define sssd::domain ( 
  $domain = $name,
  $domain_description = '',
  $domain_type,
  $ldap_uri = 'ldap://example.com',
  $ldap_search_base = 'dc=example,dc=com',
  $simple_allow_groups,
....
)

Essa definição é passada como concat::fragment , que preenche um modelo para criar o% finalsssd.conf.

Isso tudo funciona muito bem se eu definir o servidor LDAP em cada nó, como em:

nodes.pp

node "node1.systems.private" {
  include "puppet::client"
  class {
    'sssd':
      domains => [ 'LDAP' ],
      make_home_dir => true;
  }
  sssd::domain { 'LDAP':
    domain_type            => 'ldap',
    ldap_uri               => 'ldaps://ldap.site.com:636',
    ldap_search_base       => 'DC=site,DC=com',
    ldap_user_search_base  => 'OU=People,DC=site,DC=com',
    ldap_group_search_base => 'OU=Groups,DC=site,DC=com',
    ldap_default_bind_dn   => 'CN=bindaccount,OU=Service Accounts,OU=People,DC=site,DC=com',
    ldap_default_authtok   => 'soopersekretbindpw',
    simple_allow_groups    => ['SysAdmins','AppAdmins'],
  }
} 

O que eu prefiro fazer é uma configuração muito mais hierárquica. Mantenha a definição de sssd::domain o mais genérica possível, para que eu possa mantê-la como um módulo independente das configurações de nossa organização. Defina o servidor LDAP em uma configuração global e, em seguida, dentro de cada nó, defina quais grupos específicos precisam de acesso. Então, algo mais como:

módulos / org / manifests / default.pp

class org::default {
  include "puppet::client"
  class {
    'sssd':
      domains => [ 'LDAP' ],
      make_home_dir => true;
  }
  sssd::domain { 'LDAP':
    domain_type            => 'ldap',
    ldap_uri               => 'ldaps://ldap.site.com:636',
    ldap_search_base       => 'DC=site,DC=com',
    ldap_user_search_base  => 'OU=People,DC=site,DC=com',
    ldap_group_search_base => 'OU=Groups,DC=site,DC=com',
    ldap_default_bind_dn   => 'CN=bindaccount,OU=Service Accounts,OU=People,DC=site,DC=com',
    ldap_default_authtok   => 'soopersekretbindpw',
  }
} 

nodes.pp

node "node1.systems.private" {
  include "org::default"

  sssd::domain { 'LDAP':
    simple_allow_groups    => ['SysAdmins','AppAdmins'],
  }
}

Como esperado, isso resulta em um erro de declaração duplicado ao tentar aplicar a definição. Existe uma maneira de fazer isso, seletivamente substituir parâmetros, ou estou preso com a definição do domínio de autenticação dentro da definição original e, em seguida, substituindo os parâmetros de autorização dentro de cada nó?

    
por Scott Pack 27.11.2013 / 16:17

2 respostas

5

Eu usaria o Hiera: link

O Hiera permite que você desvincule seus dados variáveis dos manifestos do Puppet.

Hiera, como o nome indica, é hierárquico, permitindo algumas maneiras interessantes de substituir, assim como combinar dados variáveis.

Primeiro, modifique sua declaração sssd :: domain para executar pesquisas Hiera para os parâmetros:

sssd::domain { 'LDAP':
    domain_type            => 'ldap',
    ldap_uri               => hiera('ldap_uri', 'ldaps://ldap.site.com:636'),
    ldap_search_base       => hiera('ldap_search_base', 'DC=site,DC=com'),
    ldap_user_search_base  => hiera('ldap_user_search_base', 'OU=People,DC=site,DC=com'),
    ldap_group_search_base => hiera('ldap_group_search_base', 'OU=Groups,DC=site,DC=com'),
    ldap_default_bind_dn   => hiera('ldap_default_bind', 'CN=bindaccount,OU=ServiceAccounts,OU=People,DC=site,DC=com'),
    ldap_default_authtok   => hiera('ldap_default_authtok', 'soopersekretbindpw'),
    simple_allow_groups    => hiera_array('ldap_simple_allow_groups', ['SysAdmins','AppAdmins']),
}

No código acima, defini valores padrão para cada uma das pesquisas. Você poderia excluí-los, se preferir, colocando os padrões em seu arquivo de dados Hiera mais genérico (normalmente "common.yaml" ou "common.json"):

common.yaml:

---
ldap_uri: ldaps://ldap.site.com:636
ldap_search_base: DC=site,DC=com
ldap_simple_allow_groups:
 - SysAdmins
 - AppAdmins

Para os bits que você deseja personalizar por host, crie um arquivo YAML ou JSON com o nome do FQDN do host em questão e coloque os valores necessários nele.

node1.systems.private.yaml:

---
ldap_simple_allow_groups:
 - SomeOtherGroup

Neste exemplo, observe que ldap_simple_allow_groups está usando a função de consulta hiera_array . Isso concatenará TODOS os fundamentos válidos na hierarquia. Assim, node1 obterá os valores definidos em common.yaml, bem como o "SomeOtherGroup" definido em seu próprio arquivo YAML.

Leia a documentação dos tipos de pesquisa da Hiera para obter mais detalhes: link

    
por 27.11.2013 / 18:14
3

Embora Hiera seja a melhor maneira e seja aceita, eu gostaria de acrescentar: "Há uma sintaxe para fazer exatamente essa substituição que você tinha em mente:

node "node1.systems.private" {
  include "org::default"

  Sssd::Domain<| title == 'LDAP' |> {
    simple_allow_groups => ['SysAdmins','AppAdmins'],
  }
}

Observe que essa sintaxe também serve para coletar recursos virtuais , mas pode muito bem ser usada para substituir parâmetros de recursos.

Obviamente, esta técnica levará ao caos se usado consequentemente, então novamente - Hiera é superior na maioria dos casos.

    
por 13.06.2014 / 23:18