AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 557819
Accepted
Scott Pack
Scott Pack
Asked: 2013-11-28 07:17:07 +0800 CST2013-11-28 07:17:07 +0800 CST 2013-11-28 07:17:07 +0800 CST

覆盖先前声明的 Puppet 资源中的参数

  • 772

我正在尝试重建 nwaller 的sssd puppet 模块,使其完全基于 LDAP 并且更简洁。在其中,我们为表单的每个身份验证域定义了一个资源

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

然后,此定义作为 a 传递,concat::fragment它填写了用于构建 final 的模板sssd.conf。

如果我在每个节点中定义 LDAP 服务器,这一切都很好,如下所示:

节点.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'],
  }
} 

我宁愿做的是一个更有层次的设置。使sssd::domain定义尽可能通用,这样我就可以将其作为一个独立于我们的组织配置的模块来维护。在全局配置中定义 LDAP 服务器,然后在每个节点中定义需要访问的特定组。所以更像是:

模块/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',
  }
} 

节点.pp

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

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

正如预期的那样,这会在尝试应用定义时导致重复声明错误。有没有办法做到这一点,选择性地覆盖参数,还是我坚持在原始定义中定义身份验证域,然后在每个节点中覆盖授权参数?

authentication
  • 2 2 个回答
  • 3773 Views

2 个回答

  • Voted
  1. Best Answer
    Scott Merrill
    2013-11-28T09:14:12+08:002013-11-28T09:14:12+08:00

    我会使用Hiera。

    Hiera 允许您将变量数据与 Puppet 清单分离。

    顾名思义,Hiera 是分层的,允许一些有趣的方式来覆盖和组合可变数据。

    首先,修改您的 sssd:: 域声明以对参数执行 Hiera 查找:

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

    在上面的代码中,我为每个查找定义了默认值。如果愿意,您可以通过在最通用的 Hiera 数据文件(通常是“common.yaml”或“c​​ommon.json”)中保留默认值来排除这些:

    common.yaml:

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

    对于您要基于每个主机进行个性化的位,您将创建一个以相关主机的 FQDN 命名的 YAML 或 JSON 文件,并将必要的值放入其中。

    node1.systems.private.yaml:

    ---
    ldap_simple_allow_groups:
     - SomeOtherGroup
    

    在此示例中,请注意ldap_simple_allow_groups使用hiera_array查找功能。这将连接层次结构中的所有有效发现。因此,node1 将获取 common.yaml 中定义的值以及其自己的 YAML 文件中定义的“SomeOtherGroup”。

    阅读Hiera 查找类型文档以了解更多详细信息。

    • 5
  2. Felix Frank
    2014-06-14T13:18:53+08:002014-06-14T13:18:53+08:00

    虽然 Hiera 是最好的方法并且被适当地接受,但为了完整起见,我想补充一下:有一种语法可以完成您想到的这种覆盖:

    node "node1.systems.private" {
      include "org::default"
    
      Sssd::Domain<| title == 'LDAP' |> {
        simple_allow_groups => ['SysAdmins','AppAdmins'],
      }
    }
    

    请注意,此语法也用于收集虚拟资源,但很可能用于覆盖资源参数。

    显然,如果因此使用这种技术会导致混乱,所以再一次 - 在大多数情况下,Hiera 是优越的。

    • 3

相关问题

  • 如何在使用 RPC over HTTPS 时停止 Outlook 2007 要求提供凭据

  • 针对 Leopard 服务器的 OS X 登录身份验证

  • 允许用户更改其 Active Directory 密码的 Web 界面

  • MOSS 2007 无法使用 ActiveDirectoryMembershipProvider 配置表单身份验证

  • 通过 VPN 更改 Active Directory 密码

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve