microsoft.ad.ldap 清单 – Active Directory 清单插件

注意

此清单插件是 microsoft.ad 集合 (版本 1.7.1) 的一部分。

如果您使用的是 ansible 包,则可能已经安装了此集合。它不包含在 ansible-core 中。要检查是否已安装,请运行 ansible-galaxy collection list

要安装它,请使用: ansible-galaxy collection install microsoft.ad。您需要其他需求才能使用此清单插件,有关详细信息,请参阅 需求

要在 playbook 中使用它,请指定: microsoft.ad.ldap

microsoft.ad 1.1.0 中的新增功能

概要

  • 用于 Active Directory 或其他 LDAP 源的清单插件。

  • 使用以 microsoft.ad.ldap.{yml|yaml} 结尾的 YAML 配置文件。

  • 添加的每个主机都将 inventory_hostname 设置为 LDAP 计算机对象的 name,并将 ansible_host 设置为 dNSHostName LDAP 属性的值(如果已设置)。如果计算机对象上未设置 dNSHostName 属性,则 ansible_host 不会被设置。有关如何设置这些值以及如何调整这些值,请参阅 LDAP 清单主机名

  • 主机事实 microsoft_ad_distinguished_name 也将设置为用于派生主机条目的主机的可分辨名称。

  • 任何其他需要的 fact 都需要在 *attributes* 选项中定义。

需求

以下需求是在执行此清单的本地控制器节点上所需的。

  • dnspython - 用于服务器查找支持

  • pyspnego >= 0.8.0

  • pyspnego[kerberos] - 用于 Kerberos 和服务器查找支持

  • sansldap

  • dpapi-ng - 用于 LAPS 解密支持

参数

参数

注释

attributes

字典

要检索的 LDAP 属性。

指定的键是要请求的 LDAP 属性,每个属性的值都是一个字典,它反映了要将其设置为主机变量以及如何设置。

内部字典值的每个键都是要设置的主机变量名,其值是要用来派生值的模板。如果没有显式设置值,它将使用从 LDAP 属性返回的强制值。

在 LDAP 模式中被表示为单值属性的属性将作为单个值返回,多值属性将作为值列表返回。

有关更多信息,请参阅 LDAP 清单属性

默认值: {}

auth_protocol

字符串

连接到 LDAP 主机时要使用的身份验证协议。

如果使用 LDAPS/StartTLS 并已指定 *certificate*,则默认为 certificate。否则,默认为 negotiate

simple 是简单身份验证,其中用户名和密码以明文形式发送。它不支持任何加密,因此必须与 LDAPS 或 StartTLS 一起使用。如果在没有 TLS 的明文 LDAP 连接上使用,则必须指定 encrypt=False 以显式选择不加密。

certificate 是 TLS 客户端证书身份验证。它只能与 LDAPS 或 StartTLS 一起使用。有关如何指定用于身份验证的客户端证书的更多信息,请参阅 *certificate*。

negotiate 将尝试协商 Kerberos 身份验证,并回退到 NTLM。如果可以使用 Kerberos,则如果未指定用户名或密码,则可以使用 Kerberos 凭据缓存。

kerberos 将使用 Kerberos 身份验证,不回退到 NTLM。

ntlm 将使用 NTLM 身份验证,不尝试 Kerberos。

negotiatekerberosntlm 支持通过 LDAP 进行加密。

Kerberos 支持需要安装 pyspnego[kerberos] 附加组件。

有关更多信息,请参阅 LDAP 身份验证

可以使用 Jinja2 模板值设置此选项。

选项

  • "simple"

  • "certificate"

  • "negotiate"

  • "kerberos"

  • "ntlm"

配置

ca_cert

字符串

可以是 CA 证书 PEM 或 DER 文件的路径、PEM 证书目录或用于证书验证的 CA 证书 PEM 字符串。

如果省略,用于验证的默认 CA 存储取决于当前的 Python 设置。

可以使用 Jinja2 模板值设置此选项。

配置

cert_validation

字符串

使用 TLS 连接时的证书验证行为。

可以设置为 alwaysignoreignore_hostname

always 将执行证书主机名和 CA 验证。

ignore 将忽略任何证书错误。

ignore_hostname 将验证 CA 信任链,但会忽略 TLS 执行的任何主机名检查。

详情请参阅 证书验证

可以使用 Jinja2 模板值设置此选项。

选项

  • "always" ← (默认)

  • "ignore"

  • "ignore_hostname"

配置

certificate

字符串

用于证书身份验证的证书或包含密钥的证书捆绑包。

该值可以是包含证书的文件的路径,也可以是 PEM 编码证书的字符串。

如果使用证书文件的路径,则该文件可以是 PEM 编码证书、PEM 编码证书和密钥捆绑包、DER 编码证书或 PFX/PKCS12 编码证书和密钥捆绑包。

如果指定的证书不包含密钥,请使用 *certificate_key*。

如果密钥使用密码加密,请使用 *certificate_password*。

可以使用 Jinja2 模板值设置此选项。

配置

certificate_key

字符串

用于证书身份验证的证书密钥。

该值可以是包含以 PEM 或 DER 编码形式的密钥的文件的路径,也可以是 PEM 编码密钥的字符串。

如果密钥使用密码加密,请使用 *certificate_password*。

可以使用 Jinja2 模板值设置此选项。

配置

certificate_password

字符串

用于解密 *certificate* 或 *certificate_key* 指定的证书密钥的密码。

可以使用 Jinja2 模板值设置此选项。

配置

compose

字典

从 jinja2 表达式创建变量。

默认值: {}

connection_timeout

整数

建立连接之前等待的超时时间(秒),超时后将失败。

可以使用 Jinja2 模板值设置此选项。

默认值: 5

配置

encrypt

布尔值

连接是否需要加密。

加密可以使用身份验证协议或通过 TLS 执行。

*auth_protocol* negotiatekerberosntlm 都支持通过 LDAP 进行加密,而 simple 不支持。

如果在没有 TLS 的情况下通过 LDAP 使用 auth_protocol=simple,则必须将其设置为 False。由于不使用加密,所有流量都将以明文形式传输,应避免这种情况。

可以使用 Jinja2 模板值设置此选项。

选项

  • false

  • true ← (默认)

配置

filter

字符串

用于查询计算机对象的 LDAP 筛选器字符串。

默认情况下,这将与筛选器“(objectCategory=computer)”组合使用。使用 *filter_without_computer* 可覆盖此行为,并使 *filter* 成为唯一使用的筛选器。

filter_without_computer

布尔值

在 microsoft.ad 1.3.0 中添加

不会将 *filter* 值与默认筛选器“(objectCategory=computer)”组合。

在大多数情况下,这应为 false,但可以设置为 true 以使指定的 *filter* 值成为唯一使用的筛选器。

选项

  • false ← (默认)

  • true

groups

字典

根据 Jinja2 条件将主机添加到组。

默认值: {}

keyed_groups

列表 / 元素=字典

根据变量的值将主机添加到组。

默认值: []

default_value

字符串

在 ansible-core 2.12 中添加

主机变量的值为空字符串时的默认值。

此选项与 keyed_groups[].trailing_separator 互斥。

key

字符串

用于生成组的输入字典中的键

parent_group

字符串

键控组的父组

prefix

字符串

键控组名将以此前缀开头

默认值: ""

separator

字符串

用于构建键控组名的分隔符

默认值: "_"

trailing_separator

布尔值

在 ansible-core 2.12 中添加

将此选项设置为 False 以在值为空字符串时省略主机变量后的 keyed_groups[].separator

此选项与 keyed_groups[].default_value 互斥。

选项

  • false

  • true ← (默认)

leading_separator

布尔值

在 ansible-core 2.11 中添加

与 keyed_groups 结合使用。

默认情况下,没有提供前缀或分隔符的键控组的名称将以下划线开头。

这是因为默认前缀为“”而默认分隔符为“_”。

如果未给出前缀,则将此选项设置为 False 以省略开头的下划线(或其他分隔符)。

如果组名来自映射,则分隔符仍用于连接项目。

为了根本不使用组名中的分隔符,请将键控组的分隔符设置为空字符串。

选项

  • false

  • true ← (默认)

password

字符串

用于身份验证的密码。

如果 *auth_protocol* 为 simple 且未指定密码,则绑定将作为未经身份验证的绑定执行。

如果 *auth_protocol* 为 negotiatekerberosntlm 且未指定密码,它将尝试使用 *username* 指定的本地缓存凭据(如果可用)。

可以使用 Jinja2 模板值设置此选项。

配置

port

整数

用于连接的 LDAP 端口。

端口 389 用于 LDAP,端口 686 用于 LDAPS。

如果 tls_mode=ldaps,则默认为端口 636,否则为 389

可以使用 Jinja2 模板值设置此选项。

配置

search_base

字符串

用于查找计算机对象的 LDAP 搜索基。

如果没有指定,则默认为 Active Directory 服务器的 defaultNamingContext

如果搜索较大的 Active Directory 数据库,建议缩小搜索基以加快查询速度。

search_scope

字符串

要执行的 LDAP 搜索范围。

base 将仅搜索 *search_base* 指定的当前路径或对象。这通常不适用于清单插件。

one_level 将仅搜索 *search_base* 中的直接子对象。

subtree 将搜索 *search_base* 中的直接子对象和任何嵌套对象。

选项

  • "base"

  • "one_level"

  • "subtree" ← (默认)

server

字符串

要连接到的域控制器/服务器。

如果未指定,则服务器将从当前 krb5.conf default_realm 设置以及 SRV DNS 查询中获取。

详情请参阅 服务器查找

可以使用 Jinja2 模板值设置此选项。

配置

strict

布尔值

如果为 yes,则使无效条目成为致命错误,否则跳过并继续。

由于可以在表达式中使用事实,因此它们可能并不总是可用,我们默认忽略这些错误。

选项

  • false ← (默认)

  • true

tls_mode

字符串

要使用的 TLS 操作。

如果显式 *port* 设置为 636,则默认为 ldaps

ldaps 将通过 LDAPS (端口 636) 连接。

start_tls 将通过 LDAP(端口 389)连接,并在身份验证绑定之前执行 StartTLS 操作。

如果要使用 TLS,建议使用 ldaps 而不是 start_tls

可以使用 Jinja2 模板值设置此选项。

选项

  • "ldaps"

  • "start_tls"

配置

use_extra_vars

布尔值

在 ansible-core 2.11 中添加

将额外的变量合并到可用于组合的变量中(最高优先级)。

选项

  • false ← (默认)

  • true

配置

用户名

字符串

用于身份验证的用户名。

如果auth_protocolsimple 且未指定用户名,则使用匿名身份验证。

如果auth_protocolnegotiatekerberosntlm 且未指定用户名,它将尝试使用可用的本地缓存凭据,例如由 kinit 获取的凭据。

可以使用 Jinja2 模板值设置此选项。

配置

备注

注意

  • 有关如何使用此清单插件的更多详细信息,请参阅 LDAP 清单

  • 有关此插件如何检索 LAPS 密码信息的更多详细信息,请参阅 LAPS

  • 此插件是技术预览版,模块选项可能会根据收到的反馈而更改。

  • 除非选项说明中另有说明,否则配置文件中指定的 value 将按原样使用。只有 LDAP 连接选项允许使用 Jinja2 模板。

  • 有关 LDAP 连接的更多信息,请参阅 LDAP 连接帮助

示例

# Set in the file ending with microsoft.ad.ldap.yml or microsoft.ad.ldap.yaml
plugin: microsoft.ad.ldap


####################################################################
#                        Connection Options                        #
#                                                                  #
# These options control how the plugin connects to the LDAP server #
####################################################################

# Connects to ldap://dc01.domain.com:389
server: dc01.domain.com
port: 389

# Connects to ldaps://dc01.domain.com:636
server: dc01.domain.com
tls_mode: ldaps

# Connects to the global catalog
# ldap://dc01.domain.com:3268
server: dc01.domain.com
port: 3268

# Provides explicit user, will use the current Kerberos ticket if no credential
# is provided.
username: [email protected]
password: Password123!

# Only allow Kerberos authentication.
auth_protocol: kerberos

# Verify LDAPS CA chain with custom CA chain.
tls_mode: ldaps
ca_cert: /home/user/certs/ldap.pem

# The username and password can be retrieved using a template with a lookup.
# Other connection options can also be set this way, the option description
# tells you whether it can be set to a template.
username: '{{ lookup("ansible.builtin.env", "LDAP_USERNAME") }}'
password: '{{ lookup("ansible.builtin.env", "LDAP_PASSWORD") }}'


##############################################
#               Search Options               #
#                                            #
# These options control the searching rules  #
##############################################

# Search for computer accounts in the Workshop OU.
search_base: OU=Workshop A,DC=domain,DC=com

# Filter the computer accounts returned for only ones with the dNSDomainName
# attribute set.
filter: (dNSDomainName=*)

# Filter computer accounts returned for ones starting with PROD and with the
# LAPS password set.
filter: (&(sAMAccountName=PROD*)(ms-Mcs-AdmPwd=*))

# See documentation for more details
attributes:
  sAMAccountName:
    sam_account_name:
  objectSid:
    computer_sid:
  pwdLastSet:
    password_last_set: this | microsoft.ad.as_datetime
  comment:
    host_comment
  memberOf:
    # Gets the value (1) of the first RDN (0) of each memberOf instance (this).
    # For example 'CN=Domain Admins,CN=Users,DC=domain,DC=test'
    # will be returned as just 'Domain Admins'
    computer_membership: this | microsoft.ad.parse_dn | map(attribute="0.1")
  location:


############################################################################
#                             LAPS Integration                             #
#                                                                          #
# Examples on how to use the new Windows LAPS values as connection options #
############################################################################

attributes:
  # msLAPS-Password is used if no encryption has been configured.
  # Currently an encrypted LAPS password is not supported.
  msLAPS-Password:
    ansible_user: (this | from_json).n
    ansible_password: (this | from_json).p

  # msLAPS-EncryptedPassword is used if encryption has been configured.
  # If the Python dpapi-ng library is installed the `this`` value will
  # contain the entry `value` which is the decrypted value. The ``info``
  # entry will contain the reason why the value could not be decrypted.
  msLAPS-EncryptedPassword:
    ansible_user: (this.value | from_json).n
    ansible_password: (this.value | from_json).p

  # ms-Mcs-AdmPwd is used for Legacy LAPS and stores just the password.
  # The username needs to be hardcoded as a string value for this template.
  ms-Mcs-AdmPwd:
    ansible_user: '"Administrator"'
    ansible_password: this


#####################################################################
#                        Constructed Options                        #
#                                                                   #
# These options control the constructed values like vars and groups #
#####################################################################

# Build composed host variables. Requires attributes to be set in the
# attributes option to be referenced here.
compose:
  host_var: computer_sid

# Conditionals that adds found hosts to the groups specified.
groups:
  # Adds all hosts to the windows group
  windows: true

  # Uses the memberOf fact documented above to place the host in the production
  # group if it's a member of that group
  production: '"Production Group" in computer_membership'

# Adds the host to a group site_{{ location }} with the default group of
# site_unknown if the location isn't defined
keyed_groups:
  - key: location | default(omit)
    prefix: site
    default_value: unknown

作者

  • Jordan Borean (@jborean93)

提示

每个条目类型的配置条目具有从低到高的优先级顺序。例如,列表中较低的变量将覆盖较高的变量。