使用 Ansible 在 RHEL 中安装和管理身份管理
使用 Ansible playbook 安装、配置和维护 IdM 环境
摘要
第 1 章 Ansible 术语
此标题中的章节使用官方 Ansible 术语。如果您不熟悉术语,请先阅读 Ansible 上游官方文档,然后再继续,特别是以下部分:
- Ansible 部分中的基本概念 概述了 Ansible 中最常使用的概念。
- 用户指南概述了开始使用 Ansible 时最常见的情况和问题,例如使用命令行;使用清单;与数据交互;编写任务、play 和 playbook;以及执行 playbook。
- 如何构建您的清单,提供了有关如何设计清单的提示。清单 (inventory) 是 Ansible 用于针对基础架构中的多个受管节点或主机的一组列表。
- Playbook 简介引入了 Ansible playbook 的概念,作为可重复和可重复使用的系统来管理配置、部署机器和部署复杂应用。
- Ansible roles 部分中介绍如何根据已知的文件结构自动加载变量、任务和处理程序。
- playbook 部分中使用集合提供了如何简化 playbook 中引用集合的建议。
- Glossary 解释了 Ansible 文档其中使用的术语。
第 2 章 使用 Ansible playbook 来安装身份管理服务器
了解如何使用 Ansible 将系统配置为 IdM 服务器。将系统配置为 IdM 服务器建立 IdM 域并让系统向 IdM 客户端提供 IdM 服务。您可以使用 freeipa.ansible_freeipa.ipaserver
Ansible 角色来管理部署。
先决条件
- 您了解了一般的 Ansible 和 IdM 概念。
2.1. Ansible 及其安装 IdM 的优点
Ansible 是一个自动化工具,用于配置系统、部署软件和执行滚动更新。Ansible 包含对 RHEL 身份管理(IdM)的支持,您可以使用 Ansible 角色自动执行安装任务,如 IdM 服务器、副本、客户端或整个 IdM 拓扑的设置。
使用 Ansible 安装 IdM 的优点
以下列表提供了使用 Ansible 安装身份管理与手动安装的优点。
- 您不需要登录受管节点。
- 您不需要配置每个主机上的设置来单独部署。反之,您可以有一个清单文件来部署完整的集群。
- 您可以稍后重复将清单文件用于管理任务,例如添加用户和主机。即使与 IdM 相关的任务,也可以重复使用清单文件。
2.2. 安装 ansible-freeipa 软件包
按照以下步骤安装 ansible-freeipa
软件包,它为安装和管理 RHEL Identity Management (IdM)提供 Ansible 角色和模块。
先决条件
- 确定控制器是一个带有有效订阅的 Red Hat Enterprise Linux 系统。否则,请参阅官方 Ansible 文档 安装指南 来获取替代安装说明。
-
确保您可以通过
SSH
协议,从控制器访问受管节点。检查该受管节点是否已列在控制器的/root/.ssh/known_hosts
文件中。
流程
在 Ansible 控制器上使用以下流程。
安装
ansible-freeipa
软件包:dnf install ansible-freeipa
# dnf install ansible-freeipa
Copy to Clipboard Copied! 角色和模块安装到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/roles/
和/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/plugins/modules
目录中。
ansible-freeipa
rpm 现在只安装 freeipa.ansible_freeipa
集合。
要使用新集合,请将 freeipa.ansible_freeipa
前缀添加到角色和模块的名称中。使用完全限定名称来遵循 Ansible 建议。例如,要引用 ipahbacrule
模块,请使用 freeipa.ansible_freeipa.ipahbacrule
。
2.3. 在文件系统中的 Ansible 角色位置
默认情况下,ansible-freeipa
角色被安装到 /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/roles/
目录中。ansible-freeipa
软件包的结构如下:
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/roles/
目录在 Ansible 控制器上存储ipaserver
,ipareplica
,ipaclient
,ipasmartcard
和ipabackup
角色。每个角色目录都会在README.md
Markdown 文件中存储有关角色的示例、基本概述、许可证和文档。ls -1 /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/roles
[root@server]# ls -1 /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/roles ipaclient ipareplica ipaserver
Copy to Clipboard Copied! /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/
目录将有关各个角色和拓扑的文档存储在README.md
Markdown 文件中。它还存储playbook/
子目录。ls -1 /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/
[root@server]# ls -1 /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/ playbooks README-client.md README.md README-replica.md README-server.md README-topology.md
Copy to Clipboard Copied! /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/
目录存储示例 playbook:ls -1 /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/
[root@server]# ls -1 /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/ install-client.yml install-cluster.yml install-replica.yml install-server.yml uninstall-client.yml uninstall-cluster.yml uninstall-replica.yml uninstall-server.yml
Copy to Clipboard Copied!
2.4. 为带有集成 DNS 和集成 CA 作为根 CA 的部署设置参数
完成这个流程,来在使用 IdM 集成 DNS 解决方案的环境中为安装带有集成 CA 作为根 CA 的 IdM 服务器配置清单文件。
此流程中的清单使用 INI
格式。或者,也可以使用 YAML
或 JSON
格式。
流程
创建一个
~/MyPlaybooks/
目录:mkdir MyPlaybooks
$ mkdir MyPlaybooks
Copy to Clipboard Copied! -
创建一个
~/MyPlaybooks/inventory
文件。 打开清单文件进行编辑。指定您要用作 IdM 服务器的主机的完全限定域名(
FQDN
)。确保FQDN
满足以下条件:- 只允许字母数字字符和连字符(-)。例如,不允许使用下划线,这可能导致 DNS 失败。
- 主机名必须都是小写。
- 指定 IdM 域和域信息。
通过添加以下选项来指定您要使用集成的 DNS:
ipaserver_setup_dns=true
ipaserver_setup_dns=true
Copy to Clipboard Copied! 指定 DNS 转发设置。选择以下选项之一:
-
如果您希望安装程序使用
/etc/resolv.conf
文件中的转发器,请使用ipaserver_auto_forwarders=true
选项。如果在/etc/resolv.conf
文件中指定的名称服务器是 localhost 127.0.0.1 地址,或者位于虚拟专用网络中,且您使用的 DNS 服务器通常无法从公共互联网访问,则不要使用这个选项。 -
使用
ipaserver_forwarders
选项手动指定您的转发器。安装过程将转发器 IP 地址添加到安装的 IdM 服务器上的/etc/named.conf
文件中。 使用
ipaserver_no_forwarders=true
选项配置要使用的根 DNS 服务器。注意如果没有 DNS 转发器,您的环境是隔离的,且您基础架构中来自其他 DNS 域的名称不能被解决。
-
如果您希望安装程序使用
指定 DNS 反向记录和区设置。从以下选项中选择:
-
使用
ipaserver_allow_zone_overlap=true
选项允许创建(反向)区域,即使区域已可以解析。 -
使用
ipaserver_reverse_zones
选项来手动指定反向区。 如果您不希望安装程序创建反向 DNS 区域,请使用
ipaserver_no_reverse=true
选项。注意使用 IdM 管理反向区是可选的。您可以改为使用外部 DNS 服务来实现这一目的。
-
使用
-
指定
admin
和Directory Manager
的密码。使用 Ansible Vault 存储密码,并从 playbook 文件中引用 Vault 文件。或者,在清单文件中直接指定密码,这不太安全。 可选:指定一个要被 IdM 服务器使用的自定义
firewalld
区域。如果您没有设置自定义区,IdM 会将其服务添加到默认的firewalld
区中。预定义的默认区是public
。重要指定的
firewalld
区必须存在,并且是永久的。一个具有所需服务器信息的清单文件示例(不包括密码)
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true [...]
Copy to Clipboard Copied! 一个具有所需服务器信息的清单文件示例(包括密码)
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 [...]
Copy to Clipboard Copied! 一个具有自定义
firewalld
区域的清单文件示例[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 ipaserver_firewalld_zone=custom zone
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 ipaserver_firewalld_zone=custom zone
Copy to Clipboard Copied! 使用存储在 Ansible Vault 文件中的 admin 和 Directory Manager 密码设置 IdM 服务器的 playbook 示例
--- - name: Playbook to configure IPA server hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipaserver state: present
--- - name: Playbook to configure IPA server hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipaserver state: present
Copy to Clipboard Copied! 使用清单文件中的 admin 和 Directory Manager 密码来设置 IdM 服务器的 playbook 示例
--- - name: Playbook to configure IPA server hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present
--- - name: Playbook to configure IPA server hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present
Copy to Clipboard Copied!
2.5. 为带有外部 DNS 和集成 CA 作为根 CA 的部署设置参数
完成这个流程,来为在使用外部 DNS 解决方案的环境中安装带有集成 CA 作为根 CA 的 IdM 服务器配置 inventory 文件。
此流程中的清单文件使用 INI
格式。或者,也可以使用 YAML
或 JSON
格式。
流程
创建一个
~/MyPlaybooks/
目录:mkdir MyPlaybooks
$ mkdir MyPlaybooks
Copy to Clipboard Copied! -
创建一个
~/MyPlaybooks/inventory
文件。 打开清单文件进行编辑。指定您要用作 IdM 服务器的主机的完全限定域名(
FQDN
)。确保FQDN
满足以下条件:- 只允许字母数字字符和连字符(-)。例如,不允许使用下划线,这可能导致 DNS 失败。
- 主机名必须都是小写。
- 指定 IdM 域和域信息。
-
确保
ipaserver_setup_dns
选项被设为no
或空缺。 -
指定
admin
和Directory Manager
的密码。使用 Ansible Vault 存储密码,并从 playbook 文件中引用 Vault 文件。或者,在清单文件中直接指定密码,这不太安全。 可选:指定一个要被 IdM 服务器使用的自定义
firewalld
区域。如果您没有设置自定义区,IdM 会将其服务添加到默认的firewalld
区中。预定义的默认区是public
。重要指定的
firewalld
区必须存在,并且是永久的。一个具有所需服务器信息的清单文件示例(不包括密码)
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no [...]
Copy to Clipboard Copied! 一个具有所需服务器信息的清单文件示例(包括密码)
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 [...]
Copy to Clipboard Copied! 一个具有自定义
firewalld
区域的清单文件示例[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 ipaserver_firewalld_zone=custom zone
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 ipaserver_firewalld_zone=custom zone
Copy to Clipboard Copied! 使用存储在 Ansible Vault 文件中的 admin 和 Directory Manager 密码设置 IdM 服务器的 playbook 示例
--- - name: Playbook to configure IPA server hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipaserver state: present
--- - name: Playbook to configure IPA server hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipaserver state: present
Copy to Clipboard Copied! 使用清单文件中的 admin 和 Directory Manager 密码来设置 IdM 服务器的 playbook 示例
--- - name: Playbook to configure IPA server hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present
--- - name: Playbook to configure IPA server hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present
Copy to Clipboard Copied!
2.6. 使用 Ansible playbook 将集成 CA 的 IdM 服务器部署为 root CA
完成此流程,来使用 Ansible playbook 部署带有集成证书颁发机构(CA)作为根 CA 的 IdM 服务器。
先决条件
- 受管节点是一个具有静态 IP 地址和可正常工作的软件包管理器的 Red Hat Enterprise Linux 10 系统。
您可以通过选择以下流程之一来设置与您的场景相对应的参数:
流程
运行 Ansible playbook:
ansible-playbook -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-server.yml
$ ansible-playbook -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-server.yml
Copy to Clipboard Copied! 选择以下选项之一:
如果您的 IdM 部署使用外部 DNS:将包含在
/tmp/ipa.system.records.UFRPto.db
文件中的 DNS 资源记录添加到现有的外部 DNS 服务器中。更新 DNS 记录的过程因特定的 DNS 解决方案而异。... Restarting the KDC Please add records in this file to your DNS system: /tmp/ipa.system.records.UFRBto.db Restarting the web server ...
... Restarting the KDC Please add records in this file to your DNS system: /tmp/ipa.system.records.UFRBto.db Restarting the web server ...
Copy to Clipboard Copied!
重要在将 DNS 记录添加到现有 DNS 服务器之前,服务器安装不会完成。
如果您的 IdM 部署使用集成的 DNS:
将父域中的 DNS 委托程序添加到 IdM DNS 域。例如,如果 IdM DNS 域是
idm.example.com
,请在example.com
父域中添加一个名字服务器(NS)记录。重要每次安装 IdM DNS 服务器后都会重复这个步骤。
-
将时间服务器的
_ntp._udp
服务(SRV)记录添加到您的 IdM DNS。IdM DNS 中新安装的 IdM 服务器的时间服务器的 SRV 记录可确保将来的副本和客户端安装会自动配置为与此主 IdM 服务器使用的时间服务器同步。
2.7. 为带有集成 DNS 和外部 CA 作为根 CA 的部署设置参数
完成此流程,来为在使用 IdM 集成的 DNS 解决方案的环境中安装带有外部 CA 作为根 CA 的 IdM 服务器配置清单文件。
此流程中的清单文件使用 INI
格式。或者,也可以使用 YAML
或 JSON
格式。
流程
创建一个
~/MyPlaybooks/
目录:mkdir MyPlaybooks
$ mkdir MyPlaybooks
Copy to Clipboard Copied! -
创建一个
~/MyPlaybooks/inventory
文件。 打开清单文件进行编辑。指定您要用作 IdM 服务器的主机的完全限定域名(
FQDN
)。确保FQDN
满足以下条件:- 只允许字母数字字符和连字符(-)。例如,不允许使用下划线,这可能导致 DNS 失败。
- 主机名必须都是小写。
- 指定 IdM 域和域信息。
通过添加以下选项来指定您要使用集成的 DNS:
ipaserver_setup_dns=true
ipaserver_setup_dns=true
Copy to Clipboard Copied! 指定 DNS 转发设置。选择以下选项之一:
-
如果您希望安装进程使用
/etc/resolv.conf
文件中的转发器,请使用ipaserver_auto_forwarders=true
选项。如果/etc/resolv.conf
文件中指定的名字服务器是 localhost 127.0.0.1 地址,或者如果您在虚拟私有网络中,并且您使用的 DNS 服务器通常无法从公共互联网访问,则不建议使用此选项。 -
使用
ipaserver_forwarders
选项手动指定您的转发器。安装过程将转发器 IP 地址添加到安装的 IdM 服务器上的/etc/named.conf
文件中。 使用
ipaserver_no_forwarders=true
选项配置要使用的根 DNS 服务器。注意如果没有 DNS 转发器,您的环境是隔离的,且您基础架构中来自其他 DNS 域的名称不能被解决。
-
如果您希望安装进程使用
指定 DNS 反向记录和区设置。从以下选项中选择:
-
使用
ipaserver_allow_zone_overlap=true
选项允许创建(反向)区域,即使区域已可以解析。 -
使用
ipaserver_reverse_zones
选项来手动指定反向区。 如果您不希望安装过程创建反向 DNS 区域,请使用
ipaserver_no_reverse=true
选项。注意使用 IdM 管理反向区是可选的。您可以改为使用外部 DNS 服务来实现这一目的。
-
使用
-
指定
admin
和Directory Manager
的密码。使用 Ansible Vault 存储密码,并从 playbook 文件中引用 Vault 文件。或者,在清单文件中直接指定密码,这不太安全。 可选:指定一个要被 IdM 服务器使用的自定义
firewalld
区域。如果您没有设置自定义区,IdM 会将其服务添加到默认的firewalld
区。预定义的默认区是public
。重要指定的
firewalld
区必须存在,并且是永久的。一个具有所需服务器信息的清单文件示例(不包括密码)
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true [...]
Copy to Clipboard Copied! 一个具有所需服务器信息的清单文件示例(包括密码)
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 [...]
Copy to Clipboard Copied! 一个具有自定义
firewalld
区域的清单文件示例[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 ipaserver_firewalld_zone=custom zone [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=true ipaserver_auto_forwarders=true ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 ipaserver_firewalld_zone=custom zone [...]
Copy to Clipboard Copied! 为安装的第一个步骤创建一个 playbook。输入有关生成证书签名请求(CSR),并将其从控制器复制到受管节点的说明。
--- - name: Playbook to configure IPA server Step 1 hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml vars: ipaserver_external_ca: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present post_tasks: - name: Copy CSR /root/ipa.csr from node to "{{ groups.ipaserver[0] + '-ipa.csr' }}" fetch: src: /root/ipa.csr dest: "{{ groups.ipaserver[0] + '-ipa.csr' }}" flat: true
--- - name: Playbook to configure IPA server Step 1 hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml vars: ipaserver_external_ca: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present post_tasks: - name: Copy CSR /root/ipa.csr from node to "{{ groups.ipaserver[0] + '-ipa.csr' }}" fetch: src: /root/ipa.csr dest: "{{ groups.ipaserver[0] + '-ipa.csr' }}" flat: true
Copy to Clipboard Copied! 为安装的最后步骤创建另一个 playbook。
--- - name: Playbook to configure IPA server Step 2 hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml vars: ipaserver_external_cert_files: - "/root/servercert20240601.pem" - "/root/cacert.pem" pre_tasks: - name: Copy "{{ groups.ipaserver[0] }}-{{ item }}" to "/root/{{ item }}" on node ansible.builtin.copy: src: "{{ groups.ipaserver[0] }}-{{ item }}" dest: "/root/{{ item }}" force: true with_items: - servercert20240601.pem - cacert.pem roles: - role: freeipa.ansible_freeipa.ipaserver state: present
--- - name: Playbook to configure IPA server Step 2 hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml vars: ipaserver_external_cert_files: - "/root/servercert20240601.pem" - "/root/cacert.pem" pre_tasks: - name: Copy "{{ groups.ipaserver[0] }}-{{ item }}" to "/root/{{ item }}" on node ansible.builtin.copy: src: "{{ groups.ipaserver[0] }}-{{ item }}" dest: "/root/{{ item }}" force: true with_items: - servercert20240601.pem - cacert.pem roles: - role: freeipa.ansible_freeipa.ipaserver state: present
Copy to Clipboard Copied!
2.8. 为带有外部 DNS 和外部 CA 作为根 CA 的部署设置参数
完成此流程,来为在使用外部 DNS 解决方案的环境中安装带有外部 CA 作为根 CA 的 IdM 服务器配置清单文件。
此流程中的清单文件使用 INI
格式。或者,也可以使用 YAML
或 JSON
格式。
流程
创建一个
~/MyPlaybooks/
目录:mkdir MyPlaybooks
$ mkdir MyPlaybooks
Copy to Clipboard Copied! -
创建一个
~/MyPlaybooks/inventory
文件。 打开清单文件进行编辑。指定您要用作 IdM 服务器的主机的完全限定域名(
FQDN
)。确保FQDN
满足以下条件:- 只允许字母数字字符和连字符(-)。例如,不允许使用下划线,这可能导致 DNS 失败。
- 主机名必须都是小写。
- 指定 IdM 域和域信息。
-
确保
ipaserver_setup_dns
选项被设为no
或空缺。 -
指定
admin
和Directory Manager
的密码。使用 Ansible Vault 存储密码,并从 playbook 文件中引用 Vault 文件。或者,在清单文件中直接指定密码,这不太安全。 可选:指定一个要被 IdM 服务器使用的自定义
firewalld
区域。如果您没有设置自定义区,IdM 会将其服务添加到默认的firewalld
区中。预定义的默认区是public
。重要指定的
firewalld
区必须存在,并且是永久的。一个具有所需服务器信息的清单文件示例(不包括密码)
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no [...]
Copy to Clipboard Copied! 一个具有所需服务器信息的清单文件示例(包括密码)
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 [...]
Copy to Clipboard Copied! 一个具有自定义
firewalld
区域的清单文件示例[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 ipaserver_firewalld_zone=custom zone [...]
[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=no ipaadmin_password=MySecretPassword123 ipadm_password=MySecretPassword234 ipaserver_firewalld_zone=custom zone [...]
Copy to Clipboard Copied! 为安装的第一个步骤创建一个 playbook。输入有关生成证书签名请求(CSR),并将其从控制器复制到受管节点的说明。
--- - name: Playbook to configure IPA server Step 1 hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml vars: ipaserver_external_ca: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present post_tasks: - name: Copy CSR /root/ipa.csr from node to "{{ groups.ipaserver[0] + '-ipa.csr' }}" fetch: src: /root/ipa.csr dest: "{{ groups.ipaserver[0] + '-ipa.csr' }}" flat: true
--- - name: Playbook to configure IPA server Step 1 hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml vars: ipaserver_external_ca: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present post_tasks: - name: Copy CSR /root/ipa.csr from node to "{{ groups.ipaserver[0] + '-ipa.csr' }}" fetch: src: /root/ipa.csr dest: "{{ groups.ipaserver[0] + '-ipa.csr' }}" flat: true
Copy to Clipboard Copied! 为安装的最后步骤创建另一个 playbook。
--- - name: Playbook to configure IPA server Step 2 hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml vars: ipaserver_external_cert_files: - "/root/servercert20240601.pem" - "/root/cacert.pem" pre_tasks: - name: Copy "{{ groups.ipaserver[0] }}-{{ item }}" to "/root/{{ item }}" on node ansible.builtin.copy: src: "{{ groups.ipaserver[0] }}-{{ item }}" dest: "/root/{{ item }}" force: true with_items: - servercert20240601.pem - cacert.pem roles: - role: freeipa.ansible_freeipa.ipaserver state: present
--- - name: Playbook to configure IPA server Step 2 hosts: ipaserver become: true vars_files: - playbook_sensitive_data.yml vars: ipaserver_external_cert_files: - "/root/servercert20240601.pem" - "/root/cacert.pem" pre_tasks: - name: Copy "{{ groups.ipaserver[0] }}-{{ item }}" to "/root/{{ item }}" on node ansible.builtin.copy: src: "{{ groups.ipaserver[0] }}-{{ item }}" dest: "/root/{{ item }}" force: true with_items: - servercert20240601.pem - cacert.pem roles: - role: freeipa.ansible_freeipa.ipaserver state: present
Copy to Clipboard Copied!
2.9. 使用 Ansible playbook 将外部 CA 部署 IdM 服务器作为 root CA
完成此流程,来使用 Ansible playbook 部署具有外部证书颁发机构(CA)作为根 CA 的 IdM 服务器。
先决条件
- 受管节点是一个具有静态 IP 地址和可正常工作的软件包管理器的 Red Hat Enterprise Linux 10 系统。
您可以通过选择以下流程之一来设置与您的场景相对应的参数:
流程
使用安装第一步的说明运行 Ansible playbook,如
install-server-step1.yml
:ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-server-step1.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-server-step1.yml
Copy to Clipboard Copied! -
在控制器上找到
ipa.csr
证书签名请求文件,并提交给外部的 CA。 - 将外部 CA 签名的 IdM CA 证书放在控制器文件系统中,以便下一步中的 playbook 可以找到它。
使用安装最后一步的说明运行 Ansible playbook,如
install-server-step2.yml
:ansible-playbook -v -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-server-step2.yml
$ ansible-playbook -v -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-server-step2.yml
Copy to Clipboard Copied! 选择以下选项之一:
如果您的 IdM 部署使用外部 DNS:将包含在
/tmp/ipa.system.records.UFRPto.db
文件中的 DNS 资源记录添加到现有的外部 DNS 服务器中。更新 DNS 记录的过程因特定的 DNS 解决方案而异。... Restarting the KDC Please add records in this file to your DNS system: /tmp/ipa.system.records.UFRBto.db Restarting the web server ...
... Restarting the KDC Please add records in this file to your DNS system: /tmp/ipa.system.records.UFRBto.db Restarting the web server ...
Copy to Clipboard Copied!
重要在将 DNS 记录添加到现有 DNS 服务器之前,服务器安装不会完成。
如果您的 IdM 部署使用集成的 DNS:
将父域中的 DNS 委托程序添加到 IdM DNS 域。例如,如果 IdM DNS 域是
idm.example.com
,请在example.com
父域中添加一个名字服务器(NS)记录。重要每次安装 IdM DNS 服务器后都会重复这个步骤。
-
将时间服务器的
_ntp._udp
服务(SRV)记录添加到您的 IdM DNS。IdM DNS 中新安装的 IdM 服务器的时间服务器的 SRV 记录可确保将来的副本和客户端安装会自动配置为与此主 IdM 服务器使用的时间服务器同步。
2.10. 使用 Ansible playbook 卸载 IdM 服务器
在现有的 RHEL Identity Management (IdM)部署中, 副本和 服务器是交换的术语。
完成此流程,使用 Ansible playbook 来卸载 IdM 副本。在本例中:
- 从 server123.idm.example.com 卸载 IdM 配置。
- server123.idm.example.com 和关联的主机条目从 IdM 拓扑中删除。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 在受管节点上:
- 系统在 RHEL 10 上运行。
流程
使用以下内容创建 Ansible playbook 文件 uninstall-server.yml :
--- - name: Playbook to uninstall an IdM replica hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver ipaserver_remove_from_domain: true state: absent
--- - name: Playbook to uninstall an IdM replica hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver ipaserver_remove_from_domain: true state: absent
Copy to Clipboard Copied! ipaserver_remove_from_domain
选项从 IdM 拓扑中取消主机注册。注意如果 server123.idm.example.com 的删除导致断开连接的拓扑,则删除操作将被中止。如需更多信息,请参阅 如果这会导致断开连接的拓扑,请使用 Ansible playbook 卸载 IdM 服务器。
卸载副本:
ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/inventory <path_to_playbooks_directory>/uninstall-server.yml
$ ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/inventory <path_to_playbooks_directory>/uninstall-server.yml
Copy to Clipboard Copied! - 确保指向 server123.idm.example.com 的所有名称服务器(NS) DNS 记录都从 DNS 区域中删除。无论您使用由 IdM 还是外部 DNS 管理的集成 DNS,这个均适用。
2.11. 如果这会导致断开连接的拓扑,请使用 Ansible playbook 卸载 IdM 服务器
在现有的 RHEL Identity Management (IdM)部署中, 副本和 服务器是交换的术语。
完成此流程,使用 Ansible playbook 卸载 IdM 副本,即使这会导致断开连接的 IdM 拓扑。在示例中,server456.idm.example.com 用于从拓扑中删除副本和 FQDN 为 server123.idm.example.com server123.idm.example.com 的相关的主机条目,使某些副本与 server456.idm.example.com 以及拓扑的其余部分断开连接。
如果只使用 remove_server_from_domain
从拓扑中删除副本不会导致断开连接的拓扑,则不需要其他选项。如果结果是断开连接的拓扑,您必须指定您要保留域的哪一部分。在这种情况下,您必须执行以下操作:
-
指定
ipaserver_remove_on_server
值。 -
将
ipaserver_ignore_topology_disconnect
设置为 True。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 在受管节点上:
- 系统在 RHEL 10 上运行。
流程
使用以下内容创建 Ansible playbook 文件 uninstall-server.yml :
--- - name: Playbook to uninstall an IdM replica hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver ipaserver_remove_from_domain: true ipaserver_remove_on_server: server456.idm.example.com ipaserver_ignore_topology_disconnect: true state: absent
--- - name: Playbook to uninstall an IdM replica hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver ipaserver_remove_from_domain: true ipaserver_remove_on_server: server456.idm.example.com ipaserver_ignore_topology_disconnect: true state: absent
Copy to Clipboard Copied! 注意正常情况下,如果删除 server123 不会造成断开连接的拓扑:如果
ipaserver_remove_on_server
的值没有设置,则 server123 上的副本会使用 server123 的复制协议自动删除。卸载副本:
ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/uninstall-server.yml
$ ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/uninstall-server.yml
Copy to Clipboard Copied! - 确保指向 server123.idm.example.com 的所有名称服务器(NS) DNS 记录都从 DNS 区域中删除。无论您使用由 IdM 还是外部 DNS 管理的集成 DNS,这个均适用。
第 3 章 使用 Ansible playbook 安装身份管理副本
使用 Ansible 将系统配置为 IdM 副本,来将其注册到 IdM 域,并让系统使用域中 IdM 服务器上的 IdM 服务。
部署是由 ipareplica
Ansible 角色来管理的。该角色可以使用自动发现模式来识别 IdM 服务器、域和其他设置。但是,如果您在类似层的模式中部署多个副本,且不同的副本组在不同时间被部署,则您必须为每个组定义特定的服务器或副本。
先决条件
- 您已在 Ansible 控制节点上安装了 ansible-freeipa 软件包。
- 您了解了一般的 Ansible 和 IdM 概念。
- 您已 在部署中计划了副本拓扑。
3.1. 指定用于安装 IdM 副本的基础、服务器和客户端变量
完成此流程来配置用于安装 IdM 副本的清单文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
freeipa.ansible_freeipa
集合。
流程
打开清单文件进行编辑。指定要成为 IdM 副本的主机的完全限定域名(FQDN)。FQDN 必须是有效的 DNS 名称:
-
仅允许数字、字母字符和连字符(
-
)。例如,不允许使用下划线,这可能导致 DNS 失败。 主机名必须都是小写。
仅定义副本 FQDN 的简单清单主机文件示例
[ipareplicas] replica1.idm.example.com replica2.idm.example.com replica3.idm.example.com [...]
[ipareplicas] replica1.idm.example.com replica2.idm.example.com replica3.idm.example.com [...]
Copy to Clipboard Copied! 如果 IdM 服务器已经部署,且在 IdM DNS 区中正确设置了 SRV 记录,那么脚本会自动发现所有其他必需的值。
-
仅允许数字、字母字符和连字符(
可选:根据您设计拓扑的方式在清单文件中提供额外的信息:
- 场景 1
如果要避免自动发现,并且使
[ipareplicas]
部分中列出的所有副本都使用特定的 IdM 服务器,请在清单文件的[ipaservers]
部分中设置服务器。带有 IdM 服务器 FQDN 和定义的副本的清单主机文件示例
[ipaservers] server.idm.example.com [ipareplicas] replica1.idm.example.com replica2.idm.example.com replica3.idm.example.com [...]
[ipaservers] server.idm.example.com [ipareplicas] replica1.idm.example.com replica2.idm.example.com replica3.idm.example.com [...]
Copy to Clipboard Copied! - 场景 2
或者,如果要避免自动发现,但希望使用特定服务器部署特定副本,请在清单文件的
ipareplicas
部分中单独为特定副本设置服务器。为特定副本定义了特定 IdM 服务器的清单文件示例
[ipaservers] server.idm.example.com replica1.idm.example.com [ipareplicas] replica2.idm.example.com replica3.idm.example.com ipareplica_servers=replica1.idm.example.com
[ipaservers] server.idm.example.com replica1.idm.example.com [ipareplicas] replica2.idm.example.com replica3.idm.example.com ipareplica_servers=replica1.idm.example.com
Copy to Clipboard Copied! 在上例中,
replica3.idm.example.com
使用已部署的replica1.idm.example.com
作为其复制源。- 场景 3
如果您在一个批处理中部署多个副本,并且时间是您关心的问题,那么多层副本部署可能对您很有用。在清单文件中定义特定的副本组,如
[ipareplicas_tier1]
和[ipareplicas_tier2]
,并在install-replica.yml
playbook 中为每个组设计单独的 play。定义了副本层的清单文件示例
[ipaservers] server.idm.example.com [ipareplicas_tier1] replica1.idm.example.com [ipareplicas_tier2] replica2.idm.example.com \ ipareplica_servers=replica1.idm.example.com,server.idm.example.com
[ipaservers] server.idm.example.com [ipareplicas_tier1] replica1.idm.example.com [ipareplicas_tier2] replica2.idm.example.com \ ipareplica_servers=replica1.idm.example.com,server.idm.example.com
Copy to Clipboard Copied! 将使用
ipareplica_servers
中的第一个条目。第二个条目将用作回退选项。在使用多个层来部署 IdM 副本时,您必须在 playbook 中有单独的任务来首先从 tier1 部署副本,然后从 tier2 部署副本。为不同副本组使用不同 play 的 playbook 文件示例
--- - name: Playbook to configure IPA replicas (tier1) hosts: ipareplicas_tier1 become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present - name: Playbook to configure IPA replicas (tier2) hosts: ipareplicas_tier2 become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present
--- - name: Playbook to configure IPA replicas (tier1) hosts: ipareplicas_tier1 become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present - name: Playbook to configure IPA replicas (tier2) hosts: ipareplicas_tier2 become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present
Copy to Clipboard Copied!
可选:提供有关
firewalld
和 DNS 的额外信息:- 场景 1
如果您希望副本使用指定的
firewalld
区域,如一个内部区域,您可以在清单文件中指定它。如果您没有设置自定义区,IdM 会将其服务添加到默认的firewalld
区中。预定义的默认区是public
。重要指定的
firewalld
区必须存在,并且是永久的。带有自定义
firewalld
区域的简单清单主机文件示例[ipaservers] server.idm.example.com [ipareplicas] replica1.idm.example.com replica2.idm.example.com replica3.idm.example.com [...] [ipareplicas:vars] ipareplica_firewalld_zone=custom zone
[ipaservers] server.idm.example.com [ipareplicas] replica1.idm.example.com replica2.idm.example.com replica3.idm.example.com [...] [ipareplicas:vars] ipareplica_firewalld_zone=custom zone
Copy to Clipboard Copied! - 场景 2
如果您希望副本托管 IdM DNS 服务,请将 ipareplica_setup_dns=true 行添加到
[ipareplicas:vars]
部分中。另外,请指定您是否要使用每服务器 DNS 转发器:-
要配置每服务器转发器,请将
ipareplica_forwarders
变量和字符串列表添加到[ipareplicas:vars]
部分,例如:ipareplica_forwarders=192.0.2.1,192.0.2.2 -
若要配置无每服务器转发器,请将以下行添加到
[ipareplicas:vars]
部分中:ipareplica_no_forwarders=true。 -
要根据副本的
/etc/resolv.conf
文件中列出的转发器配置每服务器转发器,请将ipareplica_auto_forwarders
变量添加到[ipareplicas:vars]
部分。
带有在副本上设置 DNS 和每个服务器转发器的指令的清单文件示例
[ipaservers] server.idm.example.com [ipareplicas] replica1.idm.example.com replica2.idm.example.com replica3.idm.example.com [...] [ipareplicas:vars] ipareplica_setup_dns=true ipareplica_forwarders=192.0.2.1,192.0.2.2
[ipaservers] server.idm.example.com [ipareplicas] replica1.idm.example.com replica2.idm.example.com replica3.idm.example.com [...] [ipareplicas:vars] ipareplica_setup_dns=true ipareplica_forwarders=192.0.2.1,192.0.2.2
Copy to Clipboard Copied! -
要配置每服务器转发器,请将
- 场景 3
使用
ipaclient_configure_dns_resolve
和ipaclient_dns_servers
选项指定 DNS 解析器,以简化集群部署。这在您的 IdM 部署使用集成的 DNS 时特别有用:指定 DNS 解析器的清单文件片段:
[...] [ipaclient:vars] ipaclient_configure_dns_resolver=true ipaclient_dns_servers=192.168.100.1
[...] [ipaclient:vars] ipaclient_configure_dns_resolver=true ipaclient_dns_servers=192.168.100.1
Copy to Clipboard Copied! 注意ipaclient_dns_servers
列表必须仅包含 IP 地址。主机名不允许。
3.2. 使用 Ansible playbook 指定用于安装 IdM 副本的凭证
完成这个步骤来配置安装 IdM 副本的授权。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
指定 授权部署副本的用户的密码,如 IdM
admin
。使用 Ansible Vault 来存储密码,并从 playbook 文件(如
install-replica.yml
)中引用 Vault 文件:使用来自清单文件和 Ansible Vault 文件中的密码的主体的 playbook 文件示例
- name: Playbook to configure IPA replicas hosts: ipareplicas become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipareplica state: present
- name: Playbook to configure IPA replicas hosts: ipareplicas become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipareplica state: present
Copy to Clipboard Copied! 有关如何使用 Ansible Vault 的详细信息,请参阅官方 Ansible Vault 文档。
直接在清单文件中提供
admin
的凭证不太安全。请在清单文件的[ipareplicas:vars]
部分中使用ipaadmin_password
选项。然后,清单文件和install-replica.yml
playbook 文件类似如下:清单 hosts.replica 文件示例
[...] [ipareplicas:vars] ipaadmin_password=Secret123
[...] [ipareplicas:vars] ipaadmin_password=Secret123
Copy to Clipboard Copied! 使用清单文件中的主体和密码的 playbook 示例
- name: Playbook to configure IPA replicas hosts: ipareplicas become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present
- name: Playbook to configure IPA replicas hosts: ipareplicas become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present
Copy to Clipboard Copied! 或者,在清单文件中提供授权直接部署副本的另一个用户的凭证也不太安全。要指定不同的授权用户,请使用
ipaadmin_principal
选项作为用户名,使用ipaadmin_password
选项作为密码。然后,清单文件和install-replica.yml
playbook 文件类似如下:清单 hosts.replica 文件示例
[...] [ipareplicas:vars] ipaadmin_principal=my_admin ipaadmin_password=my_admin_secret123
[...] [ipareplicas:vars] ipaadmin_principal=my_admin ipaadmin_password=my_admin_secret123
Copy to Clipboard Copied! 使用清单文件中的主体和密码的 playbook 示例
- name: Playbook to configure IPA replicas hosts: ipareplicas become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present
- name: Playbook to configure IPA replicas hosts: ipareplicas become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present
Copy to Clipboard Copied!
在安装 IdM 副本时,检查提供的 Kerberos 主体是否有所需的权限,也可以扩展来检查用户 ID 覆盖。因此,您可以使用配置为充当 IdM 管理员的 AD 管理员的凭证来部署副本。
3.3. 使用 Ansible playbook 部署 IdM 副本
完成此流程,使用 Ansible playbook 来部署 IdM 副本。
先决条件
- 受管节点是一个具有静态 IP 地址和可正常工作的软件包管理器的 Red Hat Enterprise Linux 10 系统。
- 您已配置了 用于安装 IdM 副本 的清单文件。
- 您已配置了 用于安装 IdM 副本 的授权。
流程
运行 Ansible playbook:
ansible-playbook -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-replica.yml
$ ansible-playbook -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-replica.yml
Copy to Clipboard Copied!
后续步骤
- 在大型部署中,您可以调整 IdM 副本的特定参数以提高性能。请参阅 身份管理 标题中的调优性能,以查找最适合您的情境的调优说明。
3.4. 使用 Ansible playbook 卸载一个 IdM 副本
在现有的 RHEL Identity Management (IdM)部署中, 副本和 服务器是交换的术语。有关如何卸载 IdM 服务器的详情,请参考 使用 Ansible playbook 卸载 IdM 服务器 或 使用 Ansible playbook 卸载 IdM 服务器,即使这会导致断开连接的拓扑。
其他资源
第 4 章 使用 Ansible playbook 安装身份管理客户端
了解如何使用 Ansible 将系统配置为身份管理(IdM)客户端。将系统配置为 IdM 客户端将其注册到 IdM 域中,并让系统在域中的 IdM 服务器中使用 IdM 服务。
部署是由 ipaclient
Ansible 角色来管理的。默认情况下,该角色使用 autodiscovery 模式来识别 IdM 服务器、域和其他设置。角色可以被修改为使用 Ansible playbook 使用指定的设置,例如在清单文件中。
先决条件
- 您已在 Ansible 控制节点上安装了 ansible-freeipa 软件包。
- 您在使用 Ansible 版本 2.15 或更高版本。
- 您了解了一般的 Ansible 和 IdM 概念。
4.1. 为自动发现客户端安装模式设置清单文件的参数
要使用 Ansible playbook 安装 RHEL 身份管理(IdM)客户端,请在清单文件中配置目标主机参数,如清单 :
- 有关主机的信息
- 任务的授权
根据您拥有的清单插件,清单文件可以采用多种格式。INI
格式是 Ansible 的默认值之一,如下例中使用。
要在 RHEL 中将智能卡与图形用户界面搭配使用,请确保在 Ansible playbook 中包含 ipaclient_mkhomedir
变量。
流程
-
打开
inventory
文件进行编辑。 指定要成为 IdM 客户端的主机的完全限定主机名(FQDN)。完全限定域名必须是有效的 DNS 名称:
-
仅允许数字、字母字符和连字符(
-
)。例如,不允许使用下划线,这可能导致 DNS 失败。 - 主机名必须都是小写。不允许使用大写字母。
如果在 IdM DNS 区中正确设置了 SRV 记录,该脚本会自动发现所有其他必要的值。
只带有客户端 FQDN 定义的简单的清单主机文件示例
[ipaclients] client.idm.example.com [...]
[ipaclients] client.idm.example.com [...]
Copy to Clipboard Copied! -
仅允许数字、字母字符和连字符(
指定注册客户端的凭证。可用的验证方法如下:
注册 客户端的用户权限的密码。这是默认选项。
使用 Ansible Vault 来存储密码,并从 playbook 文件(如
install-client.yml
)中引用 Vault 文件:使用来自清单文件和 Ansible Vault 文件中的密码的主体的 playbook 文件示例
- name: Playbook to configure IPA clients with username/password hosts: ipaclients become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipaclient state: present
- name: Playbook to configure IPA clients with username/password hosts: ipaclients become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipaclient state: present
Copy to Clipboard Copied! 在
inventory/hosts
文件的[ipaclients:vars]
部分中使用ipaadmin_password
选项来提供admin
的凭证不太安全。或者,指定不同的授权用户,请使用ipaadmin_principal
选项作为用户名,使用ipaadmin_password
选项作为密码。然后,inventory/hosts
清单文件和install-client.yml
playbook 文件类似如下:清单主机文件示例
[...] [ipaclients:vars] ipaadmin_principal=my_admin ipaadmin_password=Secret123
[...] [ipaclients:vars] ipaadmin_principal=my_admin ipaadmin_password=Secret123
Copy to Clipboard Copied! 使用清单文件中的主体和密码的 Playbook 示例
- name: Playbook to unconfigure IPA clients hosts: ipaclients become: true roles: - role: freeipa.ansible_freeipa.ipaclient state: true
- name: Playbook to unconfigure IPA clients hosts: ipaclients become: true roles: - role: freeipa.ansible_freeipa.ipaclient state: true
Copy to Clipboard Copied!
之前的注册的 客户端 keytab ,如果其仍然可用。
如果系统之前作为身份管理客户端注册,则可以使用这个选项。要使用此身份验证方法,请取消
#ipaclient_keytab
选项的注释,指定存储 keytab 的文件的路径,例如在inventory/hosts
的[ipaclient:vars]
部分。在注册过程中生成的随机一次性密码 (OTP)。要使用此身份验证方法,请在清单文件中使用
ipaclient_use_otp=true
选项。例如,您可以取消inventory/hosts
文件的[ipaclients:vars]
部分中的ipaclient_use_otp=true
选项的注释。请注意,对于 OTP,还必须指定以下选项之一:-
授权注册客户端的用户的密码 ,例如,为
inventory/hosts
文件的[ipaclients:vars]
部分的ipaadmin_password
提供值。 -
admin keytab,例如,为
inventory/hosts
的[ipaclients:vars]
部分中的ipaadmin_keytab
提供值。
-
授权注册客户端的用户的密码 ,例如,为
可选:使用
ipaclient_configure_dns_resolve
和ipaclient_dns_servers
选项(如果可用)指定 DNS 解析器来简化集群部署。这在您的 IdM 部署使用集成的 DNS 时特别有用:指定 DNS 解析器的清单文件片段:
[...] [ipaclients:vars] ipaadmin_password: "{{ ipaadmin_password }}" ipaclient_domain=idm.example.com ipaclient_configure_dns_resolver=true ipaclient_dns_servers=192.168.100.1
[...] [ipaclients:vars] ipaadmin_password: "{{ ipaadmin_password }}" ipaclient_domain=idm.example.com ipaclient_configure_dns_resolver=true ipaclient_dns_servers=192.168.100.1
Copy to Clipboard Copied! 注意ipaclient_dns_servers
列表必须仅包含 IP 地址。主机名不允许。-
您还可以指定
ipaclient_subid: true
选项,使为 IdM 级别上的 IdM 用户配置了子范围。
4.2. 当在客户端安装过程中无法自动发现时设置清单文件的参数
要使用 Ansible playbook 安装身份管理客户端,请在清单文件中配置目标主机参数,如 inventory/hosts
:
- 有关主机、IdM 服务器和 IdM 域或 IdM 领域的信息
- 任务的授权
根据您拥有的清单插件,清单文件可以采用多种格式。INI
格式是 Ansible 的默认值之一,如下例中使用。
要在 RHEL 中将智能卡与图形用户界面搭配使用,请确保在 Ansible playbook 中包含 ipaclient_mkhomedir
变量。
流程
指定要成为 IdM 客户端的主机的完全限定主机名(FQDN)。完全限定域名必须是有效的 DNS 名称:
-
仅允许数字、字母字符和连字符(
-
)。例如,不允许使用下划线,这可能导致 DNS 失败。 - 主机名必须都是小写。不允许使用大写字母。
-
仅允许数字、字母字符和连字符(
在
inventory/hosts
文件的相关部分中指定其他选项:-
[ipaservers]
部分中服务器的 FQDN,用于指示客户端将注册到哪个 IdM 服务器 以下两个选项之一:
-
[ipaclients:vars]
部分中的ipaclient_domain
选项,用来指示客户端将注册到的 IdM 服务器的 DNS 域名 [ipaclients:vars]
部分中的ipaclient_realm
选项,用于指示 IdM 服务器控制的 Kerberos 域的名称带有客户端 FQDN、服务器 FQDN 和定义的域的清单主机文件示例
[ipaclients] client.idm.example.com [ipaservers] server.idm.example.com [ipaclients:vars] ipaclient_domain=idm.example.com [...]
[ipaclients] client.idm.example.com [ipaservers] server.idm.example.com [ipaclients:vars] ipaclient_domain=idm.example.com [...]
Copy to Clipboard Copied!
-
-
指定注册客户端的凭证。可用的验证方法如下:
注册 客户端的用户权限的密码。这是默认选项。
使用 Ansible Vault 来存储密码,并从 playbook 文件(如
install-client.yml
)中引用 Vault 文件:使用来自清单文件和 Ansible Vault 文件中的密码的主体的 playbook 文件示例
- name: Playbook to configure IPA clients with username/password hosts: ipaclients become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipaclient state: present
- name: Playbook to configure IPA clients with username/password hosts: ipaclients become: true vars_files: - playbook_sensitive_data.yml roles: - role: freeipa.ansible_freeipa.ipaclient state: present
Copy to Clipboard Copied!
不太安全的是,使用
inventory/hosts
文件的[ipaclients:vars]
部分中的ipaadmin_password
选项提供admin
的凭证。或者,指定不同的授权用户,请使用ipaadmin_principal
选项作为用户名,使用ipaadmin_password
选项作为密码。install-client.yml
playbook 文件类似如下:清单主机文件示例
[...] [ipaclients:vars] ipaadmin_principal=my_admin ipaadmin_password=Secret123
[...] [ipaclients:vars] ipaadmin_principal=my_admin ipaadmin_password=Secret123
Copy to Clipboard Copied! 使用清单文件中的主体和密码的 Playbook 示例
- name: Playbook to unconfigure IPA clients hosts: ipaclients become: true roles: - role: freeipa.ansible_freeipa.ipaclient state: true
- name: Playbook to unconfigure IPA clients hosts: ipaclients become: true roles: - role: freeipa.ansible_freeipa.ipaclient state: true
Copy to Clipboard Copied! 之前注册的客户端 keytab,如果仍然可用:
如果系统之前作为身份管理客户端注册,则可以使用这个选项。要使用此身份验证方法,请取消
ipaclient_keytab
选项的注释,指定存储 keytab 的文件的路径,例如在inventory/hosts
的[ipaclient:vars]
部分。在注册过程中生成的随机一次性密码 (OTP)。要使用此身份验证方法,请在清单文件中使用
ipaclient_use_otp=true
选项。例如,您可以取消inventory/hosts
文件的[ipaclients:vars]
部分中的#ipaclient_use_otp=true
选项的注释。请注意,对于 OTP,还必须指定以下选项之一:-
授权注册客户端的用户的密码 ,例如,为
inventory/hosts
文件的[ipaclients:vars]
部分的ipaadmin_password
提供值。 -
admin keytab,例如,为
inventory/hosts
的[ipaclients:vars]
部分中的ipaadmin_keytab
提供值。
-
授权注册客户端的用户的密码 ,例如,为
-
您还可以指定
ipaclient_subid: true
选项,使为 IdM 级别上的 IdM 用户配置了子范围。
4.3. 使用 Ansible playbook 进行 IdM 客户端注册的授权选项
您可以使用以下任一方法授权 IdM 客户端注册:
- 一个随机的一次性密码(OTP)+ 管理员密码
- 一个随机的一次性密码(OTP)+ admin keytab
- 之前注册中的客户端 keytab
-
授权注册客户端的用户 (
admin
) 的密码存储在清单文件中 -
授权注册客户端的用户(
admin
) 的密码存储在 Ansible vault 中
在 IdM 客户端安装之前,可以由 IdM 管理员生成 OTP。在这种情况下,除 OTP 本身以外,您不需要用于安装的任何凭证。
以下是用于这些方法的清单文件示例:
授权选项 | 清单文件 |
---|---|
一个随机的一次性密码(OTP)+ 管理员密码 |
[ipaclients:vars] ipaadmin_password=Secret123 ipaclient_use_otp=true
|
一个随机的一次性密码(OTP) |
[ipaclients:vars] ipaclient_otp=<W5YpARl=7M.>
这个场景假定 OTP 已在安装前由 IdM |
一个随机的一次性密码(OTP)+ admin keytab |
[ipaclients:vars] ipaadmin_keytab=/root/admin.keytab ipaclient_use_otp=true
|
之前注册的客户端 keytab |
[ipaclients:vars] ipaclient_keytab=/root/krb5.keytab
|
|
[ipaclients:vars] ipaadmin_password=Secret123
|
|
[ipaclients:vars] [...]
|
如果您使用存储在 Ansible vault 文件中的 admin
用户的密码,则相应的 playbook 文件必须有一个额外的 vars_files
指令:
Inventory 文件 | Playbook 文件 |
---|---|
[ipaclients:vars] [...]
|
- name: Playbook to configure IPA clients hosts: ipaclients become: true vars_files: - ansible_vault_file.yml roles: - role: freeipa.ansible_freeipa.ipaclient state: present
|
在上述所有其他授权场景中,基本的 playbook 文件类似如下:
- name: Playbook to configure IPA clients hosts: ipaclients become: true roles: - role: freeipa.ansible_freeipa.ipaclient state: true
- name: Playbook to configure IPA clients
hosts: ipaclients
become: true
roles:
- role: freeipa.ansible_freeipa.ipaclient
state: true
在上述两个 OTP 授权场景中,使用 kinit
命令在第一个指定或发现的 IdM 服务器上发生管理员 TGT 的请求。因此,不需要对 Ansible 控制节点进行额外的修改。
4.4. 使用 Ansible playbook 部署 IdM 客户端
完成此流程,使用 Ansible playbook 在 IdM 环境中部署 IdM 客户端。
先决条件
- 受管节点是一个具有静态 IP 地址和可正常工作的软件包管理器的 Red Hat Enterprise Linux 10 系统。
您已设置了 IdM 客户端部署的参数,以对应您的部署场景:
流程
运行 Ansible playbook:
ansible-playbook -v -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-client.yml
$ ansible-playbook -v -i ~/MyPlaybooks/inventory ~/MyPlaybooks/install-client.yml
Copy to Clipboard Copied!
4.5. 在 Ansible 中使用一次性密码方法来安装 IdM 客户端
您可以为 RHEL Identity Management (IdM)中的新主机生成一次性密码(OTP),并使用它来将系统注册到 IdM 域中。此流程描述了在一台 IdM 主机上为其生成一个 OTP 后,如何使用 Ansible 来安装 IdM 客户端。
如果机构中存在具有不同特权的两个系统管理员,则这个安装 IdM 客户端的方法非常方便:
- 一个有 IdM 管理员凭证。
-
另一个有所需的 Ansible 凭证,包括对要成为 IdM 客户端的主机的
root
访问权限。
IdM 管理员执行流程的第一部分,其中 OTP 密码已生成。Ansible 管理员执行流程的剩余部分,其中 OTP 用于安装 IdM 客户端。
先决条件
-
您有 IdM
admin
凭证或至少Host Enrollment
特权以及在 IdM 中添加 DNS 记录的权限。 - 您已在 Ansible 受管节点上配置了一个用户升级方法,以允许您安装 IdM 客户端。
- 如果您的 Ansible 控制节点在 RHEL 8.7 或更早版本上运行,则您必须能够在 Ansible 控制节点上安装软件包。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 受管节点是一个具有静态 IP 地址和可正常工作的软件包管理器的 Red Hat Enterprise Linux 10 系统。
流程
以具有
Host Enrollment
特权和添加 DNS 记录权限的 IdM 用户的身份SSH
到 IdM 主机:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com
Copy to Clipboard Copied! 为新客户端生成一个 OTP:
ipa host-add client.idm.example.com --ip-address=172.25.250.11 --random
[admin@server ~]$ ipa host-add client.idm.example.com --ip-address=172.25.250.11 --random -------------------------------------------------- Added host "client.idm.example.com" -------------------------------------------------- Host name: client.idm.example.com Random password: W5YpARl=7M.n Password: True Keytab: False Managed by: server.idm.example.com
Copy to Clipboard Copied! --ip-address=<your_host_ip_address> 选项将主机添加到具有指定 IP 地址的 IdM DNS 中。
退出 IdM 主机:
exit
$ exit logout Connection to server.idm.example.com closed.
Copy to Clipboard Copied! 在 ansible 控制器上,更新清单文件以包含随机密码:
[...] [ipaclients] client.idm.example.com [ipaclients:vars] ipaclient_domain=idm.example.com ipaclient_otp=W5YpARl=7M.n [...]
[...] [ipaclients] client.idm.example.com [ipaclients:vars] ipaclient_domain=idm.example.com ipaclient_otp=W5YpARl=7M.n [...]
Copy to Clipboard Copied! 运行 playbook 来安装客户端:
ansible-playbook -i inventory install-client.yml
$ ansible-playbook -i inventory install-client.yml
Copy to Clipboard Copied!
4.6. Ansible 安装后测试 RHEL 身份管理客户端
命令行(CLI)告知您 ansible-playbook
命令成功,但您也可以进行自己的测试。
要测试 RHEL 身份管理客户端是否可以获取服务器上定义的用户的信息,请检查您是否能够解析服务器上定义的用户。例如,检查默认的 admin
用户:
id admin
[user@client1 ~]$ id admin
uid=1254400000(admin) gid=1254400000(admins) groups=1254400000(admins)
要测试身份验证是否正常工作,请 su -
为另一个已存在的 IdM 用户:
su - idm_user
[user@client1 ~]$ su - idm_user
Last login: Thu Oct 18 18:39:11 CEST 2018 from 192.168.122.1 on pts/0
[idm_user@client1 ~]$
4.7. 使用 Ansible playbook 卸载 IdM 客户端
完成此流程,使用 Ansible playbook 将主机卸载为 IdM 客户端。
先决条件
- IdM 管理员凭证。
- 受管节点是一个具有静态 IP 地址的 Red Hat Enterprise Linux 10 系统。
流程
运行带有卸载客户端指令的 Ansible playbook ,如
uninstall-client.yml
:ansible-playbook -v -i ~/MyPlaybooks/inventory ~/MyPlaybooks/uninstall-client.yml
$ ansible-playbook -v -i ~/MyPlaybooks/inventory ~/MyPlaybooks/uninstall-client.yml
Copy to Clipboard Copied!
卸载客户端只从主机中删除基本的 IdM 配置,但会在主机上保留配置文件,以防您决定重新安装客户端。另外,卸载有以下限制:
- 它不会从 IdM LDAP 服务器中删除客户端主机条目。卸载仅是将主机取消注册。
- 它不会从 IdM 中删除任何位于客户端的服务。
- 它不会从 IdM 服务器中删除客户端的 DNS 条目。
-
它不会删除
/etc/krb5.keytab
之外的 keytab 的旧主体。
请注意,卸载会删除 IdM CA 为主机发布的所有证书。
第 5 章 准备您的环境以使用 Ansible playbook 管理 IdM
作为管理 RHEL 身份管理(IdM)的系统管理员,在使用 Ansible 时,最好执行以下操作:
- 在您的主目录中保留专用于 Ansible playbook 的子目录,如 ~/MyPlaybooks。
-
将示例 Ansible playbook 从
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa configured
和/usr/share/doc/rhel-system-roles
Optimizer 目录和子目录复制到 ~/MyPlaybooks 目录中。 - 将清单文件包含在 ~/MyPlaybooks 目录中。
使用这个实践,您可以在一个地方找到所有 playbook。
您可以在受管节点上运行 ansible-freeipa
playbook,而无需调用 root
特权。例外包括使用 ipaserver
、ipareplica
、ipaclient
、ipasmartcard_server
、ipasmartcard_client
和 ipabackup
ansible-freeipa
角色的 playbook。这些角色需要具有目录和 dnf
软件包管理器的特权访问权限。
Red Hat Enterprise Linux IdM 文档中的 playbook 假设以下 安全配置 :
-
IdM
admin
是受管节点上的远程 Ansible 用户。 -
您可以将 IdM
admin
密码加密存储在 Ansible vault 中。 - 您已将保护 Ansible vault 的密码放置在密码文件中。
- 您阻止除本地 ansible 用户以外的任何人访问 vault 密码文件。
- 您定期删除并重新创建 vault 密码文件。
还要考虑 其他的安全配置。
5.1. 使用 Ansible playbook 准备控制节点和受管节点以管理 IdM
按照以下流程创建 ~/MyPlaybooks 目录并进行配置,以便您可以使用它来存储和运行 Ansible playbook。
先决条件
- 您已在受管节点上安装了 IdM 服务器 server.idm.example.com 和 replica.idm.example.com。
- 您已配置了 DNS 和网络,以便您可以直接从控制节点登录到受管节点 server.idm.example.com 和 replica.idm.example.com。
-
您需要知道 IdM
admin
密码。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks
$ cd ~/MyPlaybooks
Copy to Clipboard Copied! 使用以下内容创建 ~/MyPlaybooks/ansible.cfg 文件:
[defaults] inventory = /home/your_username/MyPlaybooks/inventory remote_user = admin
[defaults] inventory = /home/your_username/MyPlaybooks/inventory remote_user = admin
Copy to Clipboard Copied! 使用以下内容创建 ~/MyPlaybooks/inventory 文件:
[eu] server.idm.example.com [us] replica.idm.example.com [ipaserver:children] eu us
[eu] server.idm.example.com [us] replica.idm.example.com [ipaserver:children] eu us
Copy to Clipboard Copied! 此配置定义了两个主机组,即 eu 和 us,用于这些位置中的主机。此外,此配置定义了 ipaserver 主机组,它包含来自 eu 和 us 组的所有主机。
可选:创建一个 SSH 公钥和私钥。要在测试环境中简化访问,请不要在私钥中设置密码:
ssh-keygen
$ ssh-keygen
Copy to Clipboard Copied! 将 SSH 公钥复制到每个受管节点上的 IdM
admin
帐户:ssh-copy-id admin@server.idm.example.com ssh-copy-id admin@replica.idm.example.com
$ ssh-copy-id admin@server.idm.example.com $ ssh-copy-id admin@replica.idm.example.com
Copy to Clipboard Copied! 这些命令要求您输入 IdM
admin
密码。创建一个包含 vault 密码的 password_file 文件:
redhat
redhat
Copy to Clipboard Copied! 更改权限以修改文件:
chmod 0600 password_file
$ chmod 0600 password_file
Copy to Clipboard Copied! 创建一个 secret.yml Ansible vault 来存储 IdM
admin
密码:配置 password_file 以存储 vault 密码:
ansible-vault create --vault-password-file=password_file secret.yml
$ ansible-vault create --vault-password-file=password_file secret.yml
Copy to Clipboard Copied! 出现提示时,输入 secret.yml 文件的内容:
ipaadmin_password: Secret123
ipaadmin_password: Secret123
Copy to Clipboard Copied!
要在 playbook 中使用加密的 ipaadmin_password
,您必须使用 vars_file
指令。例如,一个删除 IdM 用户的简单 playbook 如下所示:
--- - name: Playbook to handle users hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Delete user robot freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" name: robot state: absent
---
- name: Playbook to handle users
hosts: ipaserver
vars_files:
- /home/user_name/MyPlaybooks/secret.yml
tasks:
- name: Delete user robot
freeipa.ansible_freeipa.ipauser:
ipaadmin_password: "{{ ipaadmin_password }}"
name: robot
state: absent
在执行 playbook 时,通过添加 --vault-password-file=password_file
选项来指示 Ansible 使用 vault 密码来解密 ipaadmin_password
。例如:
ansible-playbook -i inventory --vault-password-file=password_file del-user.yml
ansible-playbook -i inventory --vault-password-file=password_file del-user.yml
为安全起见,在每次会话结束时删除 vault 密码文件,并在每个新会话开始时重复步骤 6-8。
5.2. 为 ansible-freeipa playbook 提供所需凭证的不同方法
用于提供运行使用 ansible-freeipa
角色和模块的 playbook 所需的凭证的不同的方法有各自的优缺点。
将密码以纯文本形式存储在 playbook 中
优点 :
- 运行 playbook 时,不会一直提示。
- 易于实现。
缺点 :
- 有权访问该文件的人都可以读取密码。设置错误的权限并共享文件(例如在内部或外部存储库中)都可能会破坏安全性。
- 高维护性工作:如果更改了密码,则需要在所有 playbook 中进行更改。
执行 playbook 时以交互方式输入密码
优点 :
- 无人可以窃取密码,因为它不存储在任何地方。
- 您可以轻松地更新密码。
- 易于实现。
缺点 :
- 如果您在脚本中使用 Ansible playbook,要求以交互方式输入密码可能不太方便。
将密码存储在 Ansible vault 中,将 vault 密码存储在文件中:
优点 :
- 用户密码以加密方式存储。
- 您可以通过创建一个新的 Ansible vault 来轻松地更新用户密码。
-
您可以使用
ansible-vault rekey --new-vault-password-file=NEW_VAULT_PASSWORD_FILE secret.yml
命令轻松地更新保护 ansible vault 的密码文件。 - 如果您在脚本中使用 Ansible playbook,则不以交互方式输入保护 Ansible vault 的密码很方便。
缺点 :
- 通过文件权限和其他安全措施保护包含敏感纯文本密码的文件很重要。
将密码存储在 Ansible vault中,并以交互方式输入 vault 密码
优点 :
- 用户密码以加密方式存储。
- 无人可以窃取 vault 密码,因为它不存储在任何地方。
- 您可以通过创建一个新的 Ansible vault 来轻松地更新用户密码。
-
您还可以使用
ansible-vault rekey file_name
命令轻松地更新 vault 密码。
缺点 :
- 如果您在脚本中使用 Ansible playbook,则需要以交互方式输入 vault 密码很不方便。
第 6 章 使用 Ansible playbook 备份和恢复 IdM 服务器
使用 ipabackup
Ansible 角色,您可以自动备份 IdM 服务器,在服务器和 Ansible 控制器之间传输备份文件,并从备份中恢复 IdM 服务器。
6.1. 使用 Ansible 创建 IdM 服务器的备份
您可以在 Ansible playbook 中使用 ipabackup
角色创建 IdM 服务器的备份,并将其存储在 IdM 服务器上。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入
~/MyPlaybooks/
目录:cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks
目录中的backup-server.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/backup-server.yml backup-my-server.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/backup-server.yml backup-my-server.yml
Copy to Clipboard Copied! -
打开
backup-my-server.yml
Ansible playbook 文件以进行编辑。 通过将您的清单文件中的
hosts
变量设置为主机组来调整 文件。在本例中,将其设置为ipaserver
主机组:--- - name: Playbook to backup IPA server hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipabackup state: present
--- - name: Playbook to backup IPA server hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipabackup state: present
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook,指定清单文件和 playbook 文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory backup-my-server.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory backup-my-server.yml
Copy to Clipboard Copied!
验证
- 登录到您备份的 IdM 服务器。
验证备份是否位于
/var/lib/ipa/backup
目录中。ls /var/lib/ipa/backup/
[root@server ~]# ls /var/lib/ipa/backup/ ipa-full-2021-04-30-13-12-00
Copy to Clipboard Copied!
6.2. 使用 Ansible 在 Ansible 控制器上创建 IdM 服务器的备份
您可以在 Ansible playbook 中使用 ipabackup
角色创建 IdM 服务器的备份,并在 Ansible 控制器上自动传输它。您的备份文件名以 IdM 服务器的主机名开头。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
若要存储备份,请在 Ansible 控制器上的主目录中创建一个子目录。
mkdir ~/ipabackups
$ mkdir ~/ipabackups
Copy to Clipboard Copied! 进入
~/MyPlaybooks/
目录:cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/playbooks 目录中的
backup-server-to-controller.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/backup-server-to-controller.yml backup-my-server-to-my-controller.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/backup-server-to-controller.yml backup-my-server-to-my-controller.yml
Copy to Clipboard Copied! -
打开
backup-my-server-to-my-controller.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将
hosts
变量设置为清单文件中的主机组。在本例中,将它设置为ipaserver
主机组。 可选:要在 IdM 服务器上维护备份的副本,请取消以下行的注释:
ipabackup_keep_on_server: true
# ipabackup_keep_on_server: true
Copy to Clipboard Copied!
-
将
默认情况下,备份存储在 Ansible 控制器的当前工作目录中。要指定在第 1 步中创建的备份目录,请添加
ipabackup_controller_path
变量并将其设置为/home/user/ipabackups
目录。--- - name: Playbook to backup IPA server to controller hosts: ipaserver become: true vars: ipabackup_to_controller: true # ipabackup_keep_on_server: true ipabackup_controller_path: /home/user/ipabackups roles: - role: freeipa.ansible_freeipa.ipabackup state: present
--- - name: Playbook to backup IPA server to controller hosts: ipaserver become: true vars: ipabackup_to_controller: true # ipabackup_keep_on_server: true ipabackup_controller_path: /home/user/ipabackups roles: - role: freeipa.ansible_freeipa.ipabackup state: present
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook,指定清单文件和 playbook 文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory backup-my-server-to-my-controller.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory backup-my-server-to-my-controller.yml
Copy to Clipboard Copied!
验证
验证备份是否位于 Ansible 控制器的
/home/user/ipabackups
目录中:ls /home/user/ipabackups
[user@controller ~]$ ls /home/user/ipabackups server.idm.example.com_ipa-full-2021-04-30-13-12-00
Copy to Clipboard Copied!
6.3. 使用 Ansible 将 IdM 服务器的备份复制到 Ansible 控制器
您可以使用 Ansible playbook 将 IdM 服务器的备份从 IdM 服务器复制到 Ansible 控制器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
若要存储备份,请在 Ansible 控制器上的主目录中创建一个子目录。
mkdir ~/ipabackups
$ mkdir ~/ipabackups
Copy to Clipboard Copied! 进入
~/MyPlaybooks/
目录:cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/playbooks 目录中的
copy-backup-from-server.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/copy-backup-from-server.yml copy-backup-from-my-server-to-my-controller.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/copy-backup-from-server.yml copy-backup-from-my-server-to-my-controller.yml
Copy to Clipboard Copied! -
打开
copy-my-backup-from-my-server-to-my-controller.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将
hosts
变量设置为清单文件中的主机组。在本例中,将它设置为ipaserver
主机组。 -
将
ipabackup_name
变量设置为 IdM 服务器上的ipabackup
的名称,以复制到您的 Ansible 控制器。 默认情况下,备份存储在 Ansible 控制器的当前工作目录中。要指定在第 1 步中创建的目录,请添加
ipabackup_controller_path
变量并将其设置为/home/user/ipabackups
目录。--- - name: Playbook to copy backup from IPA server hosts: ipaserver become: true vars: ipabackup_name: ipa-full-2021-04-30-13-12-00 ipabackup_to_controller: true ipabackup_controller_path: /home/user/ipabackups roles: - role: freeipa.ansible_freeipa.ipabackup state: present
--- - name: Playbook to copy backup from IPA server hosts: ipaserver become: true vars: ipabackup_name: ipa-full-2021-04-30-13-12-00 ipabackup_to_controller: true ipabackup_controller_path: /home/user/ipabackups roles: - role: freeipa.ansible_freeipa.ipabackup state: present
Copy to Clipboard Copied!
-
将
- 保存该文件。
运行 Ansible playbook,指定清单文件和 playbook 文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory copy-backup-from-my-server-to-my-controller.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory copy-backup-from-my-server-to-my-controller.yml
Copy to Clipboard Copied!
要将所有 IdM 备份复制到控制器,请将 Ansible playbook 中的 ipabackup_name
变量设置为 all
:
vars: ipabackup_name: all ipabackup_to_controller: true
vars:
ipabackup_name: all
ipabackup_to_controller: true
例如,请参阅 /usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/playbooks 目录中的
copy-all-backups-from-server.yml
Ansible playbook。
验证
验证备份是否位于 Ansible 控制器上的
/home/user/ipabackups
目录中:ls /home/user/ipabackups
[user@controller ~]$ ls /home/user/ipabackups server.idm.example.com_ipa-full-2021-04-30-13-12-00
Copy to Clipboard Copied!
6.4. 使用 Ansible 将 IdM 服务器的备份从 Ansible 控制器复制到 IdM 服务器
您可以使用 Ansible playbook 将 IdM 服务器的备份从 Ansible 控制器复制到 IdM 服务器。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入
~/MyPlaybooks/
目录:cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/playbooks 目录中的
copy-backup-from-controller.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/copy-backup-from-controller.yml copy-backup-from-my-controller-to-my-server.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/copy-backup-from-controller.yml copy-backup-from-my-controller-to-my-server.yml
Copy to Clipboard Copied! -
打开
copy-my-backup-from-my-controller-to-my-server.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将
hosts
变量设置为清单文件中的主机组。在本例中,将它设置为ipaserver
主机组。 将
ipabackup_name
变量设置为 Ansible 控制器上ipabackup
的名称,以复制到 IdM 服务器。--- - name: Playbook to copy a backup from controller to the IPA server hosts: ipaserver become: true vars: ipabackup_name: server.idm.example.com_ipa-full-2021-04-30-13-12-00 ipabackup_from_controller: true roles: - role: freeipa.ansible_freeipa.ipabackup state: copied
--- - name: Playbook to copy a backup from controller to the IPA server hosts: ipaserver become: true vars: ipabackup_name: server.idm.example.com_ipa-full-2021-04-30-13-12-00 ipabackup_from_controller: true roles: - role: freeipa.ansible_freeipa.ipabackup state: copied
Copy to Clipboard Copied!
-
将
- 保存该文件。
运行 Ansible playbook,指定清单文件和 playbook 文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory copy-backup-from-my-controller-to-my-server.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory copy-backup-from-my-controller-to-my-server.yml
Copy to Clipboard Copied!
6.5. 使用 Ansible 从 IdM 服务器中删除备份
您可以使用 Ansible playbook 从 IdM 服务器中删除备份。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/playbooks 目录中的
remove-backup-from-server.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/remove-backup-from-server.yml remove-backup-from-my-server.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/remove-backup-from-server.yml remove-backup-from-my-server.yml
Copy to Clipboard Copied! -
打开
remove-backup-from-my-server.yml
文件以进行编辑。 通过设置以下变量来调整文件:
-
将
hosts
变量设置为清单文件中的主机组。在本例中,将它设置为ipaserver
主机组。 将
ipabackup_name
变量设置为ipabackup
的名称,以从 IdM 服务器中删除。--- - name: Playbook to remove backup from IPA server hosts: ipaserver become: true vars: ipabackup_name: ipa-full-2021-04-30-13-12-00 roles: - role: freeipa.ansible_freeipa.ipabackup state: absent
--- - name: Playbook to remove backup from IPA server hosts: ipaserver become: true vars: ipabackup_name: ipa-full-2021-04-30-13-12-00 roles: - role: freeipa.ansible_freeipa.ipabackup state: absent
Copy to Clipboard Copied!
-
将
- 保存该文件。
运行 Ansible playbook,指定清单文件和 playbook 文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory remove-backup-from-my-server.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory remove-backup-from-my-server.yml
Copy to Clipboard Copied!
要从 IdM 服务器中删除所有 IdM 备份,将 Ansible playbook 中的 ipabackup_name
变量设置为 all
:
vars: ipabackup_name: all
vars:
ipabackup_name: all
例如,请参阅 /usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/playbooks 目录中的
remove-all-backups-from-server.yml
Ansible playbook。
6.6. 使用 Ansible 从服务器中存储的备份中恢复 IdM 服务器
您可以使用 Ansible playbook ,从存储在该主机上的备份恢复 IdM 服务器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您知道 LDAP Directory Manager 密码。
流程
进入
~/MyPlaybooks/
目录:cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 在
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks 目录中生成
restore-server.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/restore-server.yml restore-my-server.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/restore-server.yml restore-my-server.yml
Copy to Clipboard Copied! -
打开
restore-my-server.yml
Ansible playbook 文件以进行编辑。 通过设置以下变量来调整文件:
-
将
hosts
变量设置为清单文件中的主机组。在本例中,将它设置为ipaserver
主机组。 -
将
ipabackup_name
变量设置为要恢复的ipabackup
的名称。 将
ipabackup_password
变量设置为 LDAP Directory Manager 密码。--- - name: Playbook to restore an IPA server hosts: ipaserver become: true vars: ipabackup_name: ipa-full-2021-04-30-13-12-00 ipabackup_password: <your_LDAP_DM_password> roles: - role: freeipa.ansible_freeipa.ipabackup state: restored
--- - name: Playbook to restore an IPA server hosts: ipaserver become: true vars: ipabackup_name: ipa-full-2021-04-30-13-12-00 ipabackup_password: <your_LDAP_DM_password> roles: - role: freeipa.ansible_freeipa.ipabackup state: restored
Copy to Clipboard Copied!
-
将
- 保存该文件。
运行指定清单文件和 playbook 文件的 Ansible playbook:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory restore-my-server.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory restore-my-server.yml
Copy to Clipboard Copied!
6.7. 使用 Ansible 从 Ansible 控制器中存储的备份中恢复 IdM 服务器
您可以使用 Ansible playbook ,从存储在 Ansible 控制器上的备份恢复 IdM 服务器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您知道 LDAP Directory Manager 密码。
流程
进入
~/MyPlaybooks/
目录:cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/playbooks 目录中的
restore-server-from-controller.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/restore-server-from-controller.yml restore-my-server-from-my-controller.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/restore-server-from-controller.yml restore-my-server-from-my-controller.yml
Copy to Clipboard Copied! -
打开
restore-my-server-from-my-controller.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将
hosts
变量设置为清单文件中的主机组。在本例中,将它设置为ipaserver
主机组。 -
将
ipabackup_name
变量设置为要恢复的ipabackup
的名称。 将
ipabackup_password
变量设置为 LDAP Directory Manager 密码。--- - name: Playbook to restore IPA server from controller hosts: ipaserver become: true vars: ipabackup_name: server.idm.example.com_ipa-full-2021-04-30-13-12-00 ipabackup_password: <your_LDAP_DM_password> ipabackup_from_controller: true roles: - role: freeipa.ansible_freeipa.ipabackup state: restored
--- - name: Playbook to restore IPA server from controller hosts: ipaserver become: true vars: ipabackup_name: server.idm.example.com_ipa-full-2021-04-30-13-12-00 ipabackup_password: <your_LDAP_DM_password> ipabackup_from_controller: true roles: - role: freeipa.ansible_freeipa.ipabackup state: restored
Copy to Clipboard Copied!
-
将
- 保存该文件。
运行 Ansible playbook,指定清单文件和 playbook 文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory restore-my-server-from-my-controller.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory restore-my-server-from-my-controller.yml
Copy to Clipboard Copied!
第 7 章 使用 Ansible playbook 配置全局 IdM 设置
使用 Ansible config
模块,您可以检索和设置 Identity Management (IdM) 的全局配置参数。
7.1. 使用 Ansible playbook 检索 IdM 配置
以下流程描述了如何使用 Ansible playbook 来检索有关当前全局 IdM 配置的信息。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
[可选] 查看
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/config/retrieve-config.yml
Ansible playbook 文件:--- - name: Playbook to handle global IdM configuration hosts: ipaserver become: no gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Query IPA global configuration freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" register: serverconfig - debug: msg: "{{ serverconfig }}"
--- - name: Playbook to handle global IdM configuration hosts: ipaserver become: no gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Query IPA global configuration freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" register: serverconfig - debug: msg: "{{ serverconfig }}"
Copy to Clipboard Copied! 运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/config/retrieve-config.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/config/retrieve-config.yml [...] TASK [debug] ok: [server.idm.example.com] => { "msg": { "ansible_facts": { "discovered_interpreter_ }, "changed": false, "config": { "ca_renewal_master_server": "server.idm.example.com", "configstring": [ "AllowNThash", "KDC:Disable Last Success" ], "defaultgroup": "ipausers", "defaultshell": "/bin/bash", "emaildomain": "idm.example.com", "enable_migration": false, "groupsearch": [ "cn", "description" ], "homedirectory": "/home", "maxhostname": "64", "maxusername": "64", "pac_type": [ "MS-PAC", "nfs:NONE" ], "pwdexpnotify": "4", "searchrecordslimit": "100", "searchtimelimit": "2", "selinuxusermapdefault": "unconfined_u:s0-s0:c0.c1023", "selinuxusermaporder": [ "guest_u:s0$xguest_u:s0$user_ ], "usersearch": [ "uid", "givenname", "sn", "telephonenumber", "ou", "title" ] }, "failed": false } }
Copy to Clipboard Copied!
7.2. 使用 Ansible playbook 配置 IdM CA 续订服务器
在使用嵌入式证书颁发机构 (CA) 的 Identity Management (IdM) 部署中,CA 续订服务器维护并更新 IdM 系统证书。它确保了强大的 IdM 部署。
有关 IdM CA 续订服务器角色的详情,请参阅 使用 IdM CA 续订服务器。
以下流程描述了如何使用 Ansible playbook 配置 IdM CA 续订服务器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
可选:识别当前 IdM CA 续订服务器:
ipa config-show | grep 'CA renewal'
$ ipa config-show | grep 'CA renewal' IPA CA renewal master: server.idm.example.com
Copy to Clipboard Copied! 打开
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/config/set-ca-renewal-master-server.yml
Ansible playbook 文件进行编辑:--- - name: Playbook to handle global DNS configuration hosts: ipaserver become: no gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: set ca_renewal_master_server freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" ca_renewal_master_server: carenewal.idm.example.com
--- - name: Playbook to handle global DNS configuration hosts: ipaserver become: no gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: set ca_renewal_master_server freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" ca_renewal_master_server: carenewal.idm.example.com
Copy to Clipboard Copied! -
使用
ca_renewal_master_server
变量设置 CA 续订服务器的名称。 - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/config/set-ca-renewal-master-server.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/config/set-ca-renewal-master-server.yml
Copy to Clipboard Copied!
验证
您可以验证 CA 续订服务器是否已更改:
以 IdM 管理员身份登录到
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 请求 IdM CA 续订服务器的身份:
ipa config-show | grep ‘CA renewal'
$ ipa config-show | grep ‘CA renewal' IPA CA renewal master: carenewal02.idm.example.com
Copy to Clipboard Copied! 输出显示 watchnewal.idm.example.com 服务器是新的 CA 续订服务器。
7.3. 使用 Ansible playbook 为 IdM 用户配置默认 shell
shell 是一个接受和解释命令的程序。Red Hat Enterprise Linux (RHEL) 中提供了多个 shell,如 bash
、sh
、ksh
、zsh
、fish
等。Bash
或 /bin/bash
是大多数 Linux 系统中常用的 shell,它通常是 RHEL 上用户帐户的默认 shell。
以下流程描述了如何使用 Ansible playbook 将 sh
(替代 shell)配置为 IdM 用户的默认 shell。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
-
可选: 使用
retrieve-config.yml
Ansible playbook 来识别 IdM 用户的当前 shell。详情请参阅 使用 Ansible playbook 检索 IdM 配置。 打开
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/config/ensure-config-options-are-set.yml
Ansible playbook 文件进行编辑:--- - name: Playbook to ensure some config options are set hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Set defaultlogin and maxusername - freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" defaultshell: /bin/bash maxusername: 64
--- - name: Playbook to ensure some config options are set hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Set defaultlogin and maxusername - freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" defaultshell: /bin/bash maxusername: 64
Copy to Clipboard Copied! -
使用
defaultshell
变量,将 IdM 用户的默认 shell 设置为/bin/sh
。 - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/config/ensure-config-options-are-set.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/config/ensure-config-options-are-set.yml
Copy to Clipboard Copied!
验证
您可以通过在 IdM 中启动一个新会话来验证默认用户 shell 是否已更改:
以 IdM 管理员身份登录到
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示当前的 shell:
echo "$SHELL"
[admin@server /]$ echo "$SHELL" /bin/sh
Copy to Clipboard Copied! 登录用户正在使用
sh
shell。
7.4. 使用 Ansible 为 IdM 域配置 NetBIOS 名称
NetBIOS 名称用于 Microsoft Windows (SMB)类型的共享和消息。您可以使用 NetBIOS 名称来映射驱动器或连接到打印机。
按照以下步骤,使用 Ansible playbook 为 RHEL 身份管理(IdM)域配置 NetBIOS 名称。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! - 创建一个 netbios-domain-name-present.yml Ansible playbook 文件。
在文件中添加以下内容:
--- - name: Playbook to change IdM domain netbios name hosts: ipaserver become: no gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Set IdM domain netbios name freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" netbios_name: IPADOM
--- - name: Playbook to change IdM domain netbios name hosts: ipaserver become: no gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Set IdM domain netbios name freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" netbios_name: IPADOM
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory netbios-domain-name-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory netbios-domain-name-present.yml
Copy to Clipboard Copied! 出现提示时,提供 vault 文件密码。
7.5. 使用 Ansible 确保 IdM 用户和组有 SID
RHEL 身份管理(IdM)服务器可以根据本地域的 ID 范围中的数据,在内部为 IdM 用户和组分配唯一的安全标识符(SID)。SID 存储在用户和组对象中。
确保 IdM 用户和组有 SID 的目的是允许生成特权属性证书(PAC),这是 IdM-IdM 信任的第一步。如果 IdM 用户和组有 SID,IdM 可以发布带有 PAC 数据的 Kerberos 票据。
按照以下流程实现以下目标:
- 为已存在的 IdM 用户和用户组生成 SID。
- 为 IdM 新用户和组启用 SID 生成。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! - 创建一个 sids-for-users-and-groups-present.yml Ansible playbook 文件。
在文件中添加以下内容:
--- - name: Playbook to ensure SIDs are enabled and users and groups have SIDs hosts: ipaserver become: no gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Enable SID and generate users and groups SIDS freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" enable_sid: true add_sids: true
--- - name: Playbook to ensure SIDs are enabled and users and groups have SIDs hosts: ipaserver become: no gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Enable SID and generate users and groups SIDS freeipa.ansible_freeipa.ipaconfig: ipaadmin_password: "{{ ipaadmin_password }}" enable_sid: true add_sids: true
Copy to Clipboard Copied! enable_sid
变量为将来的 IdM 用户和组启用 SID 生成。add_sids
变量为现有的 IdM 用户和组生成 SID。注意使用
add_sids: true
时,您还必须将enable_sid
变量设置为true
。- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory sids-for-users-and-groups-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory sids-for-users-and-groups-present.yml
Copy to Clipboard Copied! 出现提示时,提供 vault 文件密码。
第 8 章 使用 Ansible playbook 管理用户帐户
您可以使用 Ansible playbook 管理 IdM 中的用户。在介绍了用户生命周期后,本章将介绍如何将 Ansible playbook 用于以下操作:
8.1. 用户生命周期
身份管理(IdM)支持三个用户帐户状态: Stage、Active、Preserved。详情请参阅 管理 IdM 用户、组、主机和访问控制规则 文档中的用户生命周期 部分。
8.2. 使用 Ansible playbook 确保存在一个 IdM 用户
以下流程描述了确保使用 Ansible playbook 在 IdM 中存在用户。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建一个 Ansible playbook 文件,其中包含您要确保的 IdM 中存在的用户数据。要简化此步骤,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/user/add-user.yml
文件中的示例。例如,创建名为 idm_user 的用户并添加 Password123 作为用户密码:--- - name: Playbook to handle users hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Create user idm_user freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" name: idm_user first: Alice last: Acme uid: 1000111 gid: 10011 phone: "+555123457" email: idm_user@acme.com passwordexpiration: "2023-01-19 23:59:59" password: "Password123" update_password: on_create
--- - name: Playbook to handle users hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Create user idm_user freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" name: idm_user first: Alice last: Acme uid: 1000111 gid: 10011 phone: "+555123457" email: idm_user@acme.com passwordexpiration: "2023-01-19 23:59:59" password: "Password123" update_password: on_create
Copy to Clipboard Copied! 您必须使用以下选项来添加用户:
- name:登录名称
- first:名(字符串)
- last:姓(字符串)
有关可用用户选项的完整列表,请参阅
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/README-user.md
Markdown 文件。注意如果您使用
update_password: on_create
选项,Ansible 仅在创建用户时创建用户密码。如果已使用密码创建了用户,Ansible 不会生成新的密码。运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-IdM-user.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-IdM-user.yml
Copy to Clipboard Copied!
验证
您可以使用
ipa user-show
命令验证 IdM 中是否存在新用户帐户:以 admin 用户身份登录
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 为 admin 请求一个 Kerberos ticket:
kinit admin
$ kinit admin Password for admin@IDM.EXAMPLE.COM:
Copy to Clipboard Copied! 请求有关 idm_user 的信息:
ipa user-show idm_user
$ ipa user-show idm_user User login: idm_user First name: Alice Last name: Acme ....
Copy to Clipboard Copied!
IdM 中存在名为 idm_user 的用户。
8.3. 使用 Ansible playbook 确保存在多个 IdM 用户
以下流程描述了使用 Ansible playbook 确定在 IdM 中存在多个用户。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建一个 Ansible playbook 文件,其中包含您要在 IdM 中确保存在的用户的数据。要简化此步骤,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/user/ensure-users-present.yml
文件中的示例。例如,要创建用户 idm_user_1、idm_user_2 和 idm_user_3,并添加 Password123 作为密码 idm_user_1 :--- - name: Playbook to handle users hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Create user idm_users freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" users: - name: idm_user_1 first: Alice last: Acme uid: 10001 gid: 10011 phone: "+555123457" email: idm_user@acme.com passwordexpiration: "2023-01-19 23:59:59" password: "Password123" - name: idm_user_2 first: Bob last: Acme uid: 100011 gid: 10011 - name: idm_user_3 first: Eve last: Acme uid: 1000111 gid: 10011
--- - name: Playbook to handle users hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Create user idm_users freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" users: - name: idm_user_1 first: Alice last: Acme uid: 10001 gid: 10011 phone: "+555123457" email: idm_user@acme.com passwordexpiration: "2023-01-19 23:59:59" password: "Password123" - name: idm_user_2 first: Bob last: Acme uid: 100011 gid: 10011 - name: idm_user_3 first: Eve last: Acme uid: 1000111 gid: 10011
Copy to Clipboard Copied! 注意如果没有指定 update_password: on_create 选项,Ansible 每次运行 playbook 时都会重新设置用户密码:如果用户自上次运行 playbook 起更改了密码,则 Ansible 重新设置密码。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-users.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-users.yml
Copy to Clipboard Copied!
验证
您可以使用
ipa user-show
命令验证用户帐户是否存在于 IdM 中:以管理员身份登录到
ipaserver
:ssh administrator@server.idm.example.com
$ ssh administrator@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示有关 idm_user_1 的信息:
ipa user-show idm_user_1
$ ipa user-show idm_user_1 User login: idm_user_1 First name: Alice Last name: Acme Password: True ....
Copy to Clipboard Copied!
IdM 中存在名为 idm_user_1 的用户。
8.4. 使用 Ansible playbook 确保存在 JSON 文件中的多个 IdM 用户
以下流程描述了如何使用 Ansible playbook 确保在 IdM 中存在多个用户。用户存储在 JSON
文件中。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建包含必要任务的 Ansible playbook 文件。使用您要确保存在的用户数据引用
JSON
文件。要简化此步骤,您可以复制并修改/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/README-user.md
文件中的示例:--- - name: Ensure users' presence hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Include users_present.json include_vars: file: users_present.json - name: Users present freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" users: "{{ users }}"
--- - name: Ensure users' presence hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Include users_present.json include_vars: file: users_present.json - name: Users present freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" users: "{{ users }}"
Copy to Clipboard Copied! 创建
users.json
文件,并将 IdM 用户添加到其中。要简化此步骤,您可以复制并修改/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/README-user.md
文件中的示例。例如,要创建用户 idm_user_1、idm_user_2 和 idm_user_3,并添加 Password123 作为密码 idm_user_1 :{ "users": [ { "name": "idm_user_1", "first": "First 1", "last": "Last 1", "password": "Password123" }, { "name": "idm_user_2", "first": "First 2", "last": "Last 2" }, { "name": "idm_user_3", "first": "First 3", "last": "Last 3" } ] }
{ "users": [ { "name": "idm_user_1", "first": "First 1", "last": "Last 1", "password": "Password123" }, { "name": "idm_user_2", "first": "First 2", "last": "Last 2" }, { "name": "idm_user_3", "first": "First 3", "last": "Last 3" } ] }
Copy to Clipboard Copied! 运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-users-present-jsonfile.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-users-present-jsonfile.yml
Copy to Clipboard Copied!
验证
您可以使用
ipa user-show
命令验证 IdM 中是否存在用户帐户:以管理员身份登录到
ipaserver
:ssh administrator@server.idm.example.com
$ ssh administrator@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示有关 idm_user_1 的信息:
ipa user-show idm_user_1
$ ipa user-show idm_user_1 User login: idm_user_1 First name: Alice Last name: Acme Password: True ....
Copy to Clipboard Copied!
IdM 中存在名为 idm_user_1 的用户。
8.5. 确保没有用户使用 Ansible playbook
以下流程描述了如何使用 Ansible playbook 来确保 IdM 中没有特定用户。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建 Ansible playbook 文件,使其包含没有 IdM 的用户。要简化此步骤,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/user/ensure-users-present.yml
文件中的示例。例如,要删除用户 idm_user_1、idm_user_2 和 idm_user_3 :--- - name: Playbook to handle users hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Delete users idm_user_1, idm_user_2, idm_user_3 freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" users: - name: idm_user_1 - name: idm_user_2 - name: idm_user_3 state: absent
--- - name: Playbook to handle users hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Delete users idm_user_1, idm_user_2, idm_user_3 freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" users: - name: idm_user_1 - name: idm_user_2 - name: idm_user_3 state: absent
Copy to Clipboard Copied! 运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/delete-users.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/delete-users.yml
Copy to Clipboard Copied!
验证
您可以使用 ipa user-show
命令验证 IdM 中是否不存在用户帐户:
以管理员身份登录到
ipaserver
:ssh administrator@server.idm.example.com
$ ssh administrator@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 请求有关 idm_user_1 的信息:
ipa user-show idm_user_1
$ ipa user-show idm_user_1 ipa: ERROR: idm_user_1: user not found
Copy to Clipboard Copied! IdM 中不存在名为 idm_user_1 的用户。
第 9 章 使用 Ansible playbook 管理用户组
本节介绍使用 Ansible playbook 进行用户组管理。
用户组是一组具有常见特权、密码策略和其他特征的用户。
RHEL Identity Management (IdM)中的用户组可以包括:
- IdM 用户
- 其他 IdM 用户组
- 外部用户,即 IdM 之外的用户
9.1. 使用 Ansible playbook 确保存在 IdM 组和组成员
以下流程描述了使用 Ansible playbook 确保存在 IdM 组和组成员(用户和用户组)。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - IdM 中已存在您想要引用的用户。有关确保存在使用 Ansible 的用户的详细信息,请参阅使用 Ansible playbook 管理用户帐户。
流程
使用必要的用户和组信息创建一个 Ansible playbook 文件:
--- - name: Playbook to handle groups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Create group ops with gid 1234 freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: ops gidnumber: 1234 - name: Create group sysops freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: sysops user: - idm_user - name: Create group appops freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: appops - name: Add group members sysops and appops to group ops freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: ops group: - sysops - appops
--- - name: Playbook to handle groups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Create group ops with gid 1234 freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: ops gidnumber: 1234 - name: Create group sysops freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: sysops user: - idm_user - name: Create group appops freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: appops - name: Add group members sysops and appops to group ops freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: ops group: - sysops - appops
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-group-members.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-group-members.yml
Copy to Clipboard Copied!
验证
您可以使用 ipa group-show
命令验证 ops 组是否包含 sysops 和 appops 作为直接成员,idm_user 作为间接成员:
以管理员身份登录到
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示关于 ops 的信息:
ipaserver]$ ipa group-show ops Group name: ops GID: 1234 Member groups: sysops, appops Indirect Member users: idm_user
ipaserver]$ ipa group-show ops Group name: ops GID: 1234 Member groups: sysops, appops Indirect Member users: idm_user
Copy to Clipboard Copied! IdM 中已存在 appops 和 sysops 组,后者包括 idm_user 用户。
9.2. 使用 Ansible 在一个任务中添加多个 IdM 组
您可以使用 ansible-freeipa
ipagroup
模块,使用一个 Ansible 任务添加、修改和删除多个身份管理(IdM)用户组。为此,请使用 ipagroup
模块的 groups
选项。
使用 groups
选项,您还可以指定多个仅应用到特定组的组变量。根据 name
变量定义此组,这是 groups
选项的唯一强制变量。
完成此流程,以确保在一个任务中在 IdM 中存在 sysops 和 appops 组。将 sysops 组定义为 nonposix 组,并将 appops 组定义为外部组。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
使用以下内容创建 Ansible playbook 文件 add-nonposix-and-external-groups.yml :
--- - name: Playbook to add nonposix and external groups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Add nonposix group sysops and external group appops freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" groups: - name: sysops nonposix: true - name: appops external: true
--- - name: Playbook to add nonposix and external groups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Add nonposix group sysops and external group appops freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" groups: - name: sysops nonposix: true - name: appops external: true
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/add-nonposix-and-external-groups.yml
$ ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/add-nonposix-and-external-groups.yml
Copy to Clipboard Copied!
9.3. 使用 Ansible 启用 AD 用户来管理 IdM
按照以下步骤,使用 Ansible playbook 来确保 RHEL Identity Management (IdM)组中存在用户 ID 覆盖。用户 ID 覆盖是在使用 AD 建立信任后在 Default Trust View 中创建的 {AD}(AD)用户的覆盖。因此,运行 playbook ,AD 用户,例如 AD 管理员能够完全管理 IdM,而无需两个不同的帐户和密码。
先决条件
-
您需要知道 IdM
admin
密码。 - 您已使用 AD 安装信任。
-
AD 用户的用户 ID 覆盖在IdM 中已存在。如果不存在,请使用
ipa idoverrideuser-add 'default trust view' ad_user@ad.example.com
命令创建它。 - IdM 中已存在您要添加用户 ID 覆盖的组。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 使用以下内容创建一个
add-useridoverride-to-group.yml
playbook:--- - name: Playbook to ensure presence of users in a group hosts: ipaserver tasks: - name: Ensure the ad_user@ad.example.com user ID override is a member of the admins group: freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: admins idoverrideuser: - ad_user@ad.example.com
--- - name: Playbook to ensure presence of users in a group hosts: ipaserver tasks: - name: Ensure the ad_user@ad.example.com user ID override is a member of the admins group: freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: admins idoverrideuser: - ad_user@ad.example.com
Copy to Clipboard Copied! 在示例中:
-
admins
是您要添加 ad_user@ad.example.com ID 覆盖的 IdM POSIX 组的名称。此组成员具有全部的管理员特权。 - ad_user@ad.example.com 是 AD 管理员的用户 ID 覆盖。用户存储在已建立信任的 AD 域中。
-
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory add-useridoverride-to-group.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory add-useridoverride-to-group.yml
Copy to Clipboard Copied!
9.4. 使用 Ansible playbook 确保 IdM 用户组中存在成员管理器
以下流程描述了使用 Ansible playbook 确保存在 IdM 成员管理器(用户和用户组)。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您必须具有要添加为成员管理器的用户名以及您要管理的组的名称。
流程
使用必要的用户和组成员管理信息创建一个 Ansible playbook 文件:
--- - name: Playbook to handle membership management hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure user test is present for group_a freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_a membermanager_user: test - name: Ensure group_admins is present for group_a freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_a membermanager_group: group_admins
--- - name: Playbook to handle membership management hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure user test is present for group_a freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_a membermanager_user: test - name: Ensure group_admins is present for group_a freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_a membermanager_group: group_admins
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-member-managers-user-groups.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-member-managers-user-groups.yml
Copy to Clipboard Copied!
验证
您可以使用 ipa group-show
命令验证 group_a 组是否包含 test 作为成员管理者,以及 group_admins 为 group_a 的成员管理者:
以管理员身份登录到
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示 managergroup1 的信息:
ipaserver]$ ipa group-show group_a Group name: group_a GID: 1133400009 Membership managed by groups: group_admins Membership managed by users: test
ipaserver]$ ipa group-show group_a Group name: group_a GID: 1133400009 Membership managed by groups: group_admins Membership managed by users: test
Copy to Clipboard Copied!
9.5. 使用 Ansible playbook 确保 IdM 用户组中没有成员管理者
以下流程描述了在使用 Ansible playbook 时确保 IdM 成员管理者(用户和用户组)不存在。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您必须具有要删除的现有成员管理者用户或组的名称,以及它们要管理的组的名称。
流程
使用必要的用户和组成员管理信息创建一个 Ansible playbook 文件:
--- - name: Playbook to handle membership management hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure member manager user and group members are absent for group_a freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_a membermanager_user: test membermanager_group: group_admins action: member state: absent
--- - name: Playbook to handle membership management hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure member manager user and group members are absent for group_a freeipa.ansible_freeipa.ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_a membermanager_user: test membermanager_group: group_admins action: member state: absent
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-member-managers-are-absent.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-member-managers-are-absent.yml
Copy to Clipboard Copied!
验证
您可以使用 ipa group-show
命令验证 group_a 组不包含 test 作为成员管理者,以及 group_admins 为 group_a 的成员管理者:
以管理员身份登录到
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示 group_a 的信息:
ipaserver]$ ipa group-show group_a Group name: group_a GID: 1133400009
ipaserver]$ ipa group-show group_a Group name: group_a GID: 1133400009
Copy to Clipboard Copied!
第 10 章 使用 Ansible 在 IdM 中自动化组成员资格
通过自动化组成员资格,您可以根据其属性自动分配用户、主机用户组和主机组。例如,您可以:
-
根据员工的经理、地点、职位或任何其他属性将员工的用户条目分成不同的组。您可以通过在命令行中输入
ipa user-add --help
来列出所有属性。 -
根据它们的类、位置或任何其他属性,将主机分成不同的组。您可以通过在命令行中输入
ipa host-add --help
来列出所有属性。 - 将所有用户或全部主机添加到单个全局组。
您可以使用 Ansible 自动管理 RHEL Identity Management (IdM)中的自动组成员资格。
10.1. 使用 Ansible 确保 IdM 用户组的自动成员规则存在
以下流程描述了如何使用 Ansible playbook 确保 RHEL Identity Management (IdM)组的 自动成员规则
存在。在示例中,确保 testing_group 用户组的 自动成员
规则存在。
先决条件
- IdM 中存在 testing_group 用户组。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/automember/ 目录中的
Ansible playbook 文件:automember
-group-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-group-present.yml automember-group-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-group-present.yml automember-group-present-copy.yml
Copy to Clipboard Copied! -
打开
automember-group-present-copy.yml
文件进行编辑。 通过在
freeipa.ansible_freeipa.ipaautomember
任务部分设置以下变量来调整文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为 testing_group。 -
将
automember_type
变量设为 group。 -
确保
state
变量设置为present
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Automember group present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure group automember rule admins is present freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: testing_group automember_type: group state: present
--- - name: Automember group present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure group automember rule admins is present freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: testing_group automember_type: group state: present
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory automember-group-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory automember-group-present-copy.yml
Copy to Clipboard Copied!
10.2. 使用 Ansible 确保指定的条件在 IdM 用户组自动成员规则中存在
以下流程描述了如何使用 Ansible playbook 确保指定条件在 RHEL 身份管理(IdM) 组的 自动成员
规则中存在。在示例中,确保 testing_group 组的 自动成员
规则中存在与 UID 相关的条件。通过指定 .* 条件,您可以确保所有将来的 IdM 用户都自动成为 testing_group 的成员。
先决条件
- testing_group 用户组和自动成员用户组规则在 IdM 中存在。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/automember/
目录的automember-hostgroup-rule-present.yml
Ansible playbook 文件,并将其命名为 automember-usergroup-rule-present.yml :cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-hostgroup-rule-present.yml automember-usergroup-rule-present.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-hostgroup-rule-present.yml automember-usergroup-rule-present.yml
Copy to Clipboard Copied! -
打开
automember-usergroup-rule-present.yml
文件进行编辑。 通过修改以下参数来调整文件:
- 重命名 playbook 以便对应于您的用例,例如:自动成员用户组规则成员存在。
- 重命名任务以便对应于您的用例,例如:确保用户组的自动成员条件存在。
在
freeipa.ansible_freeipa.ipaautomember
任务部分设置以下变量:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为 testing_group。 -
将
automember_type
变量设为group
。 -
确保
state
变量设置为present
。 -
确保
action
变量设为member
。 -
将
inclusive
key
变量设为UID
。 -
将
inclusive
expression
变量设为 .*
-
将
这是当前示例修改的 Ansible playbook 文件:
--- - name: Automember user group rule member present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure an automember condition for a user group is present freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: testing_group automember_type: group state: present action: member inclusive: - key: UID expression: .*
--- - name: Automember user group rule member present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure an automember condition for a user group is present freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: testing_group automember_type: group state: present action: member inclusive: - key: UID expression: .*
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory automember-usergroup-rule-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory automember-usergroup-rule-present.yml
Copy to Clipboard Copied!
验证
以 IdM 管理员身份登录。
kinit admin
$ kinit admin
Copy to Clipboard Copied! 例如,添加用户:
ipa user-add user101 --first user --last 101
$ ipa user-add user101 --first user --last 101 ----------------------- Added user "user101" ----------------------- User login: user101 First name: user Last name: 101 ... Member of groups: ipausers, testing_group ...
Copy to Clipboard Copied!
10.3. 使用 Ansible 确保条件在 IdM 用户组自动成员规则中不存在
以下流程描述了如何使用 Ansible playbook 确保条件在 RHEL 身份管理(IdM) 组的 自动成员 规则中不存在
。在示例中,条件在 自动成员
规则中不存在确保了应包含指定 首字母
为 dp 的用户。将自动成员规则应用到 testing_group 组。通过应用条件,您可以确保将来首字母为 dp 的用户不会成为 testing_group 的成员。
先决条件
- testing_group 用户组和自动成员用户组规则在 IdM 中存在。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/automember/playbooks/automember/ 目录的
Ansible playbook 文件,并将其命名为 automember-usergroup-rule-absent.yml :automember
-hostgroup-rule-absent.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-hostgroup-rule-absent.yml automember-usergroup-rule-absent.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-hostgroup-rule-absent.yml automember-usergroup-rule-absent.yml
Copy to Clipboard Copied! -
打开
automember-usergroup-rule-absent.yml
文件进行编辑。 通过修改以下参数来调整文件:
- 重命名 playbook 以对应于您的用例,例如:自动成员用户组规则成员不存在。
- 重命名任务以对应于您的用例,例如:确保用户组的自动成员条件不存在。
在
freeipa.ansible_freeipa.ipaautomember
任务部分设置以下变量:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为 testing_group。 -
将
automember_type
变量设为 group。 -
确保
state
变量设置为absent
。 -
确保
action
变量设为member
。 -
将
inclusive
key
变量设为initials
。 -
将
inclusive
expression
变量设为 dp。
-
将
这是当前示例修改的 Ansible playbook 文件:
--- - name: Automember user group rule member absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure an automember condition for a user group is absent freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: testing_group automember_type: group state: absent action: member inclusive: - key: initials expression: dp
--- - name: Automember user group rule member absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure an automember condition for a user group is absent freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: testing_group automember_type: group state: absent action: member inclusive: - key: initials expression: dp
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory automember-usergroup-rule-absent.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory automember-usergroup-rule-absent.yml
Copy to Clipboard Copied!
验证
以 IdM 管理员身份登录。
kinit admin
$ kinit admin
Copy to Clipboard Copied! 查看自动成员组:
ipa automember-show --type=group testing_group
$ ipa automember-show --type=group testing_group Automember Rule: testing_group
Copy to Clipboard Copied!
输出中没有 Inclusive Regex: initials=dp
条目确认 testing_group 自动成员规则不包含指定的条件。
10.4. 使用 Ansible 确保 IdM 用户组的自动成员规则不存在
以下流程描述了如何使用 Ansible playbook 确保 RHEL Identity Management (IdM) 组的 自动成员
规则不存在。在示例中,确保 testing_group 组的 automember
规则不存在。
删除自动成员规则也会删除与规则相关的所有条件。要只从规则中删除特定条件,请参阅 使用 Ansible 确保 IdM 用户组自动成员规则 中没有条件。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/automember/ 目录中的
Ansible playbook 文件:automember
-group-absent.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-group-absent.yml automember-group-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-group-absent.yml automember-group-absent-copy.yml
Copy to Clipboard Copied! -
打开
automember-group-absent-copy.yml
文件进行编辑。 通过在
freeipa.ansible_freeipa.ipaautomember
任务部分设置以下变量来调整文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为 testing_group。 -
将
automember_type
变量设为 group。 确保
state
变量设置为absent
。这是当前示例修改的 Ansible playbook 文件:
--- - name: Automember group absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure group automember rule admins is absent freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: testing_group automember_type: group state: absent
--- - name: Automember group absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure group automember rule admins is absent freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: testing_group automember_type: group state: absent
Copy to Clipboard Copied!
-
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory automember-group-absent.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory automember-group-absent.yml
Copy to Clipboard Copied!
10.5. 使用 Ansible 确保 IdM 主机组自动成员规则中存在条件
按照以下流程,使用 Ansible 确保 IdM 主机组自动成员规则中存在一个条件。示例描述了如何确保 FQDN
为 .*.idm.example.com 的主机是 primary_dns_domain_hosts 主机组的成员,以及 FQDN
为 .*.example.org 的主机不是 primary_dns_domain_hosts 主机组的成员。
先决条件
- IdM 中存在 primary_dns_domain_hosts 主机组和自动成员主机组规则。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/automember/ 目录中的
Ansible playbook 文件:automember
-hostgroup-rule-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-hostgroup-rule-present.yml automember-hostgroup-rule-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/automember/automember-hostgroup-rule-present.yml automember-hostgroup-rule-present-copy.yml
Copy to Clipboard Copied! -
打开
automember-hostgroup-rule-present-copy.yml
文件进行编辑。 通过在
freeipa.ansible_freeipa.ipaautomember
任务部分设置以下变量来调整文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为 primary_dns_domain_hosts。 -
将
automember_type
变量设为 hostgroup。 -
确保
state
变量设置为present
。 -
确保
action
变量设为member
。 -
确保
inclusive
key
变量设为fqdn
。 -
将对应的
inclusive
expression
变量设为 .*.idm.example.com。 -
将
exclusive
key
变量设为fqdn
。 -
将对应的
exclusive
expression
变量设为 .*.example.org。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Automember user group rule member present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure an automember condition for a user group is present freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: primary_dns_domain_hosts automember_type: hostgroup state: present action: member inclusive: - key: fqdn expression: .*.idm.example.com exclusive: - key: fqdn expression: .*.example.org
--- - name: Automember user group rule member present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure an automember condition for a user group is present freeipa.ansible_freeipa.ipaautomember: ipaadmin_password: "{{ ipaadmin_password }}" name: primary_dns_domain_hosts automember_type: hostgroup state: present action: member inclusive: - key: fqdn expression: .*.idm.example.com exclusive: - key: fqdn expression: .*.example.org
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory automember-hostgroup-rule-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory automember-hostgroup-rule-present-copy.yml
Copy to Clipboard Copied!
第 11 章 使用 Ansible playbook 管理 IdM 中的自助服务规则
本节介绍 Identity Management (IdM) 中的自助服务规则,并介绍如何使用 Ansible playbook 创建和编辑自助服务访问规则。自助服务访问控制规则允许 IdM 实体在其 IdM 目录服务器条目上执行指定操作。
11.1. 使用 Ansible 确保存在自助服务规则
以下流程描述了如何使用 Ansible playbook 定义自助服务规则并确保它们在 RHEL 身份管理(IdM)服务器上存在。在本例中,新的 Users can manage their own name details 规则会授予用户更改其 givenname
、displayname
、title
和 initials
属性的权限。例如,这允许他们更改其显示名称或缩写(如果想更改)。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/selfservice/ 目录中的
文件的副本:selfservice
-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/selfservice/selfservice-present.yml selfservice-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/selfservice/selfservice-present.yml selfservice-present-copy.yml
Copy to Clipboard Copied! -
打开
selfservice-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipaselfservice
任务部分设置以下变量来调整文件:-
将
name
变量设置为新自助服务规则的名称。 -
将
permission
变量设置为以逗号分隔的权限列表,以授予:read
和write
。 -
将
attribute
变量设置为用户可以自己管理的属性列表:givenname
、displayname
、title
和initials
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Self-service present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure self-service rule "Users can manage their own name details" is present freeipa.ansible_freeipa.ipaselfservice: ipaadmin_password: "{{ ipaadmin_password }}" name: "Users can manage their own name details" permission: read, write attribute: - givenname - displayname - title - initials
--- - name: Self-service present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure self-service rule "Users can manage their own name details" is present freeipa.ansible_freeipa.ipaselfservice: ipaadmin_password: "{{ ipaadmin_password }}" name: "Users can manage their own name details" permission: read, write attribute: - givenname - displayname - title - initials
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory selfservice-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory selfservice-present-copy.yml
Copy to Clipboard Copied!
11.2. 使用 Ansible 确保缺少自助服务规则
以下流程描述了如何使用 Ansible playbook 来确保 IdM 配置中没有指定的自助服务规则。以下示例描述了如何确保 Users can manage their own name details 自助服务规则在 IdM 中不存在。这将确保用户无法更改自己的显示名称或缩写。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/selfservice/ 目录中的
文件的副本:selfservice
-absent.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/selfservice/selfservice-absent.yml selfservice-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/selfservice/selfservice-absent.yml selfservice-absent-copy.yml
Copy to Clipboard Copied! -
打开
selfservice-absent-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipaselfservice
任务部分设置以下变量来调整文件:-
将
name
变量设置为自助服务规则的名称。 -
将
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Self-service absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure self-service rule "Users can manage their own name details" is absent freeipa.ansible_freeipa.ipaselfservice: ipaadmin_password: "{{ ipaadmin_password }}" name: "Users can manage their own name details" state: absent
--- - name: Self-service absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure self-service rule "Users can manage their own name details" is absent freeipa.ansible_freeipa.ipaselfservice: ipaadmin_password: "{{ ipaadmin_password }}" name: "Users can manage their own name details" state: absent
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory selfservice-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory selfservice-absent-copy.yml
Copy to Clipboard Copied!
11.3. 使用 Ansible 确保自助服务规则具有特定属性
以下流程描述了如何使用 Ansible playbook 确保现有自助服务规则具有特定的设置。在示例中,您可以确认 Users can manage their own name details 自助服务规则也具有 surname
成员属性。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
- Users can manage their own name details 自助服务规则存在于 IdM 中。
步骤
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/selfservice/ 目录中的
文件的副本:selfservice
-member-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/selfservice/selfservice-member-present.yml selfservice-member-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/selfservice/selfservice-member-present.yml selfservice-member-present-copy.yml
Copy to Clipboard Copied! -
打开
selfservice-member-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipaselfservice
任务部分设置以下变量来调整文件:-
将
name
变量设置为要修改的自助服务规则的名称。 -
将
attribute
变量设置为surname
。 -
将
action
变量设置为member
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Self-service member present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure selfservice "Users can manage their own name details" member attribute surname is present freeipa.ansible_freeipa.ipaselfservice: ipaadmin_password: "{{ ipaadmin_password }}" name: "Users can manage their own name details" attribute: - surname action: member
--- - name: Self-service member present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure selfservice "Users can manage their own name details" member attribute surname is present freeipa.ansible_freeipa.ipaselfservice: ipaadmin_password: "{{ ipaadmin_password }}" name: "Users can manage their own name details" attribute: - surname action: member
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory selfservice-member-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory selfservice-member-present-copy.yml
Copy to Clipboard Copied!
11.4. 使用 Ansible 确保自助服务规则没有特定属性
以下流程描述了如何使用 Ansible playbook 来确保自助服务规则没有特定的设置。您可以使用此 playbook 确保自助服务规则没有授予不需要的访问权限。在示例中,您可以确定 Users can manage their own name details 自助服务规则没有包括 givenname
和 surname
成员属性。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - Users can manage their own name details 自助服务规则存在于 IdM 中。
步骤
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/selfservice/ 目录中的
文件的副本:selfservice
-member-absent.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/selfservice/selfservice-member-absent.yml selfservice-member-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/selfservice/selfservice-member-absent.yml selfservice-member-absent-copy.yml
Copy to Clipboard Copied! -
打开
selfservice-member-absent-copy.yml
Ansible playbook 文件进行编辑。 通过在
freeipa.ansible_freeipa.ipaselfservice
任务部分设置以下变量来调整文件:-
将
name
变量设置为您要修改的自助服务规则的名称。 -
将
attribute
变量设置为givenname
和 topname
。 -
将
action
变量设置为member
。 -
将
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Self-service member absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure selfservice "Users can manage their own name details" member attributes givenname and surname are absent freeipa.ansible_freeipa.ipaselfservice: ipaadmin_password: "{{ ipaadmin_password }}" name: "Users can manage their own name details" attribute: - givenname - surname action: member state: absent
--- - name: Self-service member absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure selfservice "Users can manage their own name details" member attributes givenname and surname are absent freeipa.ansible_freeipa.ipaselfservice: ipaadmin_password: "{{ ipaadmin_password }}" name: "Users can manage their own name details" attribute: - givenname - surname action: member state: absent
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory selfservice-member-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory selfservice-member-absent-copy.yml
Copy to Clipboard Copied!
第 12 章 将权限委托到用户组,以使用 Ansible playbook 管理用户
委托是 IdM 中的访问控制方法之一,以及自助服务规则和基于角色的访问控制 (RBAC)。您可以使用委托为一组用户分配权限,以管理另一组用户的条目。
有关委派规则常规信息的详情,请参阅 委派规则 部分。
12.1. 使用 Ansible 确保存在委托规则
以下流程描述了如何使用 Ansible playbook 为新的 IdM 委托规则定义特权,并确保其存在。在这个示例中,新的 basic manager attributes 委托规则授予 managers
组为 employees
组成员读取和写入以下属性的权限:
-
businesscategory
-
departmentnumber
-
employeenumber
-
employeetype
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/
目录中的delegation-present.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/delegation-present.yml delegation-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/delegation-present.yml delegation-present-copy.yml
Copy to Clipboard Copied! -
打开
delegation-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipadelegation
任务部分设置以下变量来调整文件:-
将
name
变量设置为新委托规则的名称。 -
将
permission
变量设置为以逗号分隔的权限列表,以授予:read
和write
。 -
将
attribute
变量设置为委托的用户组可以管理的属性的列表:businesscategory
、departmentnumber
、employeenumber
和employeetype
。 -
将
group
变量设置为被授予查看或修改属性访问权限的组名称。 -
将
membergroup
变量设置为组的名称,其属性可以查看或修改。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to manage a delegation rule hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure delegation "basic manager attributes" is present freeipa.ansible_freeipa.ipadelegation: ipaadmin_password: "{{ ipaadmin_password }}" name: "basic manager attributes" permission: read, write attribute: - businesscategory - departmentnumber - employeenumber - employeetype group: managers membergroup: employees
--- - name: Playbook to manage a delegation rule hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure delegation "basic manager attributes" is present freeipa.ansible_freeipa.ipadelegation: ipaadmin_password: "{{ ipaadmin_password }}" name: "basic manager attributes" permission: read, write attribute: - businesscategory - departmentnumber - employeenumber - employeetype group: managers membergroup: employees
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory delegation-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory delegation-present-copy.yml
Copy to Clipboard Copied!
12.2. 使用 Ansible 确保没有委托规则
以下流程描述了如何使用 Ansible playbook 来确保您的 IdM 配置中没有指定的委托规则。以下示例描述了如何确保自定义 basic manager attributes 委托规则在 IdM 中不存在。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks>/
$ cd ~/MyPlaybooks>/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/
目录中的delegation-absent.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/delegation-present.yml delegation-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/delegation-present.yml delegation-absent-copy.yml
Copy to Clipboard Copied! -
打开
delegation-absent-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipadelegation
任务部分设置以下变量来调整文件:-
将
name
变量设置为委托规则的名称。 -
将
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Delegation absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure delegation "basic manager attributes" is absent freeipa.ansible_freeipa.ipadelegation: ipaadmin_password: "{{ ipaadmin_password }}" name: "basic manager attributes" state: absent
--- - name: Delegation absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure delegation "basic manager attributes" is absent freeipa.ansible_freeipa.ipadelegation: ipaadmin_password: "{{ ipaadmin_password }}" name: "basic manager attributes" state: absent
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory delegation-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory delegation-absent-copy.yml
Copy to Clipboard Copied!
12.3. 使用 Ansible 确保委托规则具有特定属性
以下流程描述了如何使用 Ansible playbook 确保委托规则具有特定的设置。您可以使用此 playbook 修改您之前创建的委托角色。在示例中,您确保 basic manager attributes 委托规则仅具有 departmentnumber
成员属性。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - basic manager attributes 委托规则在 IdM 中存在。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/delegation/ 目录中的
文件的副本:delegation
-member-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/delegation-member-present.yml delegation-member-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/delegation-member-present.yml delegation-member-present-copy.yml
Copy to Clipboard Copied! -
打开
delegation-member-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipadelegation
任务部分设置以下变量来调整文件:-
将
name
变量设置为要修改的委托规则的名称。 -
将
attribute
变量设置为departmentnumber
。 -
将
action
变量设置为member
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Delegation member present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure delegation "basic manager attributes" member attribute departmentnumber is present freeipa.ansible_freeipa.ipadelegation: ipaadmin_password: "{{ ipaadmin_password }}" name: "basic manager attributes" attribute: - departmentnumber action: member
--- - name: Delegation member present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure delegation "basic manager attributes" member attribute departmentnumber is present freeipa.ansible_freeipa.ipadelegation: ipaadmin_password: "{{ ipaadmin_password }}" name: "basic manager attributes" attribute: - departmentnumber action: member
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory delegation-member-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory delegation-member-present-copy.yml
Copy to Clipboard Copied!
12.4. 使用 Ansible 确保委托规则没有特定的属性
以下流程描述了如何使用 Ansible playbook 来确保委托规则没有特定的设置。您可以使用此 playbook 确保委托角色没有授予不需要的访问权限。在示例中,您确保 basic manager attributes 委托规则没有 employeenumber
和 employeetype
成员属性。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - basic manager attributes 委托规则在 IdM 中存在。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/delegation/ 目录中的
文件的副本:delegation
-member-absent.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/delegation-member-absent.yml delegation-member-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/delegation/delegation-member-absent.yml delegation-member-absent-copy.yml
Copy to Clipboard Copied! -
打开
delegation-member-absent-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipadelegation
任务部分设置以下变量来调整文件:-
将
name
变量设置为要修改的委托规则的名称。 -
将
attribute
变量设置为employeenumber
和employeetype
。 -
将
action
变量设置为member
。 -
将
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Delegation member absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure delegation "basic manager attributes" member attributes employeenumber and employeetype are absent freeipa.ansible_freeipa.ipadelegation: ipaadmin_password: "{{ ipaadmin_password }}" name: "basic manager attributes" attribute: - employeenumber - employeetype action: member state: absent
--- - name: Delegation member absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure delegation "basic manager attributes" member attributes employeenumber and employeetype are absent freeipa.ansible_freeipa.ipadelegation: ipaadmin_password: "{{ ipaadmin_password }}" name: "basic manager attributes" attribute: - employeenumber - employeetype action: member state: absent
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory delegation-member-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/MyPlaybooks/inventory delegation-member-absent-copy.yml
Copy to Clipboard Copied!
第 13 章 在 IdM 中使用 Ansible playbook 管理基于角色的访问控制
基于角色的访问控制 (RBAC) 是一种基于角色和特权定义的策略中立访问控制机制。RHEL Identity Management (IdM)中的 RBAC 组件是角色、特权和权限:
- Permissions 授予执行特定任务的权利,如添加或删除用户、修改组并启用读访问。
- Privileges(特权) 结合了权限,例如添加新用户所需的所有权限。
- Roles(角色) 向用户、用户组、主机或主机组授予一组特权。
尤其是在大型公司,使用 RBAC 可以帮助创建具有各个职责领域的管理员分层系统。
本章介绍了使用 Ansible playbook 管理 RBAC 时执行的操作。
13.1. IdM 中的权限
权限是基于角色的访问控制的最低级别单元,它们定义这些操作所应用到的 LDAP 条目。与构建块类似,可以根据需要将权限分配给多个特权。
一个或多个权利定义了允许的操作 :
-
write
-
读取
-
search
-
compare
-
add
-
delete
-
all
这些操作适用于三个基本目标:
-
subtree
:域名 (DN);此 DN 下的子树 -
target filter
:LDAP 过滤器 -
target
:可以带有通配符的 DN 指定条目
此外,以下方便选项可设置对应的属性:
-
type
:对象类型(用户、组等);设置subtree
和target filter
memberof
:组成员;设置target filter
注意如果目标 LDAP 条目不包含任何对组成员资格的引用,则不会应用
memberof
属性权限。-
targetgroup
:授予修改特定组的权限(如授予管理组成员资格的权限);设置target
使用 IdM 权限,您可以控制哪些用户有权访问哪些对象,甚至控制这些对象的属性。IdM 允许您允许或阻止单个属性,或更改特定 IdM 功能(如用户、组或 sudo)的所有可见性,适用于所有匿名用户、所有经过身份验证的用户,或者只更改一组特定的特权用户。
例如,如果管理员只想将用户或组的访问权限限制到这些用户或组需要访问的特定部分,并且使其他部分完全隐藏于他们,此方法的灵活性对管理员很有用。
权限不能包含其他权限。
13.2. 默认管理的权限
管理的权限是 IdM 默认附带的权限。它们的行为与用户创建的其他权限类似,但有以下区别:
- 您无法删除它们或修改其名称、位置和目标属性。
它们有三组属性:
- Default 属性,用户无法修改它们,因为它们由 IdM 管理
- Included 属性,它们是用户添加的额外属性
- Excluded 属性,这些属性由用户删除
管理的权限适用于 default 和 included 属性集中显示的所有属性,但不应用到排除集中的所有属性。
虽然您无法删除受管权限,但将其绑定类型设置为权限并从所有特权中删除托管权限会有效地禁用该权限。
所有受管权限的名称都以 System:
开头,例如 System: Add Sudo rule
或 System: Modify Services
。IdM 的早期版本将不同的方案用于默认权限。例如,用户无法删除它们,而只能将它们分配到特权。这些默认权限大部分已转换为受管权限,但以下权限仍使用以前的方案:
- 添加自动成员重新构建成员身份任务
- 添加配置子条目
- 添加复制协议
- 证书删除冻结
- 从 CA 获取证书状态
- 读取 DNA 范围
- 修改 DNA 范围
- 读取 PassSync Manager 配置
- 修改 PassSync Manager 配置
- 阅读复制协议
- 修改复制协议
- 删除复制协议
- 读取 LDBM 数据库配置
- 请求证书
- 请求证书忽略 CA ACL
- 从不同主机请求证书
- 从 CA 检索证书
- 吊销证书
- 写入 IPA 配置
如果您试图通过命令行修改受管权限,系统不允许更改您无法修改的属性,命令会失败。如果您试图从 Web UI 修改受管权限,则无法修改的属性将被禁用。
13.3. IdM 中的特权
特权是一组适用于角色的权限。
虽然权限提供了执行单个操作的权限,但某些 IdM 任务需要多个权限才能成功。因此,特权组合了执行特定任务所需的不同权限。
例如,为新 IdM 用户设置帐户需要以下权限:
- 创建新用户条目
- 重置用户密码
- 将新用户添加到默认 IPA 用户组
将这三个低级别任务合并到一个更高级别的任务中,例如名为 Add User,可使系统管理员更加轻松地管理角色。IdM 已包含几个默认权限。除了用户和用户组外,还将特权分配到主机和主机组,以及网络服务。这种方法允许精细控制一组主机上使用特定网络服务的操作。
特权可能不包含其他特权。
13.4. IdM 中的角色
角色是用户为角色指定的特权列表。
实际上,权限授予执行给定低级别任务(如创建用户条目和向组添加条目)的能力,特权组合了更高级别任务所需的一个或多个这些权限(如在给定组中创建新用户)。角色根据需要收集权限:例如,用户管理员角色能够添加、修改和删除用户。
角色用于对允许的操作进行分类。它们不用作实施特权升级或防止特权升级的工具。
角色不能包含其他角色。
13.5. Identity Management 中的预定义角色
Red Hat Enterprise Linux Identity Management 提供了以下预定义角色的范围:
角色 | 特权 | 描述 |
---|---|---|
Enrollment Administrator | 主机注册 | 负责客户端或主机、注册 |
helpdesk | 改用户和重置密码,修改组成员身份 | 负责执行简单的用户管理任务 |
IT Security Specialist | Netgroups Administrators, HBAC Administrator, Sudo Administrator | 负责管理安全策略,如基于主机的访问控制、sudo 规则 |
IT Specialist | Host Administrators, Host Group Administrators, Service Administrators, Automount Administrators | 负责管理主机 |
Security Architect | 委托管理员、复制管理员、写 IPA 配置、密码策略管理员 | 负责管理身份管理环境、创建信任、创建复制协议 |
User Administrator | User Administrators, Group Administrators, Stage User Administrators | 负责创建用户和组 |
13.6. 使用 Ansible 确保存在带有特权的 IdM RBAC 角色
要对 RHEL 身份管理(IdM)中的资源进行更精细的控制,请创建一个自定义角色。
以下流程描述了如何使用 Ansible playbook 为新的 IdM 自定义角色定义特权并确保其存在。在这个示例中,新的 user_and_host_administrator 角色默认包含 IdM 中的以下权限的唯一组合:
-
Group Administrators
-
User Administrators
-
Stage User Administrators
-
Group Administrators
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/<MyPlaybooks>/ 目录:
cd ~/<MyPlaybooks>/
$ cd ~/<MyPlaybooks>/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/role/ 目录的
文件的副本:role
-member-user-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-user-present.yml role-member-user-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-user-present.yml role-member-user-present-copy.yml
Copy to Clipboard Copied! -
打开
role-member-user-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.iparole
任务部分设置以下变量来调整文件:-
将
name
变量设置为新角色的名称。 -
将
privilege
列表设置为您要包含在新角色中的 IdM 权限的名称。 -
(可选)将
user
变量设置为您要授予新角色的用户名称。 -
(可选)将
group
变量设置为要授予新角色的组的名称。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: user_and_host_administrator user: idm_user01 group: idm_group01 privilege: - Group Administrators - User Administrators - Stage User Administrators - Group Administrators
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: user_and_host_administrator user: idm_user01 group: idm_group01 privilege: - Group Administrators - User Administrators - Stage User Administrators - Group Administrators
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-user-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-user-present-copy.yml
Copy to Clipboard Copied!
13.7. 使用 Ansible 确保缺少 IdM RBAC 角色
作为管理 RHEL 身份管理(IdM)中基于角色的访问控制(RBAC)的系统管理员,您可能希望确保没有过时的角色,以便没有管理员意外将其分配给任何用户。
以下流程描述了如何使用 Ansible playbook 来确保缺少角色。以下示例描述了如何确保 IdM 中不存在自定义 user_and_host_administrator 角色。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/<MyPlaybooks>/ 目录:
cd ~/<MyPlaybooks>/
$ cd ~/<MyPlaybooks>/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/role/ 目录中的
文件的副本:role
-is-absent.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-is-absent.yml role-is-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-is-absent.yml role-is-absent-copy.yml
Copy to Clipboard Copied! -
打开
role-is-absent-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.iparole
任务部分设置以下变量来调整文件:-
将
name
变量设置为角色的名称。 -
确保
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: user_and_host_administrator state: absent
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: user_and_host_administrator state: absent
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-is-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-is-absent-copy.yml
Copy to Clipboard Copied!
13.8. 使用 Ansible 确保为一组用户分配 IdM RBAC 角色
作为管理 RHEL 身份管理(IdM)中基于角色的访问控制(RBAC)的系统管理员,您可能希望为特定的用户组分配角色,如初级管理员。
以下示例描述了如何使用 Ansible playbook 来确保为 junior_sysadmins 分配内置 IdM RBAC helpdesk 角色。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/<MyPlaybooks>/ 目录:
cd ~/<MyPlaybooks>/
$ cd ~/<MyPlaybooks>/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/role/ 目录的
文件的副本:role
-member-group-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-group-present.yml role-member-group-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-group-present.yml role-member-group-present-copy.yml
Copy to Clipboard Copied! -
打开
role-member-group-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.iparole
任务部分设置以下变量来调整文件:-
将
name
变量设置为您要分配的角色的名称。 -
将
group
变量设置为组的名称。 -
将
action
变量设置为member
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: helpdesk group: junior_sysadmins action: member
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: helpdesk group: junior_sysadmins action: member
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-group-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-group-present-copy.yml
Copy to Clipboard Copied!
13.9. 使用 Ansible 确保没有将特定用户分配给 IdM RBAC 角色
作为管理 RHEL 身份管理(IdM)中基于角色的访问控制(RBAC)的系统管理员,您可能希望确保在特定用户已移至公司内的不同位置后不会为其分配 RBAC 角色。
以下流程描述了如何使用 Ansible playbook 来确保没有将名为 user_01 和 user_02 的用户分配到 helpdesk 角色。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/<MyPlaybooks>/ 目录:
cd ~/<MyPlaybooks>/
$ cd ~/<MyPlaybooks>/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/role/ 目录的
文件的副本:role
-member-user-absent.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-user-absent.yml role-member-user-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-user-absent.yml role-member-user-absent-copy.yml
Copy to Clipboard Copied! -
打开
role-member-user-absent-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.iparole
任务部分设置以下变量来调整文件:-
将
name
变量设置为您要分配的角色的名称。 -
将
user
列表设置为用户的名称。 -
将
action
变量设置为member
。 -
将
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: helpdesk user - user_01 - user_02 action: member state: absent
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: helpdesk user - user_01 - user_02 action: member state: absent
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-user-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-user-absent-copy.yml
Copy to Clipboard Copied!
13.10. 使用 Ansible 确保服务是 IdM RBAC 角色的成员
作为管理 RHEL 身份管理(IdM)中基于角色的访问控制(RBAC)的系统管理员,您可能希望确保注册到 IdM 的特定服务是特定角色的成员。以下示例描述了如何确保自定义 web_administrator 角色可以管理 client01.idm.example.com 服务器上运行的 HTTP
服务。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - web_administrator 角色存在于 IdM 中。
- IdM 中存在 HTTP/client01.idm.example.com@IDM.EXAMPLE.COM 服务。
流程
进入 ~/<MyPlaybooks>/ 目录:
cd ~/<MyPlaybooks>/
$ cd ~/<MyPlaybooks>/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/role/ 目录的
文件的副本:role
-member-service-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-service-present-absent.yml role-member-service-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-service-present-absent.yml role-member-service-present-copy.yml
Copy to Clipboard Copied! -
打开
role-member-service-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.iparole
任务部分设置以下变量来调整文件:-
将
name
变量设置为您要分配的角色的名称。 -
将
service
列表设置为服务的名称。 -
将
action
变量设置为member
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: web_administrator service: - HTTP/client01.idm.example.com action: member
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: web_administrator service: - HTTP/client01.idm.example.com action: member
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-service-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-service-present-copy.yml
Copy to Clipboard Copied!
13.11. 使用 Ansible 确保主机是 IdM RBAC 角色的成员
作为在 RHEL Identity Management (IdM)中管理基于角色的访问控制的系统管理员,您可能希望确保特定的主机或主机组与特定角色关联。以下示例描述了如何确保自定义 web_administrator 角色可以管理运行 HTTP
服务的 client01.idm.example.com IdM 主机。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - web_administrator 角色存在于 IdM 中。
- client01.idm.example.com 主机存在于 IdM 中。
流程
进入 ~/<MyPlaybooks>/ 目录:
cd ~/<MyPlaybooks>/
$ cd ~/<MyPlaybooks>/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/role/ 目录的
文件的副本:role
-member-host-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-host-present.yml role-member-host-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-host-present.yml role-member-host-present-copy.yml
Copy to Clipboard Copied! -
打开
role-member-host-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.iparole
任务部分设置以下变量来调整文件:-
将
name
变量设置为您要分配的角色的名称。 -
将
host
列表设置为主机的名称。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: web_administrator host: - client01.idm.example.com action: member
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: web_administrator host: - client01.idm.example.com action: member
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-host-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-host-present-copy.yml
Copy to Clipboard Copied!
13.12. 使用 Ansible 确保主机组是 IdM RBAC 角色的成员
作为在 RHEL Identity Management (IdM)中管理基于角色的访问控制的系统管理员,您可能希望确保特定的主机或主机组与特定角色关联。以下示例描述了如何确保自定义 web_administrator 角色可以管理运行 HTTP
服务的 IdM 主机组的 web_servers 组。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - web_administrator 角色存在于 IdM 中。
- web_servers 主机组存在于 IdM 中。
流程
进入 ~/<MyPlaybooks>/ 目录:
cd ~/<MyPlaybooks>/
$ cd ~/<MyPlaybooks>/
Copy to Clipboard Copied! 创建位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/role/ 目录的
文件的副本:role
-member-hostgroup-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-hostgroup-present.yml role-member-hostgroup-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/role/role-member-hostgroup-present.yml role-member-hostgroup-present-copy.yml
Copy to Clipboard Copied! -
打开
role-member-hostgroup-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.iparole
任务部分设置以下变量来调整文件:-
将
name
变量设置为您要分配的角色的名称。 -
将
hostgroup
列表设置为 hostgroup 的名称。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: web_administrator hostgroup: - web_servers action: member
--- - name: Playbook to manage IPA role with members. hosts: ipaserver become: true gather_facts: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.iparole: ipaadmin_password: "{{ ipaadmin_password }}" name: web_administrator hostgroup: - web_servers action: member
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-hostgroup-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i ~/<MyPlaybooks>/inventory role-member-hostgroup-present-copy.yml
Copy to Clipboard Copied!
第 14 章 使用 Ansible playbook 管理 RBAC 特权
基于角色的访问控制 (RBAC) 是一种基于角色、特权和权限定义的策略中立访问控制机制。尤其是在大型公司,使用 RBAC 可以帮助创建具有各个职责领域的管理员分层系统。
本章介绍了使用 Ansible playbook 管理 RHEL 身份管理(IdM)中的 RBAC 特权时执行的操作。
先决条件
- 您已了解 RBAC 的概念和原则。
14.1. 使用 Ansible 确保存在自定义 IdM RBAC 特权
要在 RHEL Identity Management (IdM)基于角色的访问控制(RBAC)中有一个完全正常工作的自定义权限,您需要阶段进行:
- 创建没有附加权限的特权。
- 将您选择的权限添加到特权。
以下流程描述了如何使用 Ansible playbook 创建空特权,以便稍后您可以向它添加权限。这个示例描述了如何创建名为 full_host_administration 的特权,它旨在组合与主机管理相关的所有 IdM 权限。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/
目录中的privilege-present.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-present.yml privilege-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-present.yml privilege-present-copy.yml
Copy to Clipboard Copied! -
打开
privilege-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipaprivilege
任务部分设置以下变量来调整文件:-
将
name
变量设置为新特权 full_host_administration 的名称。 -
(可选)利用
description
变量描述特权。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Privilege present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure privilege full_host_administration is present freeipa.ansible_freeipa.ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: full_host_administration description: This privilege combines all IdM permissions related to host administration
--- - name: Privilege present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure privilege full_host_administration is present freeipa.ansible_freeipa.ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: full_host_administration description: This privilege combines all IdM permissions related to host administration
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory privilege-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory privilege-present-copy.yml
Copy to Clipboard Copied!
14.2. 使用 Ansible 确保自定义 IdM RBAC 特权中存在成员权限
要在 RHEL Identity Management (IdM)基于角色的访问控制(RBAC)中有一个完全正常工作的自定义权限,您需要阶段进行:
- 创建没有附加权限的特权。
- 将您选择的权限添加到特权。
以下流程描述了如何使用 Ansible playbook 向上一步中创建的特权添加权限。这个示例描述了如何将与主机管理相关的所有 IdM 权限添加到名为 full_host_administration 的特权中。默认情况下,权限在 Host Enrollment
、Host Administrators
和 Host Group Administrator
特权之间分发。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - full_host_administration 特权存在。有关如何使用 Ansible 创建特权的详情,请参阅使用 Ansible 确保存在自定义 IdM RBAC 特权。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/privilege/ 目录中的
文件的副本:privilege
-member-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-member-present.yml privilege-member-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-member-present.yml privilege-member-present-copy.yml
Copy to Clipboard Copied! -
打开
privilege-member-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
ipaprivilege
任务部分设置以下变量来调整文件:-
调整任务的
name
,使其与您的用例对应。 -
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为特权的名称。 -
将
permission
列表设置为您要包含在权限中的权限名称。 -
确保
action
变量设置为member
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Privilege member present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that permissions are present for the "full_host_administration" privilege ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: full_host_administration permission: - "System: Add krbPrincipalName to a Host" - "System: Enroll a Host" - "System: Manage Host Certificates" - "System: Manage Host Enrollment Password" - "System: Manage Host Keytab" - "System: Manage Host Principals" - "Retrieve Certificates from the CA" - "Revoke Certificate" - "System: Add Hosts" - "System: Add krbPrincipalName to a Host" - "System: Enroll a Host" - "System: Manage Host Certificates" - "System: Manage Host Enrollment Password" - "System: Manage Host Keytab" - "System: Manage Host Keytab Permissions" - "System: Manage Host Principals" - "System: Manage Host SSH Public Keys" - "System: Manage Service Keytab" - "System: Manage Service Keytab Permissions" - "System: Modify Hosts" - "System: Remove Hosts" - "System: Add Hostgroups" - "System: Modify Hostgroup Membership" - "System: Modify Hostgroups" - "System: Remove Hostgroups"
--- - name: Privilege member present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that permissions are present for the "full_host_administration" privilege ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: full_host_administration permission: - "System: Add krbPrincipalName to a Host" - "System: Enroll a Host" - "System: Manage Host Certificates" - "System: Manage Host Enrollment Password" - "System: Manage Host Keytab" - "System: Manage Host Principals" - "Retrieve Certificates from the CA" - "Revoke Certificate" - "System: Add Hosts" - "System: Add krbPrincipalName to a Host" - "System: Enroll a Host" - "System: Manage Host Certificates" - "System: Manage Host Enrollment Password" - "System: Manage Host Keytab" - "System: Manage Host Keytab Permissions" - "System: Manage Host Principals" - "System: Manage Host SSH Public Keys" - "System: Manage Service Keytab" - "System: Manage Service Keytab Permissions" - "System: Modify Hosts" - "System: Remove Hosts" - "System: Add Hostgroups" - "System: Modify Hostgroup Membership" - "System: Modify Hostgroups" - "System: Remove Hostgroups"
Copy to Clipboard Copied! -
调整任务的
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory privilege-member-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory privilege-member-present-copy.yml
Copy to Clipboard Copied!
14.3. 使用 Ansible 确保 IdM RBAC 特权不包括权限
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制。
以下流程描述了如何使用 Ansible playbook 从特权中删除权限。示例描述了如何从默认 Certificate Administrators
特权中删除 Request Certificates ignoring CA ACLs
权限,例如,管理员认为它存在安全风险。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/privilege/ 目录中的
文件的副本:privilege
-member-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-member-absent.yml privilege-member-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-member-absent.yml privilege-member-absent-copy.yml
Copy to Clipboard Copied! -
打开
privilege-member-absent-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipaprivilege
任务部分设置以下变量来调整文件:-
调整任务的
name
,使其与您的用例对应。 -
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为特权的名称。 -
将
permission
列表设置为您要从特权中删除的权限名称。 -
确保
action
变量设置为member
。 -
确保
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Privilege absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "Request Certificate ignoring CA ACLs" permission is absent from the "Certificate Administrators" privilege freeipa.ansible_freeipa.ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: Certificate Administrators permission: - "Request Certificate ignoring CA ACLs" action: member state: absent
--- - name: Privilege absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "Request Certificate ignoring CA ACLs" permission is absent from the "Certificate Administrators" privilege freeipa.ansible_freeipa.ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: Certificate Administrators permission: - "Request Certificate ignoring CA ACLs" action: member state: absent
Copy to Clipboard Copied! -
调整任务的
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory privilege-member-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory privilege-member-absent-copy.yml
Copy to Clipboard Copied!
14.4. 使用 Ansible 重命名自定义 IdM RBAC 特权
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制。
以下流程描述了如何重命名权限,例如,您已从其中删除了一些权限。因此,特权的名称不再准确。在示例中,管理员将 full_host_administration 特权重命名为 limited_host_administration。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - full_host_administration 特权存在。有关如何添加特权的更多信息,请参阅使用 Ansible 确保存在自定义 IdM RBAC 特权。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/
目录中的privilege-present.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-present.yml rename-privilege.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-present.yml rename-privilege.yml
Copy to Clipboard Copied! -
打开
rename-privilege.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipaprivilege
任务部分设置以下变量来调整文件:-
将
name
变量设置为特权的当前名称。 -
添加
rename
变量,并将它设置为特权的新名称。 -
添加
state
变量,并将它设置为重命名
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Rename a privilege hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the full_host_administration privilege is renamed to limited_host_administration freeipa.ansible_freeipa.ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: full_host_administration rename: limited_host_administration state: renamed
--- - name: Rename a privilege hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the full_host_administration privilege is renamed to limited_host_administration freeipa.ansible_freeipa.ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: full_host_administration rename: limited_host_administration state: renamed
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory rename-privilege.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory rename-privilege.yml
Copy to Clipboard Copied!
14.5. 使用 Ansible 确保缺少 IdM RBAC 特权
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制。以下流程描述了如何使用 Ansible playbook 来确保缺少 RBAC 特权。这个示例描述了如何确保缺少 CA administrator
特权。因此,admin
成为在 IdM 中管理证书颁发机构的唯一用户。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/
目录中的privilege-absent.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-absent.yml privilege-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/privilege/privilege-absent.yml privilege-absent-copy.yml
Copy to Clipboard Copied! -
打开
privilege-absent-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipaprivilege
任务部分设置以下变量来调整文件:-
将
name
变量设置为您要删除的特权的名称。 -
确保
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Privilege absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure privilege "CA administrator" is absent freeipa.ansible_freeipa.ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: CA administrator state: absent
--- - name: Privilege absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure privilege "CA administrator" is absent freeipa.ansible_freeipa.ipaprivilege: ipaadmin_password: "{{ ipaadmin_password }}" name: CA administrator state: absent
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory privilege-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory privilege-absent-copy.yml
Copy to Clipboard Copied!
第 15 章 使用 Ansible playbook 在 IdM 中管理 RBAC 权限
基于角色的访问控制 (RBAC) 是一种基于角色、特权和权限定义的策略中立访问控制机制。尤其是在大型公司,使用 RBAC 可以帮助创建具有各个职责领域的管理员分层系统。
本章介绍了使用 Ansible playbook 在 RHEL 身份管理(IdM)中管理 RBAC 权限时执行的操作。
先决条件
- 您已了解 RBAC 的概念和原则。
15.1. 使用 Ansible 确保存在 RBAC 权限
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制(RBAC)。
以下流程描述了如何使用 Ansible playbook 确保 IdM 中存在权限,以便它可以添加到特权中。这个示例描述了如何确保以下目标状态:
-
MyPermission
权限存在。 -
MyPermission
权限只能应用到主机。 授予了包含权限的用户可以对条目执行以下所有可能的操作:
- 写
- 读
- 搜索
- 比较
- 添加
- 删除
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/
目录中的permission-present.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-present.yml permission-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-present.yml permission-present-copy.yml
Copy to Clipboard Copied! -
打开
permission-present-copy.yml
Ansible playbook 文件进行编辑。 通过在
freeipa.ansible_freeipa.ipapermission
任务部分设置以下变量来调整文件:-
将
name
变量设置为权限的名称。 -
将
object_type
变量设置为host
。 -
将
right
变量设置为all
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Permission present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "MyPermission" permission is present freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission object_type: host right: all
--- - name: Permission present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "MyPermission" permission is present freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission object_type: host right: all
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory permission-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory permission-present-copy.yml
Copy to Clipboard Copied!
15.2. 使用 Ansible 确保存在带有属性的 RBAC 权限
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制(RBAC)。
以下流程描述了如何使用 Ansible playbook 确保 IdM 中存在权限,以便它可以添加到特权中。这个示例描述了如何确保以下目标状态:
- MyPermission 权限存在。
- MyPermission 权限只能用于添加主机。
获得了包含权限的用户可以在主机条目上执行以下所有可能的操作:
- 写
- 读
- 搜索
- 比较
- 添加
- 删除
-
被授予特权的用户创建的主机条目包含 MyPermission 权限,可以具有
description
值。
创建或修改权限时可以指定的属性类型不受 IdM LDAP 模式的限制。但是,当 object_type
是 host
时指定 attrs: car_licence
,会导致在使用权限并为一个主机添加特定的 car 许可证时出现 ipa: ERROR: attribute "car-license" not allowed
错误。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/
目录中的permission-present.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-present.yml permission-present-with-attribute.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-present.yml permission-present-with-attribute.yml
Copy to Clipboard Copied! -
打开
permission-present-with-attribute.yml
Ansible playbook 文件进行编辑。 通过在
freeipa.ansible_freeipa.ipapermission
任务部分设置以下变量来调整文件:-
将
name
变量设置为权限的名称。 -
将
object_type
变量设置为host
。 -
将
right
变量设置为all
。 -
将
attrs
变量设置为description
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Permission present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "MyPermission" permission is present with an attribute freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission object_type: host right: all attrs: description
--- - name: Permission present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "MyPermission" permission is present with an attribute freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission object_type: host right: all attrs: description
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory permission-present-with-attribute.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory permission-present-with-attribute.yml
Copy to Clipboard Copied!
15.3. 使用 Ansible 确保缺少 RBAC 权限
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制(RBAC)。
以下流程描述了如何使用 Ansible playbook 确保 IdM 中缺少权限,因此无法将其添加到特权中。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/
目录中的permission-absent.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-absent.yml permission-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-absent.yml permission-absent-copy.yml
Copy to Clipboard Copied! -
打开
permission-absent-copy.yml
Ansible playbook 文件进行编辑。 -
将
freeipa.ansible_freeipa.ipapermission
任务部分中的name
变量设置为权限的名称。 将
state
变量设置为absent
。这是当前示例修改的 Ansible playbook 文件:
--- - name: Permission absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "MyPermission" permission is absent freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission state: absent
--- - name: Permission absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "MyPermission" permission is absent freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission state: absent
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory permission-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory permission-absent-copy.yml
Copy to Clipboard Copied!
15.4. 使用 Ansible 确保属性是 IdM RBAC 权限的成员
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制(RBAC)。
以下流程描述了如何使用 Ansible playbook 确保属性是 IdM 中 RBAC 权限的成员。因此,拥有权限的用户可以创建具有属性的条目。
示例描述了如何确保特权包含 MyPermission 权限的用户创建的主机条目可以具有 gecos
和 description
值。
创建或修改权限时可以指定的属性类型不受 IdM LDAP 模式的限制。但是,当 object_type
是 host
时指定 attrs: car_licence
,会导致在使用权限并为一个主机添加特定的 car 许可证时出现 ipa: ERROR: attribute "car-license" not allowed
错误。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - MyPermission 权限存在。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/permission/ 目录中的
文件的副本:permission
-member-present.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-member-present.yml permission-member-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-member-present.yml permission-member-present-copy.yml
Copy to Clipboard Copied! -
打开
permission-member-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipapermission
任务部分设置以下变量来调整文件:-
将
name
变量设置为权限的名称。 -
将
attrs
列表设置为description
和gecos
变量。 -
确保
action
变量设置为member
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Permission member present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "gecos" and "description" attributes are present in "MyPermission" freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission attrs: - description - gecos action: member
--- - name: Permission member present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "gecos" and "description" attributes are present in "MyPermission" freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission attrs: - description - gecos action: member
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory permission-member-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory permission-member-present-copy.yml
Copy to Clipboard Copied!
15.5. 使用 Ansible 确保属性不是 IdM RBAC 权限的成员
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制(RBAC)。
以下流程描述了如何使用 Ansible playbook 确保属性不是 IdM 中 RBAC 权限的成员。因此,当拥有权限的用户在 IdM LDAP 中创建条目时,该条目不能具有与属性关联的值。
这个示例描述了如何确保以下目标状态:
- MyPermission 权限存在。
-
具有特权的用户创建的主机条目包含 MyPermission 权限,不能具有
description
属性。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - MyPermission 权限存在。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/permission/ 目录中的
文件的副本:permission
-member-absent.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-member-absent.yml permission-member-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-member-absent.yml permission-member-absent-copy.yml
Copy to Clipboard Copied! -
打开
permission-member-absent-copy.yml
Ansible playbook 文件进行编辑。 通过在
freeipa.ansible_freeipa.ipapermission
任务部分设置以下变量来调整文件:-
将
name
变量设置为权限的名称。 -
将
attrs
变量设置为description
。 -
将
action
变量设置为member
。 -
确保
state
变量设置为absent
这是当前示例修改的 Ansible playbook 文件:
--- - name: Permission absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that an attribute is not a member of "MyPermission" freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission attrs: description action: member state: absent
--- - name: Permission absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that an attribute is not a member of "MyPermission" freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission attrs: description action: member state: absent
Copy to Clipboard Copied! -
将
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory permission-member-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory permission-member-absent-copy.yml
Copy to Clipboard Copied!
15.6. 使用 Ansible 重命名 IdM RBAC 权限
作为 RHEL Identity Management (IdM)的系统管理员,您可以自定义 IdM 基于角色的访问控制。
以下流程描述了如何使用 Ansible playbook 重新命名权限。这个示例描述了如何将 MyPermission 重命名为 MyNewPermission。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - MyPermission 存在于 IdM 中。
- IdM 中不存在 MyNewPermission。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 在
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/permission/ 目录中生成
文件的副本:permission
-renamed.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-renamed.yml permission-renamed-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/permission/permission-renamed.yml permission-renamed-copy.yml
Copy to Clipboard Copied! -
打开
permission-renamed-copy.yml
Ansible playbook 文件进行编辑。 通过在
freeipa.ansible_freeipa.ipapermission
任务部分设置以下变量来调整文件:-
调整任务的
name
,使其与您的用例对应。 -
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为权限的当前名称。 -
将
rename
变量设置为权限的新名称。 -
将
state
变量设置为。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Permission present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Rename the "MyPermission" permission freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission rename: MyNewPermission state: renamed
--- - name: Permission present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Rename the "MyPermission" permission freeipa.ansible_freeipa.ipapermission: ipaadmin_password: "{{ ipaadmin_password }}" name: MyPermission rename: MyNewPermission state: renamed
Copy to Clipboard Copied! -
调整任务的
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory permission-renamed-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory permission-renamed-copy.yml
Copy to Clipboard Copied!
第 16 章 使用 Ansible 管理 IdM 中的复制拓扑
您可以维护多个 RHEL 身份管理(IdM)服务器,并使它们相互复制,以实现冗余目的,以缓解或防止服务器丢失。例如,如果一个服务器失败,其他服务器就会为域提供服务。您还可以根据剩余的服务器创建新副本来恢复丢失的服务器。
存储在 IdM 服务器上的数据会根据复制协议复制:当两台服务器配置了复制协议时,它们将共享其数据。复制的数据存储在拓扑后缀
中。当两个副本在其后缀之间具有复制协议时,后缀组成一个拓扑片段(segment)
。
本章论述了如何使用 Ansible 管理 IdM 复制协议、拓扑段和拓扑后缀。
16.1. 使用 Ansible 确保 IdM 中存在复制协议
存储在 RHEL 身份管理(IdM)服务器上的数据基于复制协议复制:当两台服务器配置了复制协议时,它们将共享其数据。复制协议始终为现实:数据从第一个副本复制到另一个副本,另一个副本复制到第一个副本。
按照以下流程,使用 Ansible playbook 确保 server.idm.example.com 和 replica.idm.example.com 之间的 domain
类型的复制协议存在。
先决条件
- 确保您了解在拓扑中 连接 IdM 副本的准则中列出的 IdM 拓扑 的建议。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制
ansible-freeipa
软件包提供的add-topologysegment.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/add-topologysegment.yml add-topologysegment-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/add-topologysegment.yml add-topologysegment-copy.yml
Copy to Clipboard Copied! -
打开
add-topologysegment-copy.yml
文件进行编辑。 通过在
ipatopologysegment
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
根据您要添加的分段类型,将
suffix
变量设置为domain
或ca
。 -
将
left
变量设置为您要作为复制协议左侧节点的 IdM 服务器的名称。 -
将
right
变量设置为您要作为复制协议正确节点的 IdM 服务器的名称。 -
确保
state
变量设置为present
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to handle topologysegment hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Add topology segment ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: domain left: server.idm.example.com right: replica.idm.example.com state: present
--- - name: Playbook to handle topologysegment hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Add topology segment ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: domain left: server.idm.example.com right: replica.idm.example.com state: present
Copy to Clipboard Copied! -
表示
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory add-topologysegment-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory add-topologysegment-copy.yml
Copy to Clipboard Copied!
16.2. 使用 Ansible 确保多个 IdM 副本之间存在复制协议
存储在 RHEL 身份管理(IdM)服务器上的数据基于复制协议复制:当两台服务器配置了复制协议时,它们将共享其数据。复制协议始终为现实:数据从第一个副本复制到另一个副本,另一个副本复制到第一个副本。
按照以下流程,确保 IdM 中的多个副本对之间存在复制协议。
先决条件
- 确保您了解拓扑中连接副本中列出的 IdM 拓扑的建议。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制
ansible-freeipa
软件包提供的add-topologysegments.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/add-topologysegments.yml add-topologysegments-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/add-topologysegments.yml add-topologysegments-copy.yml
Copy to Clipboard Copied! -
打开
add-topologysegments-copy.yml
文件进行编辑。 通过在
vars
部分中设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 对于每个拓扑片段,在
ipatopology_segments
部分添加一个行并设置以下变量:-
根据您要添加的分段类型,将
suffix
变量设置为domain
或ca
。 -
将
left
变量设置为您要作为复制协议左侧节点的 IdM 服务器的名称。 -
将
right
变量设置为您要作为复制协议正确节点的 IdM 服务器的名称。
-
根据您要添加的分段类型,将
-
表示
在
add-topologysegments-copy.yml
文件的tasks
部分中,确保state
变量设置为present
。这是当前示例修改的 Ansible playbook 文件:
--- - name: Add topology segments hosts: ipaserver gather_facts: false vars: ipaadmin_password: "{{ ipaadmin_password }}" ipatopology_segments: - {suffix: domain, left: replica1.idm.example.com , right: replica2.idm.example.com } - {suffix: domain, left: replica2.idm.example.com , right: replica3.idm.example.com } - {suffix: domain, left: replica3.idm.example.com , right: replica4.idm.example.com } - {suffix: domain+ca, left: replica4.idm.example.com , right: replica1.idm.example.com } vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Add topology segment freeipa.ansible_freeipa.ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: "{{ item.suffix }}" name: "{{ item.name | default(omit) }}" left: "{{ item.left }}" right: "{{ item.right }}" state: present loop: "{{ ipatopology_segments | default([]) }}"
--- - name: Add topology segments hosts: ipaserver gather_facts: false vars: ipaadmin_password: "{{ ipaadmin_password }}" ipatopology_segments: - {suffix: domain, left: replica1.idm.example.com , right: replica2.idm.example.com } - {suffix: domain, left: replica2.idm.example.com , right: replica3.idm.example.com } - {suffix: domain, left: replica3.idm.example.com , right: replica4.idm.example.com } - {suffix: domain+ca, left: replica4.idm.example.com , right: replica1.idm.example.com } vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Add topology segment freeipa.ansible_freeipa.ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: "{{ item.suffix }}" name: "{{ item.name | default(omit) }}" left: "{{ item.left }}" right: "{{ item.right }}" state: present loop: "{{ ipatopology_segments | default([]) }}"
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory add-topologysegments-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory add-topologysegments-copy.yml
Copy to Clipboard Copied!
16.3. 使用 Ansible 检查两个副本之间是否存在复制协议
存储在 RHEL 身份管理(IdM)服务器上的数据基于复制协议复制:当两台服务器配置了复制协议时,它们将共享其数据。复制协议始终为现实:数据从第一个副本复制到另一个副本,另一个副本复制到第一个副本。
按照以下流程验证 IdM 中多个副本对之间是否存在复制协议。与使用 Ansible 确保 IdM 中存在复制协议 不同,这个过程不会修改现有的配置。
先决条件
- 确保您了解拓扑中连接副本中列出的 IdM 拓扑的建议。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制
ansible-freeipa
软件包提供的check-topologysegments.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/check-topologysegments.yml check-topologysegments-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/check-topologysegments.yml check-topologysegments-copy.yml
Copy to Clipboard Copied! -
打开
check-topologysegments-copy.yml
文件进行编辑。 通过在
vars
部分中设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 对于每个拓扑片段,在
ipatopology_segments
部分添加一个行并设置以下变量:-
根据您要添加的分段类型,将
suffix
变量设置为domain
或ca
。 -
将
left
变量设置为您要作为复制协议左侧节点的 IdM 服务器的名称。 -
将
right
变量设置为您要作为复制协议正确节点的 IdM 服务器的名称。
-
根据您要添加的分段类型,将
-
表示
在
check-topologysegments-copy.yml
文件的tasks
部分中,确保state
变量设置为present
。这是当前示例修改的 Ansible playbook 文件:
--- - name: Add topology segments hosts: ipaserver gather_facts: false vars: ipaadmin_password: "{{ ipaadmin_password }}" ipatopology_segments: - {suffix: domain, left: replica1.idm.example.com, right: replica2.idm.example.com } - {suffix: domain, left: replica2.idm.example.com , right: replica3.idm.example.com } - {suffix: domain, left: replica3.idm.example.com , right: replica4.idm.example.com } - {suffix: domain+ca, left: replica4.idm.example.com , right: replica1.idm.example.com } vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Check topology segment freeipa.ansible_freeipa.ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: "{{ item.suffix }}" name: "{{ item.name | default(omit) }}" left: "{{ item.left }}" right: "{{ item.right }}" state: checked loop: "{{ ipatopology_segments | default([]) }}"
--- - name: Add topology segments hosts: ipaserver gather_facts: false vars: ipaadmin_password: "{{ ipaadmin_password }}" ipatopology_segments: - {suffix: domain, left: replica1.idm.example.com, right: replica2.idm.example.com } - {suffix: domain, left: replica2.idm.example.com , right: replica3.idm.example.com } - {suffix: domain, left: replica3.idm.example.com , right: replica4.idm.example.com } - {suffix: domain+ca, left: replica4.idm.example.com , right: replica1.idm.example.com } vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Check topology segment freeipa.ansible_freeipa.ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: "{{ item.suffix }}" name: "{{ item.name | default(omit) }}" left: "{{ item.left }}" right: "{{ item.right }}" state: checked loop: "{{ ipatopology_segments | default([]) }}"
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory check-topologysegments-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory check-topologysegments-copy.yml
Copy to Clipboard Copied!
16.4. 使用 Ansible 验证 IdM 中是否存在拓扑后缀
在 RHEL 身份管理(IdM)中的复制协议中,拓扑后缀会存储复制的数据。IdM 支持两种类型的拓扑后缀:domain
和 ca
。每个后缀代表一个单独的后端,即一个单独的复制拓扑。配置复制协议时,它会在两个不同的服务器上加入同一类型的两个拓扑后缀。
domain
后缀包含所有与域相关的数据,如有关用户、组和策略的数据。ca
后缀包含证书系统组件的数据。它仅存在于安装有证书颁发机构 (CA) 的服务器上。
按照以下流程,使用 Ansible playbook 确保拓扑后缀在 IdM 中存在。这个示例描述了如何确保 IdM 中存在 domain
后缀。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制
ansible-freeipa
软件包提供的verify-topologysuffix.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/ verify-topologysuffix.yml verify-topologysuffix-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/ verify-topologysuffix.yml verify-topologysuffix-copy.yml
Copy to Clipboard Copied! -
打开
verify-topologysuffix-copy.yml
Ansible playbook 文件进行编辑。 通过在
freeipa.ansible_freeipa.ipatopologysuffix
部分中设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
suffix
变量设置为domain
。如果您要验证ca
后缀是否存在,请将 变量设置为ca
。 -
确保
state
变量设置为verify
。不允许使用其他选项。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to handle topologysuffix hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Verify topology suffix freeipa.ansible_freeipa.ipatopologysuffix: ipaadmin_password: "{{ ipaadmin_password }}" suffix: domain state: verified
--- - name: Playbook to handle topologysuffix hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Verify topology suffix freeipa.ansible_freeipa.ipatopologysuffix: ipaadmin_password: "{{ ipaadmin_password }}" suffix: domain state: verified
Copy to Clipboard Copied! -
表示
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory verify-topologysuffix-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory verify-topologysuffix-copy.yml
Copy to Clipboard Copied!
16.5. 使用 Ansible 重新初始化 IdM 副本
如果副本离线很长时间或者其数据库已损坏,您可以重新初始化它。重新初始化会使用更新的一组数据刷新副本。例如,如果需要从备份进行权威恢复,可以使用重新初始化。
与复制更新不同,副本仅互相发送更改的条目,重新初始化会刷新整个数据库。
运行命令的本地主机是重新初始化的副本。要指定从中获取数据的副本,请使用 direction
选项。
按照以下流程,使用 Ansible playbook 从 server.idm.example.com 重新初始化 replica.idm.example.com 上的 domain
数据。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制
ansible-freeipa
软件包提供的reinitialize-topologysegment.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/reinitialize-topologysegment.yml reinitialize-topologysegment-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/reinitialize-topologysegment.yml reinitialize-topologysegment-copy.yml
Copy to Clipboard Copied! -
打开
reinitialize-topologysegment-copy.yml
文件进行编辑。 通过在
freeipa.ansible_freeipa.ipatopologysegment
部分中设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
suffix
变量设置为domain
。如果您要重新初始化ca
数据,请将变量设置为ca
。 -
将
left
变量设置为复制协议的左侧节点。 -
将
right
变量设置为复制协议的右节点。 -
将
direction
变量设置为重新初始化数据的方向。left-to-right
方向表示数据从左侧节点流到右侧节点。 确保将
state
变量设置为reinitialized
。这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to handle topologysegment hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Reinitialize topology segment freeipa.ansible_freeipa.ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: domain left: server.idm.example.com right: replica.idm.example.com direction: left-to-right state: reinitialized
--- - name: Playbook to handle topologysegment hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Reinitialize topology segment freeipa.ansible_freeipa.ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: domain left: server.idm.example.com right: replica.idm.example.com direction: left-to-right state: reinitialized
Copy to Clipboard Copied!
-
表示
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory reinitialize-topologysegment-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory reinitialize-topologysegment-copy.yml
Copy to Clipboard Copied!
16.6. 使用 Ansible 确保 IdM 中没有复制协议
存储在 RHEL 身份管理(IdM)服务器上的数据基于复制协议复制:当两台服务器配置了复制协议时,它们将共享其数据。复制协议始终为现实:数据从第一个副本复制到另一个副本,另一个副本复制到第一个副本。
按照以下流程,确保两个副本之间的复制协议在 IdM 中不存在。这个示例描述了如何确保在 replica01.idm.example.com 和 replica02.idm.example.com IdM 服务器之间不存在 domain
类型的复制协议。
先决条件
- 您了解 在拓扑中连接副本中列出的 IdM 拓扑 的建议。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制
ansible-freeipa
软件包提供的delete-topologysegment.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/delete-topologysegment.yml delete-topologysegment-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/topology/delete-topologysegment.yml delete-topologysegment-copy.yml
Copy to Clipboard Copied! -
打开
delete-topologysegment-copy.yml
文件进行编辑。 通过在
ipatopologysegment
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
suffix
变量设置为domain
。或者,如果您确保ca
数据不在左侧和右侧节点之间复制,请将变量设置为ca
。 -
将
left
变量设置为您要作为复制协议左侧节点的 IdM 服务器的名称。 -
将
right
变量设置为 IdM 服务器的名称,该服务器是复制协议的右节点。 -
确保
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to handle topologysegment hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Delete topology segment ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: domain left: replica01.idm.example.com right: replica02.idm.example.com: state: absent
--- - name: Playbook to handle topologysegment hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Delete topology segment ipatopologysegment: ipaadmin_password: "{{ ipaadmin_password }}" suffix: domain left: replica01.idm.example.com right: replica02.idm.example.com: state: absent
Copy to Clipboard Copied! -
表示
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory delete-topologysegment-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory delete-topologysegment-copy.yml
Copy to Clipboard Copied!
第 17 章 使用 Ansible 管理 IdM 服务器
您可以使用 Ansible 管理 RHEL 身份管理(IdM)拓扑中的服务器。您可以使用 ansible-freeipa
软件包中的 server
模块来检查 IdM 拓扑中是否存在服务器。您还可以隐藏任何副本或使副本可见。
17.1. 使用 Ansible 检查 IdM 服务器是否存在
您可以使用 Ansible playbook 中的 ipaserver
ansible-freeipa
模块来验证 RHEL Identity Management (IdM)服务器是否存在。
ipaserver
Ansible 模块不会安装 IdM 服务器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/
目录中的server-present.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-present.yml server-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-present.yml server-present-copy.yml
Copy to Clipboard Copied! -
打开
server-present-copy.yml
文件进行编辑。 在
freeipa.ansible_freeipa.ipaserver
task 部分中,将name
变量设置为服务器的FQDN
。示例服务器的FQDN
是 server123.idm.example.com。--- - name: Server present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com is present freeipa.ansible_freeipa.ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com
--- - name: Server present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com is present freeipa.ansible_freeipa.ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook ,并指定 playbook 文件和清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory server-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory server-present-copy.yml
Copy to Clipboard Copied!
17.2. 使用 Ansible 确保 IdM 拓扑中没有 IdM 服务器
使用 Ansible playbook 确保 IdM 拓扑中不存在 RHEL Identity Management (IdM)服务器,即使作为主机也是如此。
与 ansible-freeipa
ipaserver
角色不同,此 playbook 中使用的 ipaserver
模块不会从服务器卸载 IdM 服务。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/
目录中的server-absent.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-absent.yml server-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-absent.yml server-absent-copy.yml
Copy to Clipboard Copied! -
打开
server-absent-copy.yml
文件进行编辑。 通过在
freeipa.ansible_freeipa.ipaserver
任务部分设置以下变量来调整文件,并保存文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为服务器的FQDN
。示例服务器的FQDN
是 server123.idm.example.com。 -
确保
state
变量设置为absent
。
--- - name: Server absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com is absent freeipa.ansible_freeipa.ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com state: absent
--- - name: Server absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com is absent freeipa.ansible_freeipa.ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com state: absent
Copy to Clipboard Copied! -
将
运行 Ansible playbook ,并指定 playbook 文件和清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory server-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory server-absent-copy.yml
Copy to Clipboard Copied! - 确保指向 server123.idm.example.com 的所有名称服务器(NS)DNS 记录都已从 DNS 区域中删除。无论您使用由 IdM 还是外部 DNS 管理的集成 DNS,这个均适用。
17.3. 确保尽管拥有最后一个 IdM 服务器角色,也不存在 IdM 服务器
您可以使用 Ansible 确保缺少 RHEL 身份管理(IdM)服务器,即使最后一个 IdM 服务实例正在服务器上运行。证书颁发机构(CA)、密钥恢复机构(KRA)或 DNS 服务器都是 IdM 服务的示例。
如果您删除了作为 CA、KRA 或 DNS 服务器的最后一台服务器,会严重破坏 IdM 功能。您可以使用 ipa service-find
命令手动检查哪些服务运行在哪些 IdM 服务器上。CA 服务器的主要名称为 dogtag/server_name/REALM_NAME
。
与 ansible-freeipa
ipaserver
角色不同,此 playbook 中使用的 ipaserver
模块不会从服务器卸载 IdM 服务。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 -
清单文件中定义的从控制节点到 IdM 服务器的
SSH
连接工作正常。
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/server/ 目录中的
Ansible playbook 文件:server
-absent-ignore-last-of-role.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/server/server-absent-ignore-last-of-role.yml server-absent-ignore-last-of-role-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/server/server-absent-ignore-last-of-role.yml server-absent-ignore-last-of-role-copy.yml
Copy to Clipboard Copied! -
打开
server-absent-ignore-last-of-role-copy.yml
文件进行编辑。 通过在
ipaserver
任务部分中设置以下变量来调整文件,并保存文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为服务器的FQDN
。示例服务器的FQDN
是 server123.idm.example.com。 -
确保
ignore_last_of_role
变量被设为true
。 -
将
state
变量设置为absent
。
--- - name: Server absent with last of role skip example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server "server123.idm.example.com” is absent with last of role skip freeipa.ansible_freeipa.ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com ignore_last_of_role: true state: absent
--- - name: Server absent with last of role skip example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server "server123.idm.example.com” is absent with last of role skip freeipa.ansible_freeipa.ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com ignore_last_of_role: true state: absent
Copy to Clipboard Copied! -
将
运行 Ansible playbook ,并指定 playbook 文件和清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory server-absent-ignore-last-of-role-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory server-absent-ignore-last-of-role-copy.yml
Copy to Clipboard Copied! - 确保指向 server123.idm.example.com 的所有名称服务器(NS)DNS 记录已从 DNS 区域中删除。无论您使用由 IdM 还是外部 DNS 管理的集成 DNS,这个均适用。
17.4. 确保 IdM 服务器不存在,但不一定与其他 IdM 服务器断开连接
如果要从拓扑中删除 RHEL 身份管理(IdM)服务器,您可以使用 Ansible playbook 使其复制协议保持不变。playbook 还确保 IdM 服务器在 IdM 中不存在,即使作为主机也是如此。
仅当其他服务器是您计划删除的工作不正常的服务器时,才建议在删除时忽略服务器的复制协议。删除拓扑中作为中心点的服务器会将拓扑分成两个断开连接的集群。
您可以使用 ipa server-del
命令从拓扑中删除工作不正常的服务器。
如果您删除了作为证书颁发机构(CA)、密钥恢复机构(KRA)或 DNS 服务器的最后一个服务器,您会严重破坏 RHEL 身份管理(IdM)功能。为防止此问题,playbook 在卸载充当 CA、KRA 或 DNS 服务器的服务器之前,确保这些服务运行在域中的另一台服务器上。
与 ansible-freeipa
ipaserver
角色不同,此 playbook 中使用的 ipaserver
模块不会从服务器卸载 IdM 服务。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。-
清单文件中定义的从控制节点到 IdM 服务器的
SSH
连接工作正常。
-
清单文件中定义的从控制节点到 IdM 服务器的
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/ansible_freeipa/playbooks/server/ 目录中的
Ansible playbook 文件:server-absent-ignore_topology_
disconnect.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-absent-ignore_topology_disconnect.yml server-absent-ignore_topology_disconnect-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-absent-ignore_topology_disconnect.yml server-absent-ignore_topology_disconnect-copy.yml
Copy to Clipboard Copied! -
打开
server-absent-ignore_topology_disconnect-copy.yml
文件进行编辑。 通过在
ipaserver
任务部分中设置以下变量来调整文件,并保存文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为服务器的FQDN
。示例服务器的FQDN
是 server123.idm.example.com。 -
确保
ignore_topology_disconnect
变量被设为true
。 -
确保
state
变量设置为absent
。
--- - name: Server absent with ignoring topology disconnects example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server "server123.idm.example.com” with ignoring topology disconnects ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com ignore_topology_disconnect: true state: absent
--- - name: Server absent with ignoring topology disconnects example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server "server123.idm.example.com” with ignoring topology disconnects ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com ignore_topology_disconnect: true state: absent
Copy to Clipboard Copied! -
将
运行 Ansible playbook ,并指定 playbook 文件和清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory server-absent-ignore_topology_disconnect-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory server-absent-ignore_topology_disconnect-copy.yml
Copy to Clipboard Copied! - 可选:确保指向 server123.idm.example.com 的所有名称服务器(NS) DNS 记录已从 DNS 区域中删除。无论您使用由 IdM 还是外部 DNS 管理的集成 DNS,这个均适用。
17.6. 使用 Ansible playbook 确保现有的 IdM 服务器可见
使用 Ansible playbook 中的 ipaserver
ansible-freeipa
模块,来确保可以看到现有的 RHEL 身份管理(IdM)服务器。请注意,此 playbook 没有安装 IdM 服务器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。-
清单文件中定义的从控制节点到 IdM 服务器的
SSH
连接工作正常。
-
清单文件中定义的从控制节点到 IdM 服务器的
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/server/ 目录中的
Ansible playbook 文件:server
-not-hidden.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-not-hidden.yml server-not-hidden-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-not-hidden.yml server-not-hidden-copy.yml
Copy to Clipboard Copied! -
打开
server-not-hidden-copy.yml
文件进行编辑。 通过在
ipaserver
任务部分中设置以下变量来调整文件,并保存文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为服务器的FQDN
。示例服务器的FQDN
是 server123.idm.example.com。 -
确保
hidden
变量设为no
。
--- - name: Server not hidden example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com is not hidden freeipa.ansible_freeipa.ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com hidden: no
--- - name: Server not hidden example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com is not hidden freeipa.ansible_freeipa.ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com hidden: no
Copy to Clipboard Copied! -
将
运行 Ansible playbook ,并指定 playbook 文件和清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory server-not-hidden-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory server-not-hidden-copy.yml
Copy to Clipboard Copied!
17.7. 确保现有的 IdM 服务器被分配了 IdM DNS 位置
使用 Ansible playbook 中的 ipaserver
ansible-freeipa
模块,确保为现有的 RHEL 身份管理(IdM)服务器分配了特定的 IdM DNS 位置。
请注意,ipaserver
Ansible 模块没有安装 IdM 服务器。
先决条件
-
您需要知道 IdM
admin
密码。 - IdM DNS 位置存在。位置示例为 germany。
-
您有访问服务器的
root
权限。服务器示例是 server123.idm.example.com。 您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。-
清单文件中定义的从控制节点到 IdM 服务器的
SSH
连接工作正常。
-
清单文件中定义的从控制节点到 IdM 服务器的
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/
目录中的server-location.yml
Ansible playbook 文件:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-location.yml server-location-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-location.yml server-location-copy.yml
Copy to Clipboard Copied! -
打开
server-location-copy.yml
文件进行编辑。 通过在
ipaserver
任务部分中设置以下变量来调整文件,并保存文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为 server123.idm.example.com。 -
将
location
变量设为 germany。
这是当前示例修改的 Ansible playbook 文件:
--- - name: Server enabled example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com with location "germany” is present ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com location: germany
--- - name: Server enabled example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com with location "germany” is present ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com location: germany
Copy to Clipboard Copied! -
将
运行 Ansible playbook ,并指定 playbook 文件和清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory server-location-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory server-location-copy.yml
Copy to Clipboard Copied! 以
root
用户身份使用SSH
连接到 server123.idm.example.com :ssh root@server123.idm.example.com
ssh root@server123.idm.example.com
Copy to Clipboard Copied! 在服务器中重启
named
服务以使更新立即生效:[root@server123.idm.example.com ~]# systemctl restart named
[root@server123.idm.example.com ~]# systemctl restart named
Copy to Clipboard Copied!
17.8. 确保现有的 IdM 服务器没有分配 IdM DNS 位置
使用 Ansible playbook 中的 ipaserver
ansible-freeipa
模块来确保现有 RHEL 身份管理(IdM)服务器没有为其分配的 IdM DNS 位置。不要将 DNS 位置分配给经常更改地理位置的服务器。请注意,playbook 不安装 IdM 服务器。
先决条件
-
您需要知道 IdM
admin
密码。 -
您有访问服务器的
root
权限。服务器示例是 server123.idm.example.com。 您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。-
清单文件中定义的从控制节点到 IdM 服务器的
SSH
连接工作正常。
-
清单文件中定义的从控制节点到 IdM 服务器的
流程
进入您的 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 复制位于
/usr/share/ansible/collections/ansible_collections/ansible_freeipa/playbooks/server/ 目录中的
Ansible playbook 文件:server
-no-location.ymlcp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-no-location.yml server-no-location-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/server/server-no-location.yml server-no-location-copy.yml
Copy to Clipboard Copied! -
打开
server-no-location-copy.yml
文件进行编辑。 通过在
ipaserver
任务部分中设置以下变量来调整文件,并保存文件:-
将
ipaadmin_password
变量设为 IdMadmin
的密码。 -
将
name
变量设为 server123.idm.example.com。 -
确保
location
变量设为 ""。
--- - name: Server no location example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com is present with no location ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com location: "”
--- - name: Server no location example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure server server123.idm.example.com is present with no location ipaserver: ipaadmin_password: "{{ ipaadmin_password }}" name: server123.idm.example.com location: "”
Copy to Clipboard Copied! -
将
运行 Ansible playbook ,并指定 playbook 文件和清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory server-no-location-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory server-no-location-copy.yml
Copy to Clipboard Copied! 以
root
用户身份使用SSH
连接到 server123.idm.example.com :ssh root@server123.idm.example.com
ssh root@server123.idm.example.com
Copy to Clipboard Copied! 在服务器中重启
named
服务以使更新立即生效:[root@server123.idm.example.com ~]# systemctl restart named
[root@server123.idm.example.com ~]# systemctl restart named
Copy to Clipboard Copied!
第 18 章 使用 Ansible playbook 管理主机
Ansible 是一个自动化工具,用于配置系统、部署软件和执行滚动更新。Ansible 包含对身份管理 (IdM) 的支持,您可以使用 Ansible 模块自动执行主机管理。
18.1. 使用 Ansible playbook 确保存在带有 FQDN 的 IdM 主机条目
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中存在主机条目。主机条目仅通过其 完全限定域名
(FQDN) 定义。
如果至少适用以下条件之一,则指定主机的 FQDN
名称就足够:
- IdM 服务器没有配置为管理 DNS。
-
主机没有静态 IP 地址,或者在配置主机时不知道该 IP 地址。添加仅由
FQDN
定义的主机实质上会在 IdM DNS 服务中创建占位符条目。例如,笔记本电脑可能预配置为 IdM 客户端,但它们在配置时没有 IP 地址。当 DNS 服务动态更新其记录时,将检测主机的当前 IP 地址,并更新其 DNS 记录。
如果没有 Ansible,则使用 ipa host-add
命令在 IdM 中创建主机条目。将主机添加到 IdM 的结果是 IdM 中存在的主机状态。由于 Ansible 依赖于 idempotence,要使用 Ansible 将主机添加到 IdM,您必须创建一个 playbook,将主机的状态定义为 present: state: present。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建一个 Ansible playbook 文件,其中包含您要确保的 IdM 中的
FQDN
。要简化此步骤,您可以复制并修改/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/host/add-host.yml
文件中的示例:--- - name: Host present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Host host01.idm.example.com present freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" name: host01.idm.example.com state: present force: true
--- - name: Host present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Host host01.idm.example.com present freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" name: host01.idm.example.com state: present force: true
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-host-is-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-host-is-present.yml
Copy to Clipboard Copied!
这个过程会导致在 IdM LDAP 服务器中创建主机条目,但不将主机注册到 IdM Kerberos 域。为此,您必须将主机部署为 IdM 客户端。详情请参阅使用 Ansible playbook 安装身份管理客户端。
验证
以
admin
用户身份登录您的 IdM 服务器:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password:
Copy to Clipboard Copied! 输入
ipa host-show
命令并指定主机名称:ipa host-show host01.idm.example.com
$ ipa host-show host01.idm.example.com Host name: host01.idm.example.com Principal name: host/host01.idm.example.com@IDM.EXAMPLE.COM Principal alias: host/host01.idm.example.com@IDM.EXAMPLE.COM Password: False Keytab: False Managed by: host01.idm.example.com
Copy to Clipboard Copied!
输出确认 IdM 中存在 host01.idm.example.com。
18.2. 使用 Ansible playbook 确保存在含有 DNS 信息的 IdM 主机条目
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中存在主机条目。主机条目通过其 完全限定域名
(FQDN)及其 IP 地址定义。
如果没有 Ansible,则使用 ipa host-add
命令在 IdM 中创建主机条目。将主机添加到 IdM 的结果是 IdM 中存在的主机状态。由于 Ansible 依赖于 idempotence,要使用 Ansible 将主机添加到 IdM,您必须创建一个 playbook,将主机的状态定义为 present: state: present。
先决条件
- 您知道 IdM 管理员密码。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建一个 Ansible playbook 文件,其中包含您要确保的 IdM 中的
完全限定域名
(FQDN)。另外,如果 IdM 服务器配置为管理 DNS,并且您知道主机的 IP 地址,请为ip_address
参数指定一个值。主机需要 IP 地址才能存在于 DNS 资源记录中。要简化此步骤,您可以复制并修改/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/host/host-present.yml
文件中的示例。您还可以包含其他附加信息:--- - name: Host present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure host01.idm.example.com is present freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" name: host01.idm.example.com description: Example host ip_address: 192.168.0.123 locality: Lab ns_host_location: Lab ns_os_version: CentOS 7 ns_hardware_platform: Lenovo T61 mac_address: - "08:00:27:E3:B1:2D" - "52:54:00:BD:97:1E" state: present
--- - name: Host present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure host01.idm.example.com is present freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" name: host01.idm.example.com description: Example host ip_address: 192.168.0.123 locality: Lab ns_host_location: Lab ns_os_version: CentOS 7 ns_hardware_platform: Lenovo T61 mac_address: - "08:00:27:E3:B1:2D" - "52:54:00:BD:97:1E" state: present
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-host-is-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-host-is-present.yml
Copy to Clipboard Copied!
这个过程会导致在 IdM LDAP 服务器中创建主机条目,但不将主机注册到 IdM Kerberos 域。为此,您必须将主机部署为 IdM 客户端。详情请参阅使用 Ansible playbook 安装身份管理客户端。
验证
以 admin 用户身份登录您的 IdM 服务器:
ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password:
Copy to Clipboard Copied! 输入
ipa host-show
命令并指定主机名称:ipa host-show host01.idm.example.com
$ ipa host-show host01.idm.example.com Host name: host01.idm.example.com Description: Example host Locality: Lab Location: Lab Platform: Lenovo T61 Operating system: CentOS 7 Principal name: host/host01.idm.example.com@IDM.EXAMPLE.COM Principal alias: host/host01.idm.example.com@IDM.EXAMPLE.COM MAC address: 08:00:27:E3:B1:2D, 52:54:00:BD:97:1E Password: False Keytab: False Managed by: host01.idm.example.com
Copy to Clipboard Copied!
输出确认 IdM 中存在 host01.idm.example.com。
18.3. 使用 Ansible playbook 确保存在带有随机密码的多个 IdM 主机条目
freeipa.ansible_freeipa.ipahost
模块允许系统管理员使用一个 Ansible 任务来确保 IdM 中存在或不存在多个主机条目。按照以下流程,确保仅由 完全限定域名
(FQDN)定义的多个主机条目存在。运行 Ansible playbook 会为主机生成随机密码。
如果没有 Ansible,则使用 ipa host-add
命令在 IdM 中创建主机条目。将主机添加到 IdM 的结果是 IdM 中存在的主机状态。由于 Ansible 依赖于 idempotence,要使用 Ansible 将主机添加到 IdM,您必须创建一个 playbook,将主机的状态定义为 present: state: present。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建一个 Ansible playbook 文件,其中包含您要确保的 IdM 中的
完全限定域名
(FQDN)。要使 Ansible playbook 为每个主机生成随机密码,即使主机已在 IdM 中存在,并且update_password
被限于on_create
,请添加random: true
和force: true
选项。要简化此步骤,您可以从/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/README-host.md
Markdown 文件中复制并修改示例:--- - name: Ensure hosts with random password hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Hosts host01.idm.example.com and host02.idm.example.com present with random passwords freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" hosts: - name: host01.idm.example.com random: true force: true - name: host02.idm.example.com random: true force: true register: ipahost
--- - name: Ensure hosts with random password hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Hosts host01.idm.example.com and host02.idm.example.com present with random passwords freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" hosts: - name: host01.idm.example.com random: true force: true - name: host02.idm.example.com random: true force: true register: ipahost
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-are-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-are-present.yml [...] TASK [Hosts host01.idm.example.com and host02.idm.example.com present with random passwords] changed: [server.idm.example.com] => {"changed": true, "host": {"host01.idm.example.com": {"randompassword": "0HoIRvjUdH0Ycbf6uYdWTxH"}, "host02.idm.example.com": {"randompassword": "5VdLgrf3wvojmACdHC3uA3s"}}}
Copy to Clipboard Copied!
要使用随机的一次性密码(OTP)将主机部署为 IdM 客户端,请参阅 使用 Ansible playbook 为 IdM 客户端注册授权选项 或 使用一次性密码安装客户端:交互式安装。
验证
以 admin 用户身份登录您的 IdM 服务器:
ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password:
Copy to Clipboard Copied! 输入
ipa host-show
命令并指定其中一个主机的名称:ipa host-show host01.idm.example.com
$ ipa host-show host01.idm.example.com Host name: host01.idm.example.com Password: True Keytab: False Managed by: host01.idm.example.com
Copy to Clipboard Copied!
输出确认 IdM 中存在 host01.idm.example.com,并带有随机密码。
18.4. 使用 Ansible playbook 确保存在具有多个 IP 地址的 IdM 主机条目
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中存在主机条目。主机条目通过其 完全限定域名
(FQDN)及其多个 IP 地址来定义。
与 ipa host
实用程序不同,Ansible freeipa.ansible_freeipa.ipahost
模块可以确保主机存在或不存在多个 IPv4 和 IPv6 地址。ipa host-mod
命令无法处理 IP 地址。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建 Ansible playbook 文件。将
freeipa.ansible_freeipa.ipahost
变量指定为 freeipa.ansible_freeipa.ipahost 变量,这是您要确保的 IdM 中存在的完全限定域名
(FQDN)。使用
ip_address
语法,在单独的行上指定多个 IPv4 和 IPv6 ip_address 值。要简化此步骤,您可以复制并修改/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/host/host-member-ipaddresses-present.yml
文件中的示例。您还可以包含附加信息:--- - name: Host member IP addresses present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure host101.example.com IP addresses present freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" name: host01.idm.example.com ip_address: - 192.168.0.123 - fe80::20c:29ff:fe02:a1b3 - 192.168.0.124 - fe80::20c:29ff:fe02:a1b4 force: true
--- - name: Host member IP addresses present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure host101.example.com IP addresses present freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" name: host01.idm.example.com ip_address: - 192.168.0.123 - fe80::20c:29ff:fe02:a1b3 - 192.168.0.124 - fe80::20c:29ff:fe02:a1b4 force: true
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-host-with-multiple-IP-addreses-is-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-host-with-multiple-IP-addreses-is-present.yml
Copy to Clipboard Copied!
这个过程在 IdM LDAP 服务器中创建主机条目,但不将主机注册到 IdM Kerberos 域。为此,您必须将主机部署为 IdM 客户端。详情请参阅使用 Ansible playbook 安装身份管理客户端。
验证
以 admin 用户身份登录您的 IdM 服务器:
ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password:
Copy to Clipboard Copied! 输入
ipa host-show
命令并指定主机名称:ipa host-show host01.idm.example.com
$ ipa host-show host01.idm.example.com Principal name: host/host01.idm.example.com@IDM.EXAMPLE.COM Principal alias: host/host01.idm.example.com@IDM.EXAMPLE.COM Password: False Keytab: False Managed by: host01.idm.example.com
Copy to Clipboard Copied! 输出确认 IdM 中存在 host01.idm.example.com。
要验证 IdM DNS 记录中是否存在主机的多个 IP 地址,请输入
ipa dnsrecord-show
命令并指定以下信息:- IdM 域的名称
主机的名称
ipa dnsrecord-show idm.example.com host01
$ ipa dnsrecord-show idm.example.com host01 [...] Record name: host01 A record: 192.168.0.123, 192.168.0.124 AAAA record: fe80::20c:29ff:fe02:a1b3, fe80::20c:29ff:fe02:a1b4
Copy to Clipboard Copied!
输出确认 playbook 中指定的所有 IPv4 和 IPv6 地址都已与 host01.idm.example.com 主机条目正确关联。
18.5. 使用 Ansible playbook 确保没有 IdM 主机条目
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中缺少主机条目。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
创建 Ansible playbook 文件,使其包含没有存在于 IdM 中的主机的
完全限定域名
(FQDN)。如果您的 IdM 域有集成的 DNS,请使用updatedns: true
选项从 DNS 中删除主机的任何类型的关联记录。要简化此步骤,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/host/delete-host.yml
文件中的示例:--- - name: Host absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Host host01.idm.example.com absent freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" name: host01.idm.example.com updatedns: true state: absent
--- - name: Host absent hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Host host01.idm.example.com absent freeipa.ansible_freeipa.ipahost: ipaadmin_password: "{{ ipaadmin_password }}" name: host01.idm.example.com updatedns: true state: absent
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-host-absent.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-host-absent.yml
Copy to Clipboard Copied!
这个过程会产生:
- IdM Kerberos 域中没有的主机。
- IdM LDAP 服务器中不存在主机条目。
要从客户端主机本身中删除系统服务的特定 IdM 配置,如系统安全服务守护进程 (SSSD),您必须在客户端上运行 ipa-client-install --uninstall
命令。详情请参阅卸载 IdM 客户端。
验证
以 admin 用户身份登录
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示 host01.idm.example.com 的信息:
ipa host-show host01.idm.example.com
$ ipa host-show host01.idm.example.com ipa: ERROR: host01.idm.example.com: host not found
Copy to Clipboard Copied!
输出确认 IdM 中不存在该主机。
第 19 章 使用 Ansible playbook 管理主机组
要了解更多有关 身份管理(IdM)中的主机组,以及使用 Ansible 执行身份管理(IdM)中涉及主机组的操作,请参阅:
19.1. IdM 中的主机组
IdM 主机组可用于集中控制重要管理任务,特别是访问控制。
主机组的定义
主机组是包含一组具有通用访问控制规则和其他特征的 IdM 主机的实体。例如,您可以根据公司部门、物理位置或访问控制要求来定义主机组。
IdM 中的主机组可以包括:
- IdM 服务器和客户端
- 其他 IdM 主机组
默认创建的主机组
默认情况下,IdM 服务器为所有 IdM 服务器主机创建主机组 ipaservers
。
直接和间接组成员
IdM 中的组属性同时适用于直接和间接成员:当主机组 B 是主机组 A 的成员时,主机组 B 的所有成员都被视为主机组 A 的间接成员。
19.2. 使用 Ansible playbook 确保存在 IdM 主机组
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中存在名为 databases 的主机组。
如果没有 Ansible,则使用 ipa hostgroup-add
命令在 IdM 中创建主机组条目。将主机组添加到 IdM 的结果是 IdM 中存在主机组的状态。由于 Ansible 依赖幂等性,要使用 Ansible 将主机组添加到 IdM,您必须创建一个 playbook,其中将主机组的状态定义为 present: state: present。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
使用必要的主机组信息,创建 Ansible playbook 文件。要简化这个过程,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/user/ensure-hostgroup-is-present.yml
文件中的示例。--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure host-group databases is present - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases state: present
--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure host-group databases is present - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases state: present
Copy to Clipboard Copied! 在 playbook 中,state: present 表示将主机组添加到 IdM 的请求,除非该主机组在那里已存在。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hostgroup-is-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hostgroup-is-present.yml
Copy to Clipboard Copied!
验证
以
admin
用户身份登录ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 为
admin
请求一个 Kerberos ticket:kinit admin
$ kinit admin Password for admin@IDM.EXAMPLE.COM:
Copy to Clipboard Copied! 显示在 IdM 中存在的主机组的信息,以确保:
ipa hostgroup-show databases
$ ipa hostgroup-show databases Host-group: databases
Copy to Clipboard Copied!
IdM 中存在 databases 主机组。
19.3. 确保使用 Ansible playbook 在 IdM 主机组中存在主机
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中存在主机组中的主机。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - IdM 中已存在您要引用的主机。详情请参阅使用 Ansible playbook 确保存在 IdM 主机条目。
- 您从 Ansible playbook 文件中引用的主机组已添加到 IdM 中。详情请参阅确保使用 Ansible playbook 确保 IdM 主机组存在。
流程
使用必要的主机信息创建 Ansible playbook 文件:
-
使用
freeipa.ansible_freeipa.ipahostgroup
模块的name
变量指定主机组的名称。 -
使用
freeipa.ansible_freeipa.ipahostgroup
模块的主机变量指定主机名。
要简化这个过程,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/hostgroup/ensure-hosts-and-hostgroups-are-present-in-hostgroup.yml
文件中的示例:--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure host-group databases is present - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases host: - db.idm.example.com action: member
--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure host-group databases is present - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases host: - db.idm.example.com action: member
Copy to Clipboard Copied! 此 playbook 将 db.idm.example.com 主机添加到 databases 主机组。
action: member
行表示在 playbook 运行时,不会尝试添加 databases 组本身。相反,只尝试将 db.idm.example.com 添加到数据库。-
使用
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-or-hostgroups-are-present-in-hostgroup.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-or-hostgroups-are-present-in-hostgroup.yml
Copy to Clipboard Copied!
验证
以
admin
用户身份登录ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 为
admin
请求一个 Kerberos ticket:kinit admin
$ kinit admin Password for admin@IDM.EXAMPLE.COM:
Copy to Clipboard Copied! 显示主机组的信息以查看其中存在哪些主机:
ipa hostgroup-show databases
$ ipa hostgroup-show databases Host-group: databases Member hosts: db.idm.example.com
Copy to Clipboard Copied!
db.idm.example.com 主机显示为 databases 主机组的成员。
19.4. 使用 Ansible playbook 嵌套 IdM 主机组
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)主机组中存在嵌套的主机组。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - IdM 中已存在您从 Ansible playbook 文件中引用的主机组。详情请参阅确保使用 Ansible playbook 确保 IdM 主机组存在。
流程
使用必要的主机组信息创建一个 Ansible playbook 文件:
-
为确保嵌套的主机组 A 存在于主机组 B 中:在 Ansible playbook 中的
freeipa.ansible_freeipa.ipahostgroup
任务的变量之间,使用 name 变量指定主机组 B的名称
。 -
使用
hostgroup
变量指定嵌套主机组 A 的名称。
要简化此步骤,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/hostgroup/ensure-hosts-and-hostgroups-are-present-in-hostgroup.yml
文件中的示例:--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure hosts and hostgroups are present in existing databases hostgroup - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases hostgroup: - mysql-server - oracle-server action: member
--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure hosts and hostgroups are present in existing databases hostgroup - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases hostgroup: - mysql-server - oracle-server action: member
Copy to Clipboard Copied! 此 Ansible playbook 确保在 databases 主机组中存在 myqsl-server 和 oracle-server 主机组。
action: member
行表示在 playbook 运行时,不会尝试将 databases 组本身添加到 IdM。-
为确保嵌套的主机组 A 存在于主机组 B 中:在 Ansible playbook 中的
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-or-hostgroups-are-present-in-hostgroup.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-or-hostgroups-are-present-in-hostgroup.yml
Copy to Clipboard Copied!
验证
以
admin
用户身份登录ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 为
admin
请求一个 Kerberos ticket:kinit admin
$ kinit admin Password for admin@IDM.EXAMPLE.COM:
Copy to Clipboard Copied! 显示有关存在嵌套主机组的主机组的信息:
ipa hostgroup-show databases
$ ipa hostgroup-show databases Host-group: databases Member hosts: db.idm.example.com Member host-groups: mysql-server, oracle-server
Copy to Clipboard Copied!
mysql-server 和 oracle-server 主机组存在于 databases 主机组中。
19.5. 使用 Ansible Playbook 在 IDM 主机组中存在成员管理器
以下流程描述了确保使用 Ansible playbook 在 IdM 主机和主机组中存在成员管理器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您必须具有要添加为成员管理器的主机或主机组的名称,以及您要管理的主机组的名称。
流程
使用必要的主机和主机组成员管理信息创建一个 Ansible playbook 文件:
--- - name: Playbook to handle host group membership management hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure member manager user example_member is present for group_name freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_name membermanager_user: example_member - name: Ensure member manager group project_admins is present for group_name freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_name membermanager_group: project_admins
--- - name: Playbook to handle host group membership management hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure member manager user example_member is present for group_name freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_name membermanager_user: example_member - name: Ensure member manager group project_admins is present for group_name freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_name membermanager_group: project_admins
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-member-managers-host-groups.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/add-member-managers-host-groups.yml
Copy to Clipboard Copied!
验证
您可以使用 ipa group-show
命令验证 group_name 组是否包含 example_member 和project_admins 作为成员管理者:
以管理员身份登录到
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示有关 testhostgroup 的信息:
ipaserver]$ ipa hostgroup-show group_name Host-group: group_name Member hosts: server.idm.example.com Member host-groups: testhostgroup2 Membership managed by groups: project_admins Membership managed by users: example_member
ipaserver]$ ipa hostgroup-show group_name Host-group: group_name Member hosts: server.idm.example.com Member host-groups: testhostgroup2 Membership managed by groups: project_admins Membership managed by users: example_member
Copy to Clipboard Copied!
19.6. 使用 Ansible playbook 确保 IdM 主机组中没有主机
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中没有主机组中的主机。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - IdM 中已存在您要引用的主机。详情请参阅使用 Ansible playbook 确保存在 IdM 主机条目。
- IdM 中已存在您从 Ansible playbook 文件中引用的主机组。详情请参阅确保使用 Ansible playbook 确保 IdM 主机组存在。
流程
使用必要的主机和主机组信息创建一个 Ansible playbook 文件:
-
使用
freeipa.ansible_freeipa.ipahostgroup
模块的name
变量指定主机组的名称。 -
使用您要确保的
freeipa.ansible_freeipa.ipahostgroup
模块的主机变量来指定其没有存在于主机组中的主机名称
。
要简化这个过程,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/hostgroup/ensure-hosts-and-hostgroups-are-absent-in-hostgroup.yml
文件中的示例:--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure host-group databases is absent - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases host: - db.idm.example.com action: member state: absent
--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure host-group databases is absent - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases host: - db.idm.example.com action: member state: absent
Copy to Clipboard Copied! 此 playbook 确保 db.idm.example.com 主机没有存在于 databases 主机组中。action: member 行表示在 playbook 运行时,不会尝试删除 databases 组本身。
-
使用
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-or-hostgroups-are-absent-in-hostgroup.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-or-hostgroups-are-absent-in-hostgroup.yml
Copy to Clipboard Copied!
验证
以
admin
用户身份登录ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 为
admin
请求一个 Kerberos ticket:kinit admin
$ kinit admin Password for admin@IDM.EXAMPLE.COM:
Copy to Clipboard Copied! 显示主机组及其包含的主机的信息:
ipa hostgroup-show databases
$ ipa hostgroup-show databases Host-group: databases Member host-groups: mysql-server, oracle-server
Copy to Clipboard Copied!
在 databases 主机组中不存在 db.idm.example.com 主机。
19.7. 使用 Ansible playbook 确保 IdM 主机组没有嵌套的主机组
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中没有来自外部主机组的嵌套主机组。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - IdM 中已存在您从 Ansible playbook 文件中引用的主机组。详情请参阅确保使用 Ansible playbook 确保 IdM 主机组存在。
流程
使用必要的主机组信息创建一个 Ansible playbook 文件:
-
在
freeipa.ansible_freeipa.ipahostgroup
变量中使用 name 变量指定 outer主机组的名称
。 -
使用
hostgroup
变量指定嵌套主机组的名称。
要简化此步骤,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/hostgroup/ensure-hosts-and-hostgroups-are-absent-in-hostgroup.yml
文件中的示例:--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure hosts and hostgroups are absent in existing databases hostgroup - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases hostgroup: - mysql-server - oracle-server action: member state: absent
--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure hosts and hostgroups are absent in existing databases hostgroup - freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases hostgroup: - mysql-server - oracle-server action: member state: absent
Copy to Clipboard Copied! 此 playbook 确保 mysql-server 和 oracle-server 主机组没有存在于 databases 主机组中。
action: member
行表示,在 playbook 运行时,不会尝试确保从 IdM 中删除 databases 组本身。-
在
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-or-hostgroups-are-absent-in-hostgroup.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hosts-or-hostgroups-are-absent-in-hostgroup.yml
Copy to Clipboard Copied!
验证
以 admin 用户身份登录
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 为 admin 请求一个 Kerberos ticket:
kinit admin
$ kinit admin Password for admin@IDM.EXAMPLE.COM:
Copy to Clipboard Copied! 显示应当缺少嵌套主机组的主机组的信息:
ipa hostgroup-show databases
$ ipa hostgroup-show databases Host-group: databases
Copy to Clipboard Copied!
输出确认,外部 databases 主机组中没有mysql-server 和 oracle-server 嵌套式主机组。
19.8. 使用 Ansible playbook 确保没有 IdM 主机组
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中不存在主机组。
如果没有 Ansible,则使用 ipa hostgroup-del
命令从 IdM 中删除主机组条目。从 IdM 中删除主机组的结果是 IdM 中缺少主机组的状态。由于 Ansible 依赖于 idempotence,若要使用 Ansible 从 IdM 中删除主机组,您必须创建一个 playbook,它将主机组的状态定义为 absent: state: absent。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
使用必要的主机组信息,创建 Ansible playbook 文件。要简化此步骤,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/user/ensure-hostgroup-is-absent.yml
文件中的示例。--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - Ensure host-group databases is absent freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases state: absent
--- - name: Playbook to handle hostgroups hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - Ensure host-group databases is absent freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: databases state: absent
Copy to Clipboard Copied! 此 playbook 确保 IdM 中没有 databases 主机组。
state: absent
表示从 IdM 中删除主机组的请求,除非它已被删除。运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hostgroup-is-absent.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-hostgroup-is-absent.yml
Copy to Clipboard Copied!
验证
以
admin
用户身份登录ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 为
admin
请求一个 Kerberos ticket:kinit admin
$ kinit admin Password for admin@IDM.EXAMPLE.COM:
Copy to Clipboard Copied! 显示您没有保证的主机组的信息:
ipa hostgroup-show databases
$ ipa hostgroup-show databases ipa: ERROR: databases: host group not found
Copy to Clipboard Copied!
IdM 中不存在 databases 主机组。
19.9. 使用 Ansible playbook 确保 IdM 主机组中没有成员管理器
以下流程描述了确保使用 Ansible playbook 在 IdM 主机和主机组中存在成员管理器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您必须具有要作为成员管理者删除的用户或用户组的名称,以及它们所管理的主机组的名称。
流程
使用必要的主机和主机组成员管理信息创建一个 Ansible playbook 文件:
--- - name: Playbook to handle host group membership management hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure member manager host and host group members are absent for group_name freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_name membermanager_user: example_member membermanager_group: project_admins action: member state: absent
--- - name: Playbook to handle host group membership management hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure member manager host and host group members are absent for group_name freeipa.ansible_freeipa.ipahostgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: group_name membermanager_user: example_member membermanager_group: project_admins action: member state: absent
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-member-managers-host-groups-are-absent.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-member-managers-host-groups-are-absent.yml
Copy to Clipboard Copied!
验证
您可以使用 ipa group-show
命令验证 group_name 组不包含 example_member 或 project_admins 作为成员管理者:
以管理员身份登录到
ipaserver
:ssh admin@server.idm.example.com
$ ssh admin@server.idm.example.com Password: [admin@server /]$
Copy to Clipboard Copied! 显示有关 testhostgroup 的信息:
ipaserver]$ ipa hostgroup-show group_name Host-group: group_name Member hosts: server.idm.example.com Member host-groups: testhostgroup2
ipaserver]$ ipa hostgroup-show group_name Host-group: group_name Member hosts: server.idm.example.com Member host-groups: testhostgroup2
Copy to Clipboard Copied!
第 20 章 使用 Ansible playbook 定义 IdM 密码策略
本章论述了 RHEL 身份管理(IdM)密码策略,以及如何使用 Ansible playbook 在 IdM 中添加新密码策略。
20.1. 什么是密码策略
密码策略是密码必须满足的一组规则。例如,password 策略可以定义最小密码长度和最大密码生命周期。受此策略影响的所有用户都必须设置足够长的密码,并经常更改密码以满足指定条件。这样,密码策略有助于降低某人发现和滥用用户密码的风险。
20.2. IdM 中的密码策略
密码是 RHEL 身份管理(IdM)用户对 IdM Kerberos 域进行身份验证的最常见方法。密码策略定义了这些 IdM 用户密码必须满足的要求。
IdM 密码策略在底层 LDAP 目录中设置,但 Kerberos 密钥分发中心 (KDC) 强制执行密码策略。
密码策略属性列出了您可以在 IdM 中定义密码策略的属性。
属性 | 介绍 | 示例 |
---|---|---|
Max lifetime | 密码在必须重置密码之前有效的最长时间(以天为单位)。默认值为 90 天。 请注意,如果属性被设为 0,则密码永不过期。 | Max lifetime = 180 用户密码仅 180 天有效。之后,IdM 会提示用户更改它们。 |
Min lifetime | 两个密码更改操作之间必须经过的最短时间(以小时为单位)。 | Min Life = 1 用户更改密码后,他们必须至少等待 1 小时后再重新更改密码。 |
History size | 保存的之前密码的数量。用户无法重复使用其密码历史记录中的密码,但可以重复利用未存储的旧密码。 | History size = 0 在这种情况下,密码历史记录为空,用户可以重复使用他们之前的任何密码。 |
Character classes | 用户必须在密码中使用的不同字符类别的数量。字符类为: * 大写字符 * 小写字符 * 数字 * 特殊字符,如逗号(,)、句点(.)、星号(*) * 其他 UTF-8 字符 当一个字符连续使用三次或更多次时,会将该字符类减一。例如:
*
* | 字符类 = 0
需要的默认类数为 0。要配置数字,请使用 另请参阅此表下的 重要 备注。 |
Min length | 密码中的最少字符数. 如果设置了任何其他 密码策略选项,则密码的最小长度为 6 个字符。 | Min length = 8 用户不能使用少于 8 个字符的密码。 |
Max failures | IdM 锁定用户帐户前允许的失败登录的最多次数。 | Max failures = 6 当用户连续 7 次输入了错误的密码时,IdM 会锁定用户帐户。 |
Failure reset interval | 在这个间隔后 IdM 重置当前失败登录尝试次数(以秒为单位)。 | Failure reset interval = 60
如果用户在 |
锁定持续时间 |
在 | Lockout duration = 600 锁定帐户的用户在 10 分钟内无法登录。 |
如果您一组不同的硬件可能不能使用国际字符和符号,则字符类要求应为英语字母和常用符号。有关密码中的字符类策略的更多信息,请参阅红帽知识库解决方案在 密码中哪些字符是有效的?
20.3. IdM 中的密码策略优先级
密码策略帮助降低某人发现并滥用用户密码的风险。默认密码策略是 全局密码策略。您还可以创建其他组密码策略。全局策略规则适用于所有没有组密码策略的用户。组密码策略适用于相应用户组的所有成员。
请注意,对于任何用户,一次只能有一个密码策略有效。如果用户分配了多个密码策略,则根据以下规则,按照优先级来优先使用:
-
每个组密码策略都设置了优先级。值越低,策略的优先级越高。最低支持的值是
0
。 - 如果多个密码策略适用于用户,则具有最低优先级值的策略优先。其他策略中定义的所有规则都会被忽略。
- 优先级值最低的密码策略适用于所有密码策略属性,即使属性没有在策略中定义。
全局密码策略没有设置优先级值。当没有为用户设置组策略时,它充当回退策略。全局策略永远不会优先于组策略。
ipa pwpolicy-show --user=user_name
命令显示哪个策略当前对特定用户有效。
20.4. 使用 Ansible playbook 在 IdM 中存在密码策略
按照以下步骤,使用 Ansible playbook 在 RHEL Identity Management (IdM)中存在密码策略。
在 IdM 中的默认 global_policy
密码策略中,密码中不同字符类的数量设置为 0。历史记录大小也设置为 0。
完成此步骤,以使用 Ansible playbook 为 IdM 组强制执行更强大的密码策略。
您只能为 IdM 组定义密码策略。您无法为单个用户定义密码策略。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 正在确保 IdM 中存在密码策略的组。
步骤
创建 Ansible playbook 文件,以定义您要确保的密码策略。要简化此步骤,请复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/pwpolicy/pwpolicy_present.yml
文件中的示例:--- - name: Tests hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure presence of pwpolicy for group ops freeipa.ansible_freeipa.ipapwpolicy: ipaadmin_password: "{{ ipaadmin_password }}" name: ops minlife: 7 maxlife: 49 history: 5 priority: 1 lockouttime: 300 minlength: 8 minclasses: 4 maxfail: 3 failinterval: 5
--- - name: Tests hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure presence of pwpolicy for group ops freeipa.ansible_freeipa.ipapwpolicy: ipaadmin_password: "{{ ipaadmin_password }}" name: ops minlife: 7 maxlife: 49 history: 5 priority: 1 lockouttime: 300 minlength: 8 minclasses: 4 maxfail: 3 failinterval: 5
Copy to Clipboard Copied! 有关单个变量含义的详情,请参阅密码策略属性。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/new_pwpolicy_present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/new_pwpolicy_present.yml
Copy to Clipboard Copied!
您已成功使用 Ansible playbook 确保 IdM 中存在 ops 组的密码策略。
ops 密码策略的优先级设置为 1,而 global_policy 密码策略没有设置优先级。因此,ops 策略会自动取代 ops 组的 global_policy,并立即强制执行。
当没有为用户设置任何组策略时,global_policy 充当备份策略,并且永远不会优先于组策略。
20.5. 使用 Ansible playbook 将额外的密码策略选项应用到 IdM 组
您可以使用 Ansible playbook 应用额外的密码策略选项,来为特定的 IdM 组增强密码策略要求。为此,您可以使用 maxrepeat
、maxsequence
、dictcheck
和 usercheck
密码策略选项。这个示例描述了如何为 managers 组设置以下要求:
- 用户的新密码不包含用户对应的用户名。
- 密码不能包含两个连续相同的字符。
- 密码中的任何单调字符序列都不能超过 3 个字符。这意味着系统不接受如 1234 或 abcd 这样序列的密码。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 正在确保 IdM 中存在密码策略的组。
步骤
创建 Ansible playbook 文件 manager_pwpolicy_present.yml,其定义了您要确保其存在的密码策略。要简化此步骤,请复制并修改以下示例:
--- - name: Tests hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure presence of usercheck and maxrepeat pwpolicy for group managers freeipa.ansible_freeipa.ipapwpolicy: ipaadmin_password: "{{ ipaadmin_password }}" name: managers usercheck: True maxrepeat: 2 maxsequence: 3
--- - name: Tests hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure presence of usercheck and maxrepeat pwpolicy for group managers freeipa.ansible_freeipa.ipapwpolicy: ipaadmin_password: "{{ ipaadmin_password }}" name: managers usercheck: True maxrepeat: 2 maxsequence: 3
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/manager_pwpolicy_present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/manager_pwpolicy_present.yml
Copy to Clipboard Copied!
验证
添加名为 test_user 的测试用户:
ipa user-add test_user
$ ipa user-add test_user First name: test Last name: user ---------------------------- Added user "test_user" ----------------------------
Copy to Clipboard Copied! 将 test 用户添加到 managers 组:
- 在 IdM Web UI 中,点 → → 。
- 点 managers。
-
点
Add
。 - 在 Add users to user group 'managers' 页面中,检查 test_user。
-
点击
>
箭头将用户移到 Prospective
列中。 -
点
Add
。
重置测试用户的密码:
- 进入 → 。
- 单击 test_user。
-
在
Actions
菜单中,单击Reset Password
。 - 输入用户的临时密码。
在命令行中,尝试为 test_user 获取 Kerberos 票据授予票据 (TGT):
kinit test_user
$ kinit test_user
Copy to Clipboard Copied! - 输入临时密码。
系统会通知您必须更改密码。输入包含用户名 test_user 的密码:
Password expired. You must change it now. Enter new password: Enter it again: Password change rejected: Password not changed. Unspecified password quality failure while trying to change password. Please try again.
Password expired. You must change it now. Enter new password: Enter it again: Password change rejected: Password not changed. Unspecified password quality failure while trying to change password. Please try again.
Copy to Clipboard Copied! 注意Kerberos 没有精细的错误密码策略报告,在某些情况下,没有提供拒绝密码的明确原因。
系统通知您输入的密码被拒绝。输入包含连续三个或多个相同字符的密码:
Password change rejected: Password not changed. Unspecified password quality failure while trying to change password. Please try again. Enter new password: Enter it again:
Password change rejected: Password not changed. Unspecified password quality failure while trying to change password. Please try again. Enter new password: Enter it again:
Copy to Clipboard Copied! 系统通知您输入的密码被拒绝。输入一个包含 3 个以上字符的单调字符序列的密码。此类序列的示例包括 1234 和 fedc :
Password change rejected: Password not changed. Unspecified password quality failure while trying to change password. Please try again. Enter new password: Enter it again:
Password change rejected: Password not changed. Unspecified password quality failure while trying to change password. Please try again. Enter new password: Enter it again:
Copy to Clipboard Copied! 系统通知您输入的密码被拒绝。输入满足 managers 密码策略条件的密码:
Password change rejected: Password not changed. Unspecified password quality failure while trying to change password. Please try again. Enter new password: Enter it again:
Password change rejected: Password not changed. Unspecified password quality failure while trying to change password. Please try again. Enter new password: Enter it again:
Copy to Clipboard Copied!
验证您是否已获得 TGT,这只有在输入了有效密码后才有可能:
klist
$ klist Ticket cache: KCM:0:33945 Default principal: test_user@IDM.EXAMPLE.COM Valid starting Expires Service principal 07/07/2021 12:44:44 07/08/2021 12:44:44 krbtgt@IDM.EXAMPLE.COM@IDM.EXAMPLE.COM
Copy to Clipboard Copied!
第 21 章 使用 Ansible playbook 管理 sudo 访问权限
了解有关使用 Ansible playbook 在 RHEL 身份管理中管理用户的 sudo
访问权限的更多信息。有关在 RHEL 身份管理中授予用户 sudo
访问权限的详情,请参阅 授予 IdM 客户端上 IdM 用户的 sudo 访问权限。
21.1. 使用 Ansible playbook 确保 IdM 客户端上的 IdM 用户具有 sudo 访问权限
在 RHEL Identity Management (IdM)中,您可以确保对特定命令的 sudo
访问权限被授予到特定 IdM 主机上的 IdM 用户帐户。
完成此流程以确保名为 idm_user_reboot 的 sudo
规则存在。该规则授予 idm_user 在 idmclient 机器上运行 /usr/sbin/reboot
命令的权限。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已确保 IdM 中存在 idm_user 用户帐户,并通过为用户创建密码解锁帐户。有关使用命令行添加新 IdM 用户的详情,请参阅 使用命令行添加用户。
-
idmclient 中没有本地 idm_user 帐户。idm_user 用户未列在 idmclient 上的
/etc/passwd
文件中。
步骤
添加一个或多个
sudo
命令:创建一个
ensure-reboot-sudocmd-is-present.yml
Ansible playbook,来确保sudo
命令的 IdM 数据库中存在/usr/sbin/reboot
命令。要简化此步骤,您可以复制并修改/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/sudocmd/ensure-sudocmd-is-present.yml
文件中的示例:--- - name: Playbook to manage sudo command hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure sudo command is present - freeipa.ansible_freeipa.ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" name: /usr/sbin/reboot state: present
--- - name: Playbook to manage sudo command hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure sudo command is present - freeipa.ansible_freeipa.ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" name: /usr/sbin/reboot state: present
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-reboot-sudocmd-is-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-reboot-sudocmd-is-present.yml
Copy to Clipboard Copied!
创建一个引用命令的
sudo
规则:创建一个
ensure-sudorule-for-idmuser-on-idmclient-is-present.yml
Ansible playbook,来使用sudo
命令条目确保存在 sudo 规则。sudo 规则允许 idm_user 重新启动 idmclient 机器。要简化此步骤,您可以复制并修改/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/sudorule/ensure-sudorule-is-present.yml
文件中的示例:--- - name: Tests hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure a sudorule is present granting idm_user the permission to run /usr/sbin/reboot on idmclient - freeipa.ansible_freeipa.ipasudorule: ipaadmin_password: "{{ ipaadmin_password }}" name: idm_user_reboot description: A test sudo rule. allow_sudocmd: /usr/sbin/reboot host: idmclient.idm.example.com user: idm_user state: present
--- - name: Tests hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure a sudorule is present granting idm_user the permission to run /usr/sbin/reboot on idmclient - freeipa.ansible_freeipa.ipasudorule: ipaadmin_password: "{{ ipaadmin_password }}" name: idm_user_reboot description: A test sudo rule. allow_sudocmd: /usr/sbin/reboot host: idmclient.idm.example.com user: idm_user state: present
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-sudorule-for-idmuser-on-idmclient-is-present.yml
$ ansible-playbook -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-sudorule-for-idmuser-on-idmclient-is-present.yml
Copy to Clipboard Copied!
验证
通过验证 idm_user 能够使用 sudo
重启 idmclient,来测试您在 IdM 服务器上确认其存在性的 sudo
规则是否在 idmclient 上可以工作。请注意,可能需要过几分钟后,服务器上所做的更改才会对客户端生效。
- 以 idm_user 用户身份登录到 idmclient。
使用
sudo
重新启动计算机。在提示时输入 idm_user 的密码:sudo /usr/sbin/reboot
$ sudo /usr/sbin/reboot [sudo] password for idm_user:
Copy to Clipboard Copied!
如果正确配置了 sudo
,则机器将重启。
21.2. 在单个 Ansible 任务中管理多个 IdM sudo 规则
使用 freeipa.ansible_freeipa.ipasudorule
collection 模块中提供的 sudorules
选项,您可以确保单个 Ansible 任务中存在或不存在多个身份管理(IdM) sudo
规则。使用 选项,您可以更轻松地定义 sudo
规则,并更有效地执行它们。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
您已安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
这个示例额外假设以下内容:
- IdM 中存在 user01 和 user02 用户。
- IdM 中存在 usergroup01 用户组。
- IdM 中存在 hostgroup01 和 hostgroup02 主机组。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 使用以下内容创建 ensure-presence-of-multiple-sudorules-in-a-task.yml 文件:
--- - name: Playbook to handle sudorules hosts: ipaserver become: true tasks: # Ensure sudo command name: /usr/sbin/dmidecode is present - freeipa.ansible_freeipa.ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" name: /usr/sbin/dmidecode # Ensure sudo command /usr/sbin/reboot is present - freeipa.ansible_freeipa.ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" name: /usr/sbin/reboot # Ensure sudo command /usr/bin/yum is present - freeipa.ansible_freeipa.ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" name: /usr/bin/yum # Ensure a sudo command group is present - freeipa.ansible_freeipa.ipasudocmdgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: sudogroup01 sudocmd: - /usr/sbin/dmidecode - /usr/sbin/reboot - name: Ensure multiple sudo rules are present using batch mode freeipa.ansible_freeipa.ipasudorule: ipaadmin_password: "{{ ipaadmin_password }}" sudorules: - name: testrule01 user: - user01 - user02 group: - usergroup01 allow_sudocmd: - /usr/bin/yum allow_sudocmdgroup: - sudogroup01 - name: testrule02 hostgroup: - hostgroup01 - hostgroup02
--- - name: Playbook to handle sudorules hosts: ipaserver become: true tasks: # Ensure sudo command name: /usr/sbin/dmidecode is present - freeipa.ansible_freeipa.ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" name: /usr/sbin/dmidecode # Ensure sudo command /usr/sbin/reboot is present - freeipa.ansible_freeipa.ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" name: /usr/sbin/reboot # Ensure sudo command /usr/bin/yum is present - freeipa.ansible_freeipa.ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" name: /usr/bin/yum # Ensure a sudo command group is present - freeipa.ansible_freeipa.ipasudocmdgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: sudogroup01 sudocmd: - /usr/sbin/dmidecode - /usr/sbin/reboot - name: Ensure multiple sudo rules are present using batch mode freeipa.ansible_freeipa.ipasudorule: ipaadmin_password: "{{ ipaadmin_password }}" sudorules: - name: testrule01 user: - user01 - user02 group: - usergroup01 allow_sudocmd: - /usr/bin/yum allow_sudocmdgroup: - sudogroup01 - name: testrule02 hostgroup: - hostgroup01 - hostgroup02
Copy to Clipboard Copied! - 注意
-
使用
sudorules
选项,您可以指定多个仅适用于特定sudo
规则的sudo
规则变量。此sudo
规则由name
变量定义,它是sudorules
选项的唯一强制的变量。在示例中,用户
、组
、allow_sudocmd
和allow_sudocmdgroup
变量应用到 testrule01sudo
规则。
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory ensure-presence-of-multiple-sudorules-in-a-task.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory ensure-presence-of-multiple-sudorules-in-a-task.yml
Copy to Clipboard Copied!
第 22 章 确保使用 Ansible playbook 的基于主机的访问控制规则在 IdM 中存在
Ansible 是一个自动化工具,用于配置系统、部署软件和执行滚动更新。它包括对身份管理(IdM)的支持。
了解更多有关基于身份管理 (IdM) 主机的访问策略的信息,以及如何使用 Ansible 定义它们。
22.1. IdM 中基于主机的访问控制规则
基于主机的访问控制(HBAC)规则定义哪些用户或用户组可以通过哪些服务或服务组中的哪些服务来访问哪些主机或主机组。作为系统管理员,您可以使用 HBAC 规则来实现以下目标:
- 将您域中对指定系统的访问权限限制为特定用户组的成员。
- 仅允许使用特定服务来访问域中的系统。
默认情况下,IdM 是使用一个名为 allow_all 的默认 HBAC 规则配置的,这意味着每个用户都可以通过整个 IdM 域中每个相关服务对每个主机进行通用访问。
您可以通过将默认的 allow_all 规则替换为您自己的一组 HBAC 规则来微调对不同主机的访问。对于集中式和简化的访问控制管理,您可以将 HBAC 规则应用到用户组、主机组或服务组,而不是单个用户、主机或服务。
22.2. 使用 Ansible playbook 确保在 IdM 中存在 HBAC 规则
按照以下步骤,确保使用 Ansible playbook 在 RHEL Identity Management (IdM)中存在基于主机的访问控制(HBAC)规则。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - IdM 中存在您要用于 HBAC 规则的用户和用户组。详情请参阅 使用 Ansible playbook 管理用户帐户 ,以及 使用 Ansible playbook 确保 IdM 组和组成员存在。
- 您要应用 HBAC 规则的主机和主机组在 IdM 中存在。详情请参阅 使用 Ansible playbook 管理主机,以及 使用 Ansible playbook 管理主机组。
流程
创建 Ansible playbook 文件,该文件定义您要确保其存在的 HBAC 策略。要简化此步骤,您可以复制并修改
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/hbacrule/ensure-hbacrule-allhosts-present.yml
文件中的示例:--- - name: Playbook to handle hbacrules hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure idm_user can access client.idm.example.com via the sshd service - freeipa.ansible_freeipa.ipahbacrule: ipaadmin_password: "{{ ipaadmin_password }}" name: login user: idm_user host: client.idm.example.com hbacsvc: - sshd state: present
--- - name: Playbook to handle hbacrules hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure idm_user can access client.idm.example.com via the sshd service - freeipa.ansible_freeipa.ipahbacrule: ipaadmin_password: "{{ ipaadmin_password }}" name: login user: idm_user host: client.idm.example.com hbacsvc: - sshd state: present
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-new-hbacrule-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-new-hbacrule-present.yml
Copy to Clipboard Copied!
验证
- 以管理员身份登录到 IdM Web UI。
- 导航到 Policy → Host-Based-Access-Control → HBAC Test。
- 在 Who 选项卡中,选择 idm_user。
- 在 Accessing 选项卡中,选择 client.idm.example.com。
- 在 Via service 选项卡中,选择 sshd。
- 在 Rules 选项卡中,选择 login。
- 在 Run test 选项卡中,单击 Run test 按钮。如果您看到 ACCESS GRANTED,则 HBAC 规则成功实现。
第 23 章 使用 Ansible 管理 IdM 证书
您可以使用 ansible-freeipa
ipacert
模块为 RHEL Identity Management (IdM)用户、主机和服务请求、撤销和检索 SSL 证书。您还可以恢复已搁置的证书。
23.1. 使用 Ansible 为 IdM 主机、服务和用户请求 SSL 证书
您可以使用 ansible-freeipa
freeipa.ansible_freeipa.ipacert
模块为 RHEL Identity Management (IdM)用户、主机和服务请求 SSL 证书。然后,他们可以使用这些证书向 IdM 进行身份验证。
完成此流程,使用 Ansible playbook 从 IdM 证书颁发机构(CA)为 HTTP 服务器请求一个证书。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您的 IdM 部署有一个集成的 CA。
流程
为您的用户、主机或服务生成证书签名请求(CSR)。例如,要使用
openssl
工具为运行在 client.idm.example.com 上的HTTP
服务生成一个 CSR,请输入:openssl req -new -newkey rsa:2048 -days 365 -nodes -keyout new.key \ -out new.csr -subj '/CN=client.idm.example.com,O=IDM.EXAMPLE.COM'
# openssl req -new -newkey rsa:2048 -days 365 -nodes -keyout new.key \ -out new.csr -subj '/CN=client.idm.example.com,O=IDM.EXAMPLE.COM'
Copy to Clipboard Copied! 因此,CSR 存储在 new.csr 中。
使用以下内容创建 Ansible playbook 文件 request-certificate.yml :
--- - name: Playbook to request a certificate hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Request a certificate for a web server freeipa.ansible_freeipa.ipacert: ipaadmin_password: "{{ ipaadmin_password }}" state: requested csr: | -----BEGIN CERTIFICATE REQUEST----- MIGYMEwCAQAwGTEXMBUGA1UEAwwOZnJlZWlwYSBydWxlcyEwKjAFBgMrZXADIQBs HlqIr4b/XNK+K8QLJKIzfvuNK0buBhLz3LAzY7QDEqAAMAUGAytlcANBAF4oSCbA 5aIPukCidnZJdr491G4LBE+URecYXsPknwYb+V+ONnf5ycZHyaFv+jkUBFGFeDgU SYaXm/gF8cDYjQI= -----END CERTIFICATE REQUEST----- principal: HTTP/client.idm.example.com register: cert
--- - name: Playbook to request a certificate hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Request a certificate for a web server freeipa.ansible_freeipa.ipacert: ipaadmin_password: "{{ ipaadmin_password }}" state: requested csr: | -----BEGIN CERTIFICATE REQUEST----- MIGYMEwCAQAwGTEXMBUGA1UEAwwOZnJlZWlwYSBydWxlcyEwKjAFBgMrZXADIQBs HlqIr4b/XNK+K8QLJKIzfvuNK0buBhLz3LAzY7QDEqAAMAUGAytlcANBAF4oSCbA 5aIPukCidnZJdr491G4LBE+URecYXsPknwYb+V+ONnf5ycZHyaFv+jkUBFGFeDgU SYaXm/gF8cDYjQI= -----END CERTIFICATE REQUEST----- principal: HTTP/client.idm.example.com register: cert
Copy to Clipboard Copied! 将证书请求替换为 new.csr 中的 CSR。
请求证书:
ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/request-certificate.yml
$ ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/request-certificate.yml
Copy to Clipboard Copied!
23.2. 使用 Ansible 为 IdM 主机、服务和用户撤销 SSL 证书
您可以使用 ansible-freeipa
freeipa.ansible_freeipa.ipacert
模块撤销 RHEL 身份管理(IdM)用户、主机和服务用来向 IdM 进行身份验证的 SSL 证书。
完成此流程,使用 Ansible playbook 为 HTTP 服务器撤销一个证书。吊销证书的原因是"keyCompromise"。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 -
您已得到了证书的序列号,例如通过输入
openssl x509 -noout -text -in <path_to_certificate>
命令。在本例中,证书的序列号为 123456789。 - 您的 IdM 部署有一个集成的 CA。
流程
使用以下内容创建 Ansible playbook 文件 revoke-certificate.yml :
--- - name: Playbook to revoke a certificate hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Revoke a certificate for a web server freeipa.ansible_freeipa.ipacert: ipaadmin_password: "{{ ipaadmin_password }}" serial_number: 123456789 revocation_reason: "keyCompromise" state: revoked
--- - name: Playbook to revoke a certificate hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Revoke a certificate for a web server freeipa.ansible_freeipa.ipacert: ipaadmin_password: "{{ ipaadmin_password }}" serial_number: 123456789 revocation_reason: "keyCompromise" state: revoked
Copy to Clipboard Copied! 撤销证书:
ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/revoke-certificate.yml
$ ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/revoke-certificate.yml
Copy to Clipboard Copied!
23.3. 使用 Ansible 为 IdM 用户、主机和服务恢复 SSL 证书
您可以使用 ansible-freeipa
ipacert
模块恢复之前由 RHEL 身份管理(IdM)用户、主机或服务向 IdM 进行身份验证的已撤销的 SSL 证书。
您只能恢复搁置的证书。您可能已将其搁置,例如,您不确定私钥是否已丢失。但是,您现在已恢复了密钥,并且您确定没有人在同时访问它,所以您希望重新恢复证书。
完成此流程,使用 Ansible playbook 为注册到 IdM 的服务的搁置的证书发布一个证书。这个示例描述了如何为 HTTP 服务的搁置的证书发布一个证书。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
- 您的 IdM 部署有一个集成的 CA。
-
您已得到证书的序列号,例如通过输入
openssl x509 -noout -text -in path/to/certificate
命令。在本例中,证书序列号为 123456789。
流程
使用以下内容创建 Ansible playbook 文件 restore-certificate.yml :
--- - name: Playbook to restore a certificate hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Restore a certificate for a web service ipacert: ipaadmin_password: "{{ ipaadmin_password }}" serial_number: 123456789 state: released
--- - name: Playbook to restore a certificate hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Restore a certificate for a web service ipacert: ipaadmin_password: "{{ ipaadmin_password }}" serial_number: 123456789 state: released
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/restore-certificate.yml
$ ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/restore-certificate.yml
Copy to Clipboard Copied!
23.4. 使用 Ansible 为 IdM 用户、主机和服务检索 SSL 证书
您可以使用 ansible-freeipa
freeipa.ansible_freeipa.ipacert
模块检索为 RHEL 身份管理(IdM)用户、主机或服务发布的 SSL 证书,并将它存储在受管节点上的文件中。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 -
您已得到了证书的序列号,例如通过输入
openssl x509 -noout -text -in <path_to_certificate>
命令。在本例中,证书的序列号为 123456789,存储检索到的证书的文件是 cert.pem。
流程
使用以下内容创建 Ansible playbook 文件 retrieve-certificate.yml :
--- - name: Playbook to retrieve a certificate and store it locally on the managed node hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve a certificate and save it to file 'cert.pem' freeipa.ansible_freeipa.ipacert: ipaadmin_password: "{{ ipaadmin_password }}" serial_number: 123456789 certificate_out: cert.pem state: retrieved
--- - name: Playbook to retrieve a certificate and store it locally on the managed node hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve a certificate and save it to file 'cert.pem' freeipa.ansible_freeipa.ipacert: ipaadmin_password: "{{ ipaadmin_password }}" serial_number: 123456789 certificate_out: cert.pem state: retrieved
Copy to Clipboard Copied! 检索证书:
ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/retrieve-certificate.yml
$ ansible-playbook --vault-password-file=password_file -v -i <path_to_inventory_directory>/hosts <path_to_playbooks_directory>/retrieve-certificate.yml
Copy to Clipboard Copied!
第 24 章 IdM 中的 vault
在 RHEL 身份管理(IdM)中了解更多有关 vault 的信息。
24.1. vaults 及其优势
您可以使用 RHEL 身份管理(IdM)密码库来保持安全存储的所有敏感数据,但方便在一个位置。
vault 是 IdM 中的安全位置,用于存储、检索、共享和恢复 secret。secret 是安全敏感数据,通常是身份验证凭据,只有有限的人员或实体可以访问这些数据。例如,secret 包括:
- 密码
- PIN
- 私有 SSH 密钥
密码库与密码管理器相当。正如密码管理器一样,密码库通常要求用户生成并记住一个主密码来解锁和访问密码库中存储的任何信息。但是,用户也可以决定拥有标准密码库。标准密码库不要求用户输入任何密码来访问密码库中存储的 secret。
IdM 中的密码库的目的是存储身份验证凭据,允许您向外部的非IdM 相关服务进行身份验证。
IdM 密码库的特征如下:
- Vault 只能供 vault 所有者和 vault 所有者选择为 vault 成员的 IdM 用户访问。另外,IdM 管理员还可以访问所有密码库。
- 如果用户没有足够的特权来创建密码库,IdM 管理员可以创建密码库并将该用户设置为其所有者。
- 用户和服务可从 IdM 域注册的任何机器访问存储在密码库中的 secret。
- 个密码库只能包含一个机密,例如一个文件。但是,文件本身可以包含多个机密,如密码、密钥选项卡或证书。
Vault 仅在 IdM 命令行(CLI)中可用,不能来自 IdM Web UI。
24.2. Vault 所有者、成员和管理员
RHEL 身份管理(IdM)区分以下 vault 用户类型:
- Vault 所有者
vault 所有者是具有密码库基本管理权限的用户或服务。例如,密码库所有者可以修改密码库的属性或添加新的 vault 成员。
每个密码库必须至少有一个所有者。库也可以有多个所有者。
- Vault 成员
- vault 成员是可以访问由其他用户或服务创建的库的用户或服务。
- Vault 管理员
Vault 管理员不受限制地访问所有密码库,并有权执行所有密码库操作。在 IdM 基于角色的访问控制(RBAC)的上下文中,vault 管理员是任何具有
Vault Administrators
特权的 IdM 用户。注意对称和非对称密码库 通过密码或密钥进行保护。特殊访问控制规则适用于管理员:
- 访问对称和非对称密码库中的机密。
- 更改或重置 vault 密码或密钥。
- Vault 用户
vault 用户代表密码库所在的容器的用户。
Vault 用户信息
在特定命令的输出中显示,如ipa vault-show
:ipa vault-show my_vault
$ ipa vault-show my_vault Vault name: my_vault Type: standard Owner users: user Vault user: user
Copy to Clipboard Copied! 有关 vault 容器和用户密码库的详情,请参阅 Vault 容器。
24.3. 标准、对称和非对称密码库
根据安全性和访问控制级别,IdM 将密码库分类为以下类型:
- 标准密码库
- Vault 所有者和密码库成员可以归档和检索密码库内的机密,而无需使用密码或密钥。
- 对称密码库
- 库中的机密通过对称密钥进行保护。Vault 所有者和成员可以归档和检索机密,但必须提供 vault 密码。
- 非对称密码库
- 库中的机密通过非对称密钥进行保护。用户使用公钥存档机密,并使用私钥检索该机密。Vault 所有者可以同时存档和检索机密。Vault 成员只能归档机密。
24.5. Vault 容器
vault 容器是密码库的集合。下表列出了 RHEL 身份管理(IdM)提供的默认 vault 容器。
Type | 描述 | 目的 |
---|---|---|
用户容器 | 用户的私有容器 | 为特定用户存储用户密码库 |
服务容器 | 服务的私有容器 | 为特定服务存储服务库 |
共享容器 | 用于多个用户和服务的容器 | 存储可由多个用户或服务共享的 vault |
当为用户或服务创建第一个私有密码库时,IdM 会自动为每个用户或服务创建用户和服务容器。删除用户或服务后,IdM 会删除容器及其内容。
24.6. 基本 IdM vault 命令
您可以使用以下介绍的基本命令来管理身份管理(IdM) vault。下表 包含 ipa vault-*
命令的列表,并解释了它们的用途。
在运行任何 ipa vault-*
命令前,请将密钥恢复授权 (KRA) 证书系统组件安装到 IdM 域中的一个或多个服务器上。详情请参阅在 IdM 中安装密钥恢复授权。
命令 | 目的 |
---|---|
| 显示有关 IdM 库和示例密码库命令的概念信息。 |
|
在特定的 |
| 将用户 vault 作为 vault 成员访问时,您必须指定 vault 所有者。如果您没有指定 vault 所有者,IdM 会通知您没有找到密码库: ipa vault-show user_vault
|
| 在访问共享密码库时,您必须指定您要访问的 vault 是共享密码库。否则,IdM 会通知您没有找到密码库: ipa vault-show shared_vault
|
24.7. 在 IdM 中安装密钥恢复授权
按照以下步骤,通过在特定的 IdM 服务器上安装密钥恢复授权(KRA)证书系统(CS)组件来在 RHEL 身份管理(IdM)中启用密码库。
先决条件
-
您已以
root
身份登录到 IdM 服务器。 - IdM 证书颁发机构已安装在 IdM 服务器上。
-
您有
目录管理器
凭证。
流程
安装 KRA:
ipa-kra-install
# ipa-kra-install
Copy to Clipboard Copied!
要使密码库服务高可用且具有弹性,请在两个或多个 IdM 服务器上安装 KRA。维护多个 KRA 服务器可防止数据丢失。
您可以在隐藏的副本上安装 IdM 集群的第一个 KRA。但是,在在非隐藏的副本上安装 KRA 克隆前,安装额外的 KRA 克隆需要临时激活隐藏的副本。然后您可以再次隐藏原始隐藏的副本。
第 25 章 使用 Ansible 管理 IdM 用户库:存储和检索 secret
本章论述了如何使用 Ansible vault 模块在 RHEL 身份管理(IdM)中管理用户 密码库
。具体来说,它描述了 IdM 用户如何使用 Ansible playbook 执行以下三个操作:
用户可以通过两个不同的 IdM 客户端进行存储和检索。
先决条件
- 密钥恢复授权中心 (KRA) 证书系统组件已安装在您的 IdM 域中的一个或多个服务器上。详情请参阅在 IdM 中安装密钥恢复授权。
25.1. 使用 Ansible 在 IdM 中存在标准用户库
按照以下流程,使用 Ansible playbook 创建一个带有一个或多个私有 vault 的 vault 容器,以安全地存储敏感信息。在以下步骤中使用的示例中,idm_user 用户创建名为 my_vault 的标准类型库。标准密码库类型确保无需 idm_user 在访问该文件时进行身份验证。idm_user 能够从用户登录的任何 IdM 客户端检索 文件。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您知道 idm_user 的密码。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 ensure-standard-vault-is-present.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/ensure-standard-vault-is-present.yml ensure-standard-vault-is-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/ensure-standard-vault-is-present.yml ensure-standard-vault-is-present-copy.yml
Copy to Clipboard Copied! - 打开 ensure-standard-vault-is-present-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来调整文件:-
将
ipaadmin_principal
变量设置为 idm_user。 -
将
ipaadmin_password
变量设置为 idm_user 密码。 -
将
user
变量设置为 idm_user。 -
将
name
变量设置为 my_vault。 将
vault_type
变量设置为 standard。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault vault_type: standard
--- - name: Tests hosts: ipaserver gather_facts: false tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault vault_type: standard
Copy to Clipboard Copied! -
将
- 保存这个文件。
运行 playbook:
ansible-playbook -v -i inventory ensure-standard-vault-is-present-copy.yml
$ ansible-playbook -v -i inventory ensure-standard-vault-is-present-copy.yml
Copy to Clipboard Copied!
25.2. 使用 Ansible 将 secret 归档到 IdM 中的标准用户库中
按照以下流程,使用 Ansible playbook 将敏感信息存储在个人 vault 中。在使用的示例中,idm_user 用户在名为 my_vault 的库中归档含有名为 password.txt 的敏感信息的文件。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您知道 idm_user 的密码。
- idm_user 是所有者,或者至少是 my_vault 的成员用户。
- 您可以访问 password.txt,这是要在 my_vault 中存档的机密。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 data-archive-in-symmetric-vault.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/data-archive-in-symmetric-vault.yml data-archive-in-standard-vault-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/data-archive-in-symmetric-vault.yml data-archive-in-standard-vault-copy.yml
Copy to Clipboard Copied! - 打开 data-archive-in-standard-vault-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来调整文件:-
将
ipaadmin_principal
变量设置为 idm_user。 -
将
ipaadmin_password
变量设置为 idm_user 密码。 -
将
user
变量设置为 idm_user。 -
将
name
变量设置为 my_vault。 -
将
in
变量设置为包含敏感信息的文件的完整路径。 将
action
变量设置为 member。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault in: /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/password.txt action: member
--- - name: Tests hosts: ipaserver gather_facts: false tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault in: /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/password.txt action: member
Copy to Clipboard Copied! -
将
- 保存这个文件。
运行 playbook:
ansible-playbook -v -i inventory data-archive-in-standard-vault-copy.yml
$ ansible-playbook -v -i inventory data-archive-in-standard-vault-copy.yml
Copy to Clipboard Copied!
25.3. 使用 Ansible 从 IdM 中的标准用户库检索 secret
按照以下流程,使用 Ansible playbook 从用户个人 vault 中检索 secret。在以下步骤中使用的示例中,idm_user 用户从名为 my_vault 的标准类型库检索包含敏感数据的文件,并检索名为 host01 的 IdM 客户端。idm_user 在访问该文件时不必进行身份验证。idm_user 可以使用 Ansible 从安装 Ansible 的任何 IdM 客户端检索 文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您知道 idm_user 的密码。
- idm_user 是 my_vault 的所有者。
- idm_user 已将 secret 存储在 my_vault 中。
- Ansible 可以写入要检索该 secret 的 IdM 主机上的 目录。
- idm_user 可以从要检索 secret 的 IdM 主机上的 目录读取。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 打开清单文件,并在一个明确定义的部分中提到您要检索该 secret 的 IdM 客户端。例如,要指示 Ansible 在 host01.idm.example.com 上检索 secret,请输入:
[ipahost] host01.idm.example.com
[ipahost] host01.idm.example.com
Copy to Clipboard Copied! 从相关集合目录中生成 retrive-data-symmetric-vault.yml Ansible playbook 文件的副本。将 "symmetric" 替换为 "standard"。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/retrive-data-symmetric-vault.yml retrieve-data-standard-vault.yml-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/retrive-data-symmetric-vault.yml retrieve-data-standard-vault.yml-copy.yml
Copy to Clipboard Copied! - 打开 retrieve-data-standard-vault.yml-copy.yml 文件进行编辑。
-
通过将
hosts
变量设置为 ipahost 来调整 文件。 通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来调整文件:-
将
ipaadmin_principal
变量设置为 idm_user。 -
将
ipaadmin_password
变量设置为 idm_user 密码。 -
将
user
变量设置为 idm_user。 -
将
name
变量设置为 my_vault。 -
将
out
变量设置为您要将 secret 导出到的文件的完整路径。 将
state
变量设置为 retrieve。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipahost gather_facts: false tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault out: /tmp/password_exported.txt state: retrieved
--- - name: Tests hosts: ipahost gather_facts: false tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault out: /tmp/password_exported.txt state: retrieved
Copy to Clipboard Copied! -
将
- 保存这个文件。
运行 playbook:
ansible-playbook -v -i inventory retrieve-data-standard-vault.yml-copy.yml
$ ansible-playbook -v -i inventory retrieve-data-standard-vault.yml-copy.yml
Copy to Clipboard Copied!
验证
以 user01 身份通过
SSH
连接到 host01:ssh user01@host01.idm.example.com
$ ssh user01@host01.idm.example.com
Copy to Clipboard Copied! 查看 Ansible playbook 文件中
out
变量指定的文件:vim /tmp/password_exported.txt
$ vim /tmp/password_exported.txt
Copy to Clipboard Copied!
现在,您可以看到导出的 secret。
-
有关使用 Ansible 管理 IdM vaults 和用户 secret 以及 playbook 变量的更多信息,请参阅
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/
ansible_freeipa/ 目录中的 README-vault.md Markdown 文件,请参阅/usr/share/ansible/collections/ansible_collections/freeipa/playbooks/vault/ 目录中的示例 playbook
。
第 26 章 使用 Ansible 管理 IdM 服务库:存储和检索 secret
本节介绍管理员可以如何使用 ansible-freeipa
vault
模块安全地将服务 secret 存储在集中式位置。示例中使用的 vault 是非对称的,这意味着要使用它,管理员需要执行以下步骤:
-
使用
openssl
实用程序生成私钥。 - 根据私钥生成公钥。
当管理员将服务 secret 归档到密码库时,会用公钥对其进行加密。之后,托管在域中特定计算机上的服务实例使用私钥检索该 secret。只有服务和管理员可以访问该 secret。
如果该机密泄露,管理员可以在服务 vault 中替换它,然后将它重新分发到尚未遭入侵的服务实例。
先决条件
- 密钥恢复授权中心 (KRA) 证书系统组件已安装在您的 IdM 域中的一个或多个服务器上。详情请参阅在 IdM 中安装密钥恢复授权。
在以下步骤中:
- admin 是管理服务密码的管理员。
- private-key-to-an-externally-certificate.pem 是包含服务 secret 的文件,本例中为外部签名证书的私钥。请勿将此私钥与用于从密码库检索机密的私钥混淆。
- secret_vault 是为存储服务 secret 而创建的库。
- HTTP/webserver1.idm.example.com 是密码库的所有者服务。
- HTTP/webserver2.idm.example.com 和 HTTP/webserver3.idm.example.com 是 vault 成员服务。
- service-public.pem 是用于加密 password_vault 中存储的密码的服务公钥。
- service-private.pem 是用于解密 secret_vault 中存储的密码的服务私钥。
26.1. 使用 Ansible 在 IdM 中存在非对称服务库
按照以下流程,使用 Ansible playbook 创建一个带有一个或多个私有 vault 的服务 vault 容器,以安全地存储敏感信息。在以下流程中使用的示例中,管理员创建名为 secret_vault 的非对称库。这样可确保 vault 成员必须使用私钥进行身份验证,以检索 vault 中的 secret。vault 成员能够从任何 IdM 客户端检索 文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 获取服务实例的公钥。例如,使用
openssl
工具:生成
service-private.pem
私钥。openssl genrsa -out service-private.pem 2048
$ openssl genrsa -out service-private.pem 2048 Generating RSA private key, 2048 bit long modulus .+++ ...........................................+++ e is 65537 (0x10001)
Copy to Clipboard Copied! 根据私钥生成
service-public.pem
公钥。openssl rsa -in service-private.pem -out service-public.pem -pubout
$ openssl rsa -in service-private.pem -out service-public.pem -pubout writing RSA key
Copy to Clipboard Copied!
从相关集合目录中生成 ensure-asymmetric-vault-is-present.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/ensure-asymmetric-vault-is-present.yml ensure-asymmetric-service-vault-is-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/ensure-asymmetric-vault-is-present.yml ensure-asymmetric-service-vault-is-present-copy.yml
Copy to Clipboard Copied! - 打开 ensure-asymmetric-vault-is-present-copy.yml 文件进行编辑。
- 添加一个任务,该任务将 service-public.pem 公钥从 Ansible 控制器复制到 server.idm.example.com 服务器。
通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来修改文件的其余部分:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
使用
name
变量定义 vault 的名称,如 secret_vault。 -
将
vault_type
变量设置为非 对称。 -
将
service
变量设置为拥有密码库的服务主体,如 HTTP/webserver1.idm.example.com。 将
public_key_file
设置为您的公钥的位置。这是当前示例修改的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Copy public key to ipaserver. copy: src: /path/to/service-public.pem dest: /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/service-public.pem mode: 0600 - name: Add data to vault, from a LOCAL file. freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault vault_type: asymmetric service: HTTP/webserver1.idm.example.com public_key_file: /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/service-public.pem
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Copy public key to ipaserver. copy: src: /path/to/service-public.pem dest: /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/service-public.pem mode: 0600 - name: Add data to vault, from a LOCAL file. freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault vault_type: asymmetric service: HTTP/webserver1.idm.example.com public_key_file: /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/service-public.pem
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-asymmetric-service-vault-is-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-asymmetric-service-vault-is-present-copy.yml
Copy to Clipboard Copied!
26.2. 使用 Ansible 将成员服务添加到非对称库
按照以下流程,使用 Ansible playbook 将成员服务添加到服务 vault 中,以便它们可以检索 vault 中存储的 secret。在以下流程中使用的示例中,IdM 管理员将 HTTP/webserver2.idm.example.com 和 HTTP/webserver3.idm.example.com 服务主体添加到由 HTTP/webserver1.idm.example.com 所有的 secret_vault vault 中。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已创建了非对称密码库用于存储服务机密。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 生成 data-archive-in-asymmetric-vault.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/data-archive-in-asymmetric-vault.yml add-services-to-an-asymmetric-vault.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/data-archive-in-asymmetric-vault.yml add-services-to-an-asymmetric-vault.yml
Copy to Clipboard Copied! - 打开 data-archive-in-asymmetric-vault-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来修改该文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
定义您要使用
services
变量访问 vault 机密的服务。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com services: - HTTP/webserver2.idm.example.com - HTTP/webserver3.idm.example.com action: member
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com services: - HTTP/webserver2.idm.example.com - HTTP/webserver3.idm.example.com action: member
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file add-services-to-an-asymmetric-vault.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file add-services-to-an-asymmetric-vault.yml
Copy to Clipboard Copied!
26.3. 使用 Ansible 将 IdM 服务 secret 存储在非对称库中
按照以下流程,使用 Ansible playbook 将 secret 存储在服务 vault 中,以便稍后可由服务检索。在以下流程中使用的示例中,管理员将带有 secret 的 PEM
文件存储在名为 secret_vault 的非对称库中。这样可确保服务必须使用私钥进行身份验证,以便从 vault 检索 secret。vault 成员能够从任何 IdM 客户端检索 文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已创建了非对称密码库用于存储服务机密。
- secret 存储在本地 Ansible 控制器上,例如在 ~/MyPlaybooks/private-key-to-an-externally-certificate.pem 文件中。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 生成 data-archive-in-asymmetric-vault.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/data-archive-in-asymmetric-vault.yml data-archive-in-asymmetric-vault-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/data-archive-in-asymmetric-vault.yml data-archive-in-asymmetric-vault-copy.yml
Copy to Clipboard Copied! - 打开 data-archive-in-asymmetric-vault-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来修改该文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
将
in
变量设置为 "{{ lookup('file', 'private-key-to-an-externally-certificate.pem')| b64encode }}"。这可确保 Ansible 使用私钥从 Ansible 控制器上的工作目录检索文件,而不是从 IdM 服务器检索。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com in: "{{ lookup('file', 'private-key-to-an-externally-signed-certificate.pem') | b64encode }}" action: member
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com in: "{{ lookup('file', 'private-key-to-an-externally-signed-certificate.pem') | b64encode }}" action: member
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
Copy to Clipboard Copied!
26.4. 使用 Ansible 为 IdM 服务检索服务 secret
按照以下流程,使用 Ansible playbook 代表服务从服务 vault 检索 secret。在以下流程中使用的示例中,运行 playbook 从名为 secret_vault 的非对称库检索带有 secret 的 PEM
文件,并将它存储在 Ansible 清单文件中列出的所有主机上的指定位置,存为 ipaservers
。
服务使用 keytabs 验证 IdM,并使用私钥与密码库进行身份验证。您可以代表服务从安装 ansible-freeipa
的任何 IdM 客户端检索 文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已创建了非对称密码库用于存储服务机密。
- 您已在密码库中存档了机密。
-
您已将用于检索服务 vault secret 的私钥存储在 Ansible 控制器上的
private_key_file
变量指定的位置。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 打开清单文件。
-
在
webservers
部分中定义要检索机密的主机。例如,要指示 Ansible 获取到 webserver1.idm.example.com、webserver2.idm.example.com 和 webserver3.idm.example.com 的 secret,请输入:
[ipaserver] server.idm.example.com [webservers] webserver1.idm.example.com webserver2.idm.example.com webserver3.idm.example.com
[ipaserver] server.idm.example.com [webservers] webserver1.idm.example.com webserver2.idm.example.com webserver3.idm.example.com
Copy to Clipboard Copied! -
在
从相关集合目录中生成 retrieve-data-asymmetric-vault.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/retrieve-data-asymmetric-vault.yml retrieve-data-asymmetric-vault-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/retrieve-data-asymmetric-vault.yml retrieve-data-asymmetric-vault-copy.yml
Copy to Clipboard Copied! - 打开 retrieve-data-asymmetric-vault-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来修改该文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
将
private_key_file
变量设置为用于检索服务 vault secret 的私钥的位置。 -
将
out
变量设置为 IdM 服务器上您要检索 private-key-to-an-externally-certificate.pem 机密的位置,如当前工作目录。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve data from the service vault freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com vault_type: asymmetric private_key: "{{ lookup('file', 'service-private.pem') | b64encode }}" out: private-key-to-an-externally-signed-certificate.pem state: retrieved
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve data from the service vault freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com vault_type: asymmetric private_key: "{{ lookup('file', 'service-private.pem') | b64encode }}" out: private-key-to-an-externally-signed-certificate.pem state: retrieved
Copy to Clipboard Copied! -
表示
在 playbook 中添加一个部分,它将从 IdM 服务器检索数据文件到 Ansible 控制器:
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false tasks: [...] - name: Retrieve data file fetch: src: private-key-to-an-externally-signed-certificate.pem dest: ./ flat: true mode: 0600
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false tasks: [...] - name: Retrieve data file fetch: src: private-key-to-an-externally-signed-certificate.pem dest: ./ flat: true mode: 0600
Copy to Clipboard Copied! 在 playbook 中添加一个部分,它将检索到的 private-key-to-an-externally-certificate.pem 文件从 上的 Ansible 控制器传输到清单文件的
webservers
部分:--- - name: Send data file to webservers become: no gather_facts: no hosts: webservers tasks: - name: Send data to webservers copy: src: private-key-to-an-externally-signed-certificate.pem dest: /etc/pki/tls/private/httpd.key mode: 0444
--- - name: Send data file to webservers become: no gather_facts: no hosts: webservers tasks: - name: Send data to webservers copy: src: private-key-to-an-externally-signed-certificate.pem dest: /etc/pki/tls/private/httpd.key mode: 0444
Copy to Clipboard Copied! - 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml
Copy to Clipboard Copied!
26.5. 在使用 Ansible 泄露时更改 IdM 服务 vault secret
当服务实例有危险时,请按照此流程重新使用 Ansible playbook 来更改存储在服务 vault 中的 secret。以下示例中的情景假定 on webserver3.idm.example.com 检索到的机密已被破坏,而不是存储该机密的非对称库的密钥。在示例中,管理员重复利用在非对称库中存储一个 secret 时,以及从非对称库中获取一个 secret 导入到 IdM 主机 时使用的 Ansible playbook。在流程开始时,IdM 管理员使用非对称密码库中的新 secret 存储一个新的 PEM
文件,调整清单文件,而不检索到被入侵的 Web 服务器 webserver3.idm.example.com,然后重新运行这两个程序。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已创建了非对称密码库用于存储服务机密。
-
您已为在 IdM 主机上运行的 web 服务生成了新的
httpd
密钥,以替换泄露的旧密钥。 -
新的
httpd
密钥存储在 Ansible 控制器上,例如 /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/private-key-to-an-externally-certificate.pem 文件中。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 打开清单文件,并确保您要检索该 secret 的主机在
webservers
部分中正确定义。例如,要指示 Ansible 检索到 webserver1.idm.example.com 和 webserver2.idm.example.com 的 secret,请输入:[ipaserver] server.idm.example.com [webservers] webserver1.idm.example.com webserver2.idm.example.com
[ipaserver] server.idm.example.com [webservers] webserver1.idm.example.com webserver2.idm.example.com
Copy to Clipboard Copied! 重要确保列表不包含当前 example webserver3.idm.example.com 中被入侵的 web 服务器。
从相关集合目录中生成 data-archive-in-asymmetric-vault.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/data-archive-in-asymmetric-vault.yml data-archive-in-asymmetric-vault-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/vault/data-archive-in-asymmetric-vault.yml data-archive-in-asymmetric-vault-copy.yml
Copy to Clipboard Copied! - 打开 data-archive-in-asymmetric-vault-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来修改该文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver.idm.example.com。 -
将
中的变量
设置为 "{{ lookup('file', 'new-private-key-to-an-externally-certificate.pem')| b64encode }}"。这可确保 Ansible 使用私钥从 Ansible 控制器上的工作目录检索文件,而不是从 IdM 服务器检索。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver.idm.example.com in: "{{ lookup('file', 'new-private-key-to-an-externally-signed-certificate.pem') | b64encode }}" action: member
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver.idm.example.com in: "{{ lookup('file', 'new-private-key-to-an-externally-signed-certificate.pem') | b64encode }}" action: member
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
Copy to Clipboard Copied! - 打开 retrieve-data-asymmetric-vault-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipavault
任务部分设置以下变量来修改该文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
将
private_key_file
变量设置为用于检索服务 vault secret 的私钥的位置。 -
将
变量
设置为 IdM 服务器上您要检索 new-private-key-to-an-externally-certificate.pem 机密的位置,如当前工作目录。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve data from the service vault freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com vault_type: asymmetric private_key: "{{ lookup('file', 'service-private.pem') | b64encode }}" out: new-private-key-to-an-externally-signed-certificate.pem state: retrieved
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve data from the service vault freeipa.ansible_freeipa.ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com vault_type: asymmetric private_key: "{{ lookup('file', 'service-private.pem') | b64encode }}" out: new-private-key-to-an-externally-signed-certificate.pem state: retrieved
Copy to Clipboard Copied! -
表示
在 playbook 中添加一个部分,它将从 IdM 服务器检索数据文件到 Ansible 控制器:
--- - name: Retrieve data from vault hosts: ipaserver become: true gather_facts: false tasks: [...] - name: Retrieve data file fetch: src: new-private-key-to-an-externally-signed-certificate.pem dest: ./ flat: true mode: 0600
--- - name: Retrieve data from vault hosts: ipaserver become: true gather_facts: false tasks: [...] - name: Retrieve data file fetch: src: new-private-key-to-an-externally-signed-certificate.pem dest: ./ flat: true mode: 0600
Copy to Clipboard Copied! 在 playbook 中添加一个部分,它将检索到的 new-private-key-to-an-externally-certificate.pem 文件从 上的 Ansible 控制器传输到清单文件的
webservers
部分:--- - name: Send data file to webservers become: true gather_facts: no hosts: webservers tasks: - name: Send data to webservers copy: src: new-private-key-to-an-externally-signed-certificate.pem dest: /etc/pki/tls/private/httpd.key mode: 0444
--- - name: Send data file to webservers become: true gather_facts: no hosts: webservers tasks: - name: Send data to webservers copy: src: new-private-key-to-an-externally-signed-certificate.pem dest: /etc/pki/tls/private/httpd.key mode: 0444
Copy to Clipboard Copied! - 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml
Copy to Clipboard Copied!
第 27 章 使用 Ansible 在 IdM 中确保存在或不存在服务
使用 Ansible service
模块时,管理员可以确保 IdM 中存在或不存在不原生 IdM 的特定服务。例如,您可以使用 service
模块:
检查 IdM 客户端中是否存在手动安装的服务,并在缺少该服务时自动安装该服务。详情请查看:
检查在 IdM 中注册的服务是否已附加证书,并在缺少该证书时自动安装该证书。详情请查看:
允许 IdM 用户和主机检索并创建服务 keytab。详情请查看:
允许 IdM 用户和组向服务添加 Kerberos 别名。详情请查看:
检查 IdM 客户端中是否不存在服务,并在该服务存在时自动删除该服务。详情请查看:
27.1. 使用 Ansible playbook 在 IdM 中存在 HTTP 服务
按照以下流程,使用 Ansible playbook 确保 HTTP 服务器在 IdM 中存在。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 托管 HTTP 服务的系统是一个 IdM 客户端。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 service-is-present.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-is-present.yml service-is-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-is-present.yml service-is-present-copy.yml
Copy to Clipboard Copied! 打开
service-is-present-copy.yml
Ansible playbook 文件以进行编辑:--- - name: Playbook to manage IPA service. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service is present - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com
--- - name: Playbook to manage IPA service. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service is present - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com
Copy to Clipboard Copied! -
更改运行 HTTP 服务的 IdM 客户端的名称,如
freeipa.ansible_freeipa.ipaservice
任务的name
变量所定义。 - 保存并退出 文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory.file service-is-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file service-is-present-copy.yml
Copy to Clipboard Copied!
验证
- 以 IdM 管理员身份登录 IdM Web UI。
-
导航到
Identity
→Services
。
如果 Services 列表中列出了 HTTP/client.idm.example.com@IDM.EXAMPLE.COM,Ansible playbook 已成功添加到 IdM。
27.2. 使用一个 Ansible 任务确保在 IdM 客户端上的 IdM 中存在多个服务
您可以使用 ansible-freeipa
freeipa.ansible_freeipa.ipaservice
模块来添加、修改和删除带有单个 Ansible 任务的多个身份管理(IdM)服务。为此,请使用 freeipa.ansible_freeipa.ipaservice
模块的 services
选项。
使用 services
选项,您还可以指定多个仅应用到特定的服务的服务变量。根据 name
变量定义此服务,这是 services
选项的唯一强制变量。
完成此流程,以使用一个任务确保 IdM 中存在 HTTP/client01.idm.example.com@IDM.EXAMPLE.COM 和 ftp/client02.idm.example.com@IDM.EXAMPLE.COM 服务。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
使用以下内容创建您的 Ansible playbook 文件 add-http-and-ftp-services.yml :
--- - name: Playbook to add multiple services in a single task hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Add HTTP and ftp services freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" services: - name: HTTP/client01.idm.example.com@IDM.EXAMPLE.COM - name: ftp/client02.idm.example.com@IDM.EXAMPLE.COM
--- - name: Playbook to add multiple services in a single task hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Add HTTP and ftp services freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" services: - name: HTTP/client01.idm.example.com@IDM.EXAMPLE.COM - name: ftp/client02.idm.example.com@IDM.EXAMPLE.COM
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory add-http-and-ftp-services.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory add-http-and-ftp-services.yml
Copy to Clipboard Copied!
27.3. 使用 Ansible playbook,确保在 IdM 中存在于非IdM 客户端中的 HTTP 服务
按照以下流程,使用 Ansible playbook 确保 HTTP 服务器在不是 IdM 客户端的主机上的 IdM 中存在。通过将 HTTP 服务器添加到 IdM 中,您还会将主机添加到 IdM。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已在 主机上安装了 HTTP 服务。
- 您在其上设置了 HTTP 的主机不是 IdM 客户端。否则,请按照 将 HTTP 服务注册到 IdM 中的步骤操作。
- 主机的 DNS A 记录 - 或 AAAA 记录(如果使用 IPv6)
- 如果在服务器上启用了 FIPS 模式,客户端必须支持扩展主 Secret (EMS)扩展或使用 TLS 1.3。没有 EMS 的 TLS 1.2 连接会失败。如需更多信息,请参阅红帽知识库解决方案 强制执行 TLS 扩展"Extended Master Secret" 。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 service-is-present-without-host-check.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-is-present-without-host-check.yml service-is-present-without-host-check-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-is-present-without-host-check.yml service-is-present-without-host-check-copy.yml
Copy to Clipboard Copied! 打开复制的文件
service-is-present-without-host-check-copy.yml
进行编辑。在freeipa.ansible_freeipa.ipaservice
任务中找到ipaadmin_password
和name
变量:--- - name: Playbook to manage IPA service. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service is present - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/www2.example.com skip_host_check: true
--- - name: Playbook to manage IPA service. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service is present - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/www2.example.com skip_host_check: true
Copy to Clipboard Copied! 调整文件:
-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为运行 HTTP 服务的主机的名称。
-
表示
- 保存并退出文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory service-is-present-without-host-check-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory service-is-present-without-host-check-copy.yml
Copy to Clipboard Copied!
验证
- 以 IdM 管理员身份登录 IdM Web UI。
-
导航到
Identity
→Services
。
现在,您可以看到 Services 列表中列出的 HTTP/client.idm.example.com@IDM.EXAMPLE.COM。
27.4. 使用 Ansible playbook 确保在没有 DNS 的 IdM 客户端上存在 HTTP 服务
按照以下流程,使用 Ansible playbook 确保运行在没有 DNS 条目的 IdM 客户端上的 HTTP 服务器存在。场景表示,如果使用 IPv6 而不是 IPv4,IdM 主机没有可用的 DNS A 条目 - 或没有 DNS AAAA 条目。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 托管 HTTP 服务的系统已在 IdM 中注册。
- 主机的 DNS A 或 DNS AAAA 记录可能不存在。否则,如果主机的 DNS 记录存在,请按照 使用 Ansible playbook 在 IdM 中存在 HTTP 服务的步骤进行操作。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 service-is-present-with-host-force.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-is-present-with-host-force.yml service-is-present-with-host-force-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-is-present-with-host-force.yml service-is-present-with-host-force-copy.yml
Copy to Clipboard Copied! 打开复制的文件
service-is-present-with-host-force-copy.yml
进行编辑。在freeipa.ansible_freeipa.ipaservice
任务中找到ipaadmin_password
和name
变量:--- - name: Playbook to manage IPA service. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service is present - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/ihavenodns.info force: true
--- - name: Playbook to manage IPA service. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service is present - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/ihavenodns.info force: true
Copy to Clipboard Copied! 调整文件:
-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为运行 HTTP 服务的主机的名称。
-
表示
- 保存并退出文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory service-is-present-with-host-force-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory service-is-present-with-host-force-copy.yml
Copy to Clipboard Copied!
验证
- 以 IdM 管理员身份登录 IdM Web UI。
-
导航到
Identity
→Services
。
现在,您可以看到 Services 列表中列出的 HTTP/client.idm.example.com@IDM.EXAMPLE.COM。
27.5. 使用 Ansible playbook 确保 IdM 服务条目中存在外部签名的证书
按照以下流程,使用 ansible-freeipa
service
模块确保外部证书颁发机构(CA)发布的证书被附加到 HTTP 服务的 IdM 条目上。如果您的 IdM CA 使用自签名证书,则由外部 CA 而不是 IdM CA 签名的 HTTP 服务证书特别有用。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已在 主机上安装了 HTTP 服务。
- 您已在 IdM 中注册了 HTTP 服务。
- 您有一个外部签名的证书,其 Subject 对应于 HTTP 服务的主体。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 service-member-certificate-present.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-member-certificate-present.yml service-member-certificate-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-member-certificate-present.yml service-member-certificate-present-copy.yml
Copy to Clipboard Copied! 可选:如果证书采用 Privacy Enhanced Mail (PEM)格式,请将证书转换为可辨识的编码规则(DER)格式,以便通过命令行(CLI)更容易地处理:
openssl x509 -outform der -in cert1.pem -out cert1.der
$ openssl x509 -outform der -in cert1.pem -out cert1.der
Copy to Clipboard Copied! 使用
base64
命令将DER
文件解码为标准输出。使用-w0
选项禁用换行:base64 cert1.der -w0
$ base64 cert1.der -w0 MIIC/zCCAeegAwIBAgIUV74O+4kXeg21o4vxfRRtyJm...
Copy to Clipboard Copied! - 将证书从标准输出复制到剪贴板。
打开
service-member-certificate-present-copy.yml
文件进行编辑和查看其内容:--- - name: Service certificate present. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service certificate is present - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com certificate: | - MIICBjCCAW8CFHnm32VcXaUDGfEGdDL/... [...] action: member state: present
--- - name: Service certificate present. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service certificate is present - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com certificate: | - MIICBjCCAW8CFHnm32VcXaUDGfEGdDL/... [...] action: member state: present
Copy to Clipboard Copied! 调整文件:
-
将使用
证书
变量定义的证书替换为您从 CLI 复制的证书。请注意,如果您使用带有所示"|"管道字符的certificate:
变量,您可以输入证书 THIS WAY,而不是让它在一个行中输入。这样可以更轻松地读取证书。 -
更改由
ipaadmin_password
变量定义的 IdM 管理员密码。 -
更改运行 HTTP 服务的 IdM 客户端的名称,由
name
变量定义。 - 更改任何其他相关变量。
-
将使用
- 保存并退出文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory service-member-certificate-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory service-member-certificate-present-copy.yml
Copy to Clipboard Copied!
验证
- 以 IdM 管理员身份登录 IdM Web UI。
-
导航到
Identity
→Services
。 - 使用新添加的证书,单击服务的名称,如 HTTP/client.idm.example.com。
在右侧的 Service Certificate
部分中,您现在可以看到新添加的证书。
27.6. 使用 Ansible playbook 来允许 IdM 用户、组、主机或主机组创建服务的 keytab
keytab 是一个包含 Kerberos 主体和加密密钥对的文件。keytab 文件通常用于允许脚本使用 Kerberos 自动进行身份验证,无需人工交互或访问存储在纯文本文件中的密码。然后,脚本可以使用获取的凭据来访问存储在远程系统上的文件。
作为身份管理(IdM)管理员,您可以允许其他用户为 IdM 中运行的服务检索甚至创建 keytab。通过允许特定用户和用户组创建 keytab,您可以将服务管理委派给他们,而无需共享 IdM 管理员密码。此委派提供了更加精细的系统管理。
按照以下流程,允许特定的 IdM 用户、用户组、主机和主机组为运行在 IdM 客户端上的 HTTP 服务创建 keytab。具体来说,它描述了如何允许 user01 IdM 用户为名为 client.idm.example.com 的 IdM 客户端上运行的 HTTP 服务创建 keytab。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已在 IdM 中注册了 HTTP 服务。
- 承载 HTTP 服务的系统是一个 IdM 客户端。
- IdM 中已存在您要允许创建 keytab 的 IdM 用户和用户组。
- IdM 中已存在您要允许创建 keytab 的 IdM 主机和主机组。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 service-member-allow_create_keytab-present.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-member-allow_create_keytab-present.yml service-member-allow_create_keytab-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-member-allow_create_keytab-present.yml service-member-allow_create_keytab-present-copy.yml
Copy to Clipboard Copied! -
打开
service-member-allow_create_keytab-present-copy.yml
Ansible playbook 文件以进行编辑。 通过更改以下内容来调整文件:
- 运行 HTTP 服务的 IdM 客户端的名称。在当前示例中,它是 HTTP/client.idm.example.com
-
allow_create_keytab_user:
部分中列出的 IdM 用户名称。在当前示例中,是 user01。 -
allow_create_keytab_group:
部分中列出的 IdM 用户组名称。 -
allow_create_keytab_host:
部分中列出的 IdM 主机名称。 -
allow_create_keytab_hostgroup:
部分中所列的 IdM 主机组名称。 由
tasks
部分中name
变量指定的任务名称。在适应当前示例后,复制的文件类似如下:
--- - name: Service member allow_create_keytab present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Service HTTP/client.idm.example.com members allow_create_keytab present for user01 freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com allow_create_keytab_user: - user01 action: member
--- - name: Service member allow_create_keytab present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Service HTTP/client.idm.example.com members allow_create_keytab present for user01 freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com allow_create_keytab_user: - user01 action: member
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory service-member-allow_create_keytab-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory service-member-allow_create_keytab-present-copy.yml
Copy to Clipboard Copied!
验证
以 IdM 用户身份 SSH 到 IdM 服务器,该用户具有为特定 HTTP 服务创建 keytab 的权限:
ssh user01@server.idm.example.com
$ ssh user01@server.idm.example.com Password:
Copy to Clipboard Copied! 使用
ipa-getkeytab
命令为 HTTP 服务生成新 keytab:ipa-getkeytab -s server.idm.example.com -p HTTP/client.idm.example.com -k /etc/httpd/conf/krb5.keytab
$ ipa-getkeytab -s server.idm.example.com -p HTTP/client.idm.example.com -k /etc/httpd/conf/krb5.keytab
Copy to Clipboard Copied! s 选项指定用于
生成 keytab 的密钥分发中心(KDC)服务器。p 选项指定
您要创建的 keytab 主体。k 选项指定
将新密钥附加到的 keytab 文件。如果文件不存在,则会创建此文件。
如果命令不产生错误,您以 user01 身份成功创建了 HTTP/client.idm.example.com 的 keytab。
27.7. 使用 Ansible playbook 来允许 IdM 用户、组、主机或主机组检索服务的 keytab
keytab 是一个包含 Kerberos 主体和加密密钥对的文件。keytab 文件通常用于允许脚本使用 Kerberos 自动进行身份验证,无需人工交互或访问存储在纯文本文件中的密码。然后,脚本可以使用获取的凭据来访问存储在远程系统上的文件。
作为 IdM 管理员,您可以允许其他用户为 IdM 中运行的服务检索甚至创建 keytab。
按照以下流程,允许特定的 IdM 用户、用户组、主机和主机组为在 IdM 客户端上运行的 HTTP 服务检索 keytab。具体来说,它描述了如何允许 user01 IdM 用户检索 client.idm.example.com 上运行的 HTTP 服务的 keytab。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已在 IdM 中注册了 HTTP 服务。
- IdM 中已存在您要允许检索 keytab 的 IdM 用户和用户组。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 service-member-allow_retrieve_keytab-present.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-member-allow_retrieve_keytab-present.yml service-member-allow_retrieve_keytab-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-member-allow_retrieve_keytab-present.yml service-member-allow_retrieve_keytab-present-copy.yml
Copy to Clipboard Copied! -
打开复制的文件
service-member-allow_retrieve_keytab-present-copy.yml
进行编辑: 调整文件:
-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
freeipa.ansible_freeipa.ipaservice
任务的name
变量设置为 HTTP 服务的主体。在当前示例中,它是 HTTP/client.idm.example.com -
在
allow_retrieve_keytab_group:
部分中指定 IdM 用户的名称。在当前示例中,是 user01。 -
在
allow_retrieve_keytab_group:
部分中指定 IdM 用户组的名称。 -
在
allow_retrieve_keytab_group:
部分中指定 IdM 主机的名称。 -
在
allow_retrieve_keytab_group:
部分中指定 IdM 主机组的名称。 使用
tasks
部分中的name 变量指定
任务的名称。在适应当前示例后,复制的文件类似如下:
--- - name: Service member allow_retrieve_keytab present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Service HTTP/client.idm.example.com members allow_retrieve_keytab present for user01 freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com allow_retrieve_keytab_user: - user01 action: member
--- - name: Service member allow_retrieve_keytab present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Service HTTP/client.idm.example.com members allow_retrieve_keytab present for user01 freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com allow_retrieve_keytab_user: - user01 action: member
Copy to Clipboard Copied! -
表示
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory service-member-allow_retrieve_keytab-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory service-member-allow_retrieve_keytab-present-copy.yml
Copy to Clipboard Copied!
验证
以 IdM 用户身份 SSH 到 IdM 服务器,并具有权限检索 HTTP 服务的 keytab:
ssh user01@server.idm.example.com
$ ssh user01@server.idm.example.com Password:
Copy to Clipboard Copied! 使用
ipa-getkeytab
命令和-r
选项来检索 keytab:ipa-getkeytab -r -s server.idm.example.com -p HTTP/client.idm.example.com -k /etc/httpd/conf/krb5.keytab
$ ipa-getkeytab -r -s server.idm.example.com -p HTTP/client.idm.example.com -k /etc/httpd/conf/krb5.keytab
Copy to Clipboard Copied! s 选项指定
您要从中检索 keytab 的密钥分发中心(KDC)服务器。p 选项指定
您要检索的 keytab 主体。k 选项指定
您要将检索到的密钥附加到的 keytab 文件。如果文件不存在,则会创建此文件。
如果命令不产生错误,您以 user01 身份成功检索了 HTTP/client.idm.example.com 的 keytab。
27.8. 使用 Ansible playbook 确保存在服务的 Kerberos 主体别名
在某些情况下,IdM 管理员可启用 IdM 用户、主机或服务使用 Kerberos 主体别名进行身份验证。这些情况包括:
- 用户名已更改,但该用户应该能够使用先前和新用户名登录系统。
- 即使 IdM Kerberos 域与电子邮件域不同,用户也需要使用电子邮件地址登录。
按照以下流程,为运行在 client.idm.example.com 上的 HTTP 服务创建 HTTP/mycompany.idm.example.com 的主体别名。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您已在主机上 设置了 HTTP 服务。
- 您已在 IdM 中注册了 HTTP 服务。
- 您已在其上设置了 HTTP 的主机是一个 IdM 客户端。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 service-member-principal-present.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-member-principal-present.yml service-member-principal-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-member-principal-present.yml service-member-principal-present-copy.yml
Copy to Clipboard Copied! -
打开
service-member-principal-present-copy.yml
Ansible playbook 文件以进行编辑。 通过更改以下内容来调整文件:
-
通过
name
变量指定的服务名称。这是服务的规范主体名称。在当前示例中,它是 HTTP/client.idm.example.com。 -
由主体变量指定的 Kerberos
主体
别名。这是您要添加到name
变量定义的服务的别名。在当前示例中,它是 host/mycompany.idm.example.com。 由
tasks
部分中name
变量指定的任务名称。在适应当前示例后,复制的文件类似如下:
--- - name: Service member principal present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Service HTTP/client.idm.example.com member principals host/mycompany.idm.exmaple.com present freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com principal: - host/mycompany.idm.example.com action: member
--- - name: Service member principal present hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Service HTTP/client.idm.example.com member principals host/mycompany.idm.exmaple.com present freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com principal: - host/mycompany.idm.example.com action: member
Copy to Clipboard Copied! -
通过
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory service-member-principal-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory service-member-principal-present-copy.yml
Copy to Clipboard Copied!
如果运行 playbook 会导致 0 个无法访问和 0 个失败的任务,您已成功为 HTTP/client.idm.example.com 服务创建了host/mycompany.idm.example.com Kerberos 主体。
27.9. 使用 Ansible playbook 确保 IdM 中缺少 HTTP 服务
按照以下流程从 IdM 中取消一个服务的注册。更具体地说,它描述了如何使用 Ansible playbook 来确保 IdM 中缺少名为 HTTP/client.idm.example.com 的 HTTP 服务器。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 service-is-absent.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-is-absent.yml service-is-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/service/service-is-absent.yml service-is-absent-copy.yml
Copy to Clipboard Copied! -
打开
service-is-absent-copy.yml
Ansible playbook 文件以进行编辑。 调整文件:
-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 设置 HTTP 服务的 Kerberos 主体,由
freeipa.ansible_freeipa.ipaservice
任务的name
变量定义。在适应当前示例后,复制的文件类似如下:
--- - name: Playbook to manage IPA service. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service is absent - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com state: absent
--- - name: Playbook to manage IPA service. hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: # Ensure service is absent - freeipa.ansible_freeipa.ipaservice: ipaadmin_password: "{{ ipaadmin_password }}" name: HTTP/client.idm.example.com state: absent
Copy to Clipboard Copied! -
表示
- 保存并退出文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory service-is-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory service-is-absent-copy.yml
Copy to Clipboard Copied!
验证
- 以 IdM 管理员身份登录 IdM Web UI。
-
导航到
Identity
→Services
。
如果您无法在 Services 列表中看到 HTTP/client.idm.example.com@IDM.EXAMPLE.COM 服务,则已成功确保了在 IdM 中缺少 HTTP/client.idm.example.com@IDM.EXAMPLE.COM 服务。
第 28 章 使用 Ansible playbook 在 IdM 中管理全局 DNS 配置
使用 freeipa.ansible_freeipa.dnsconfig
Ansible 模块,您可以为 RHEL Identity Management (IdM) DNS 配置全局配置。全局 DNS 配置中定义的设置应用到所有 IdM DNS 服务器。但是,全局配置优先于特定 IdM DNS 区的配置。
dnsconfig
模块支持以下变量:
- 全局转发器,特别是 IP 地址和用于通信的端口。
- 全局转发策略:只有、first 或 none。有关这些 DNS 转发策略类型的详情,请参阅 IdM 中的 DNS 转发策略。
- 同步正向查找和反向查找区域。
先决条件
DNS 服务安装在 IdM 服务器上。有关如何使用集成 DNS 安装 IdM 服务器的详情,请查看以下链接之一:
28.1. IdM 如何确保 NetworkManager 不会删除 /etc/resolv.conf 中的全局转发器
使用集成的 DNS 安装 RHEL 身份管理(IdM)将 /etc/resolv.conf
文件配置为指向 127.0.0.1
localhost 地址:
Generated by NetworkManager
# Generated by NetworkManager
search idm.example.com
nameserver 127.0.0.1
在某些情况下,如使用 动态主机配置
协议(DHCP)的网络,NetworkManager
服务可能会恢复对 /etc/resolv.conf
文件的更改。为了使 DNS 配置持久,IdM DNS 安装过程还通过以下方式配置 NetworkManager
服务:
DNS 安装脚本会创建一个
/etc/NetworkManager/conf.d/zzz-ipa.conf
NetworkManager
配置文件来控制搜索顺序和 DNS 服务器列表:auto-generated by IPA installer
# auto-generated by IPA installer [main] dns=default [global-dns] searches=$DOMAIN [global-dns-domain-*] servers=127.0.0.1
Copy to Clipboard Copied! -
NetworkManager
服务已重新加载,该服务始终使用/etc/NetworkManager/conf.d/
目录中的最后一个文件中的设置来创建/etc/resolv.conf
文件。这时为zzz-ipa.conf
文件。
不要手动修改 /etc/resolv.conf
文件。
28.2. 使用 Ansible 确保 IdM 中存在 DNS 全局转发器
按照以下流程,使用 Ansible playbook 确保 DNS 全局转发器在 IdM 中存在。在下例中,IdM 管理员确保在 DNS 服务器中存在一个到 IPv4 地址为 7.7.9.9
,IP v6 地址为 2001:db8::1:0
,端口 53
的 DNS global forwarder。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中复制 forwarders-absent.yml Ansible playbook 文件并重命名该文件。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/forwarders-absent.yml ensure-presence-of-a-global-forwarder.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/forwarders-absent.yml ensure-presence-of-a-global-forwarder.yml
Copy to Clipboard Copied! -
打开
ensure-presence-global-forwarder.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将 playbook
的 name
变量更改为 Playbook,以确保 IdM DNS 中存在全局转发器
。 -
在
tasks
部分中,更改任务的名称
,以确保到端口 53上 7.7.9.9 和 2001:db8::1:0 的 DNS 全局转发器存在
。 在
freeipa.ansible_freeipa.ipadnsconfig
部分的forwarders
部分中:-
将第一个
ip_address
值更改为全局转发器的 IPv4 地址:7.7.9.9
。 -
将第二个
ip_address
值更改为全局转发器的 IPv6 地址:2001:db8::1:0
。 -
验证
端口
值是否已设置为53
。
-
将第一个
将
状态
更改为present
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Playbook to ensure the presence of a global forwarder in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the presence of a DNS global forwarder to 7.7.9.9 and 2001:db8::1:0 on port 53 freeipa.ansible_freeipa.ipadnsconfig: forwarders: - ip_address: 7.7.9.9 - ip_address: 2001:db8::1:0 port: 53 state: present
--- - name: Playbook to ensure the presence of a global forwarder in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the presence of a DNS global forwarder to 7.7.9.9 and 2001:db8::1:0 on port 53 freeipa.ansible_freeipa.ipadnsconfig: forwarders: - ip_address: 7.7.9.9 - ip_address: 2001:db8::1:0 port: 53 state: present
Copy to Clipboard Copied! -
将 playbook
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-presence-of-a-global-forwarder.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-presence-of-a-global-forwarder.yml
Copy to Clipboard Copied!
28.3. 使用 Ansible 确保 IdM 中没有 DNS 全局转发器
按照以下流程,使用 Ansible playbook 确保 DNS 全局转发器在 IdM 中不存在。在以下示例流程中,IdM 管理员确保端口 53
上具有互联网协议(IP)v4 地址 8.8.6.6
和 IP v6 地址 2001:4860:4860::8800
的 DNS 全局转发器(IP)不存在。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中复制 forwarders-absent.yml Ansible playbook 文件并重命名该文件。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/forwarders-absent.yml ensure-absence-of-a-global-forwarder.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/forwarders-absent.yml ensure-absence-of-a-global-forwarder.yml
Copy to Clipboard Copied! -
打开
ensure-absence-of-a-global-forwarder.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将 playbook
的 name
变量更改为 Playbook,以确保 IdM DNS 中缺少全局转发器
。 -
在
tasks
部分中,更改任务的名称
,以确保到 8.8.6.6 和 2001:4860:4860::8800 端口 53 的 DNS 全局转发器不存在
。 在
freeipa.ansible_freeipa.ipadnsconfig
部分的forwarders
部分中:-
将第一个
ip_address
值更改为全局转发器的 IPv4 地址:8.8.6.6
。 -
将第二个
ip_address
值更改为全局转发器的 IPv6 地址:2001:4860:4860::8800
。 -
验证
端口
值是否已设置为53
。
-
将第一个
-
将
action
变量设置为member
。 -
验证
state
已设为absent
。
对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Playbook to ensure the absence of a global forwarder in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the absence of a DNS global forwarder to 8.8.6.6 and 2001:4860:4860::8800 on port 53 freeipa.ansible_freeipa.ipadnsconfig: forwarders: - ip_address: 8.8.6.6 - ip_address: 2001:4860:4860::8800 port: 53 action: member state: absent
--- - name: Playbook to ensure the absence of a global forwarder in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the absence of a DNS global forwarder to 8.8.6.6 and 2001:4860:4860::8800 on port 53 freeipa.ansible_freeipa.ipadnsconfig: forwarders: - ip_address: 8.8.6.6 - ip_address: 2001:4860:4860::8800 port: 53 action: member state: absent
Copy to Clipboard Copied! 重要如果您仅在 playbook 中使用
state: absent
选项,而不使用action: member
,则 playbook 会失败。-
将 playbook
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-absence-of-a-global-forwarder.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-absence-of-a-global-forwarder.yml
Copy to Clipboard Copied!
28.4. ipadnsconfig ansible-freeipa 模块中的 action: member
选项
除了 state: absent
选项外,使用 ansible-freeipa
ipadnsconfig
模块排除 RHEL 身份管理(IdM)中的全局转发器还需要使用 action: member
选项。如果您只使用 playbook 中的 state: absent
,而没有使用 action: member
,则 playbook 将失败。因此,要删除所有全局转发器,您必须在 playbook 中分别指定它们。相反,state: present
选项不需要 action: member
。
下表 提供了添加和删除 DNS 全局转发器的配置示例,其演示了 action: member 选项的正确使用。表中每一行显示了:
- 执行 playbook 前配置的全局转发器
- playbook 摘录
- 执行 playbook 后配置的全局转发器
之前的转发器 | Playbook 摘录 | 之后的转发器 |
---|---|---|
8.8.6.6 |
[...] tasks: - name: Ensure the presence of DNS global forwarder 8.8.6.7 ipadnsconfig: forwarders: - ip_address: 8.8.6.7 state: present
| 8.8.6.7 |
8.8.6.6 |
[...] tasks: - name: Ensure the presence of DNS global forwarder 8.8.6.7 ipadnsconfig: forwarders: - ip_address: 8.8.6.7 action: member state: present
| 8.8.6.6, 8.8.6.7 |
8.8.6.6, 8.8.6.7 |
[...] tasks: - name: Ensure the absence of DNS global forwarder 8.8.6.7 ipadnsconfig: forwarders: - ip_address: 8.8.6.7 state: absent
| 尝试执行 playbook 会导致错误。原始配置 - 8.8.6.6、8.8.6.7 - 保持不变。 |
8.8.6.6, 8.8.6.7 |
[...] tasks: - name: Ensure the absence of DNS global forwarder 8.8.6.7 ipadnsconfig: forwarders: - ip_address: 8.8.6.7 action: member state: absent
| 8.8.6.6 |
28.5. IdM 中的 DNS 转发策略
IdM 支持 第一个
且 唯一的
标准 BIND 转发策略,以及任何 IdM
特定的转发策略。
- 首先转发 (默认)
-
IdM BIND 服务将 DNS 查询转发到配置的转发器。如果因为服务器错误或超时查询失败,BIND 会使用 Internet 上的服务器回退到递归解析。
forward first
策略是默认策略,它适合优化 DNS 流量。 - 仅转发
-
IdM BIND 服务将 DNS 查询转发到配置的转发器。如果因为服务器错误或超时查询失败,BIND 会向客户端返回错误。建议在带有分割 DNS 配置的环境中使用
forward only
策略。 - none (转发禁用)
-
DNS 查询不会通过
none
转发策略转发。禁用转发仅作为全局转发配置的特定区覆盖。这个选项等同于在 BIND 配置中指定空转发器列表。
您不能使用转发将 IdM 中的数据与其他 DNS 服务器的数据组合。您只能在 IdM DNS 中转发主区的查询。
默认情况下,如果查询的 DNS 名称属于 IdM 服务器具有权威的区域,BIND 服务不会将查询转发到另一服务器。在这种情况下,如果无法在 IdM 数据库中找到查询的 DNS 名称,则会返回 NXDOMAIN
回答。未使用转发。
例 28.1. 场景示例
IdM 服务器对 test.example 具有权威。DNS 区域.BIND 配置为将查询转发到 IP 地址 192.0.2.254 的 DNS 服务器。
客户端发送对 不存在.test.example的查询时。DNS 名称,BIND 检测到 IdM 服务器对 test.example. 区域具有权威,并且不会将查询转发到 192.0.2.254. 服务器。因此,DNS 客户端会收到 NXDomain
错误消息,通知用户查询的域不存在。
28.6. 使用 Ansible playbook 确保 IdM DNS 全局配置中设置了 forward first 策略
按照以下流程,使用 Ansible playbook 确保将 IdM DNS 中的全局转发策略被设置为 forward first。
如果您使用 forward first DNS 转发策略,DNS 查询将转发到配置的转发器。如果因为服务器错误或超时查询失败,BIND 会使用 Internet 上的服务器回退到递归解析。forward first 策略是默认策略。它适用于流量优化。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您的 IdM 环境包含一个集成的 DNS 服务器。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 set-configuration.yml Ansible playbook 文件的副本并重命名该文件。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/set-configuration.yml set-forward-policy-to-first.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/set-configuration.yml set-forward-policy-to-first.yml
Copy to Clipboard Copied! - 打开 set-forward-policy-to-first.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipadnsconfig
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 将
forward_policy
变量设置为 first。删除原始 playbook 的其他所有行。这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to set global forwarding policy to first hosts: ipaserver become: true tasks: - name: Set global forwarding policy to first. freeipa.ansible_freeipa.ipadnsconfig: ipaadmin_password: "{{ ipaadmin_password }}" forward_policy: first
--- - name: Playbook to set global forwarding policy to first hosts: ipaserver become: true tasks: - name: Set global forwarding policy to first. freeipa.ansible_freeipa.ipadnsconfig: ipaadmin_password: "{{ ipaadmin_password }}" forward_policy: first
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file set-forward-policy-to-first.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file set-forward-policy-to-first.yml
Copy to Clipboard Copied!
28.7. 使用 Ansible playbook 确保 IdM DNS 中禁用了全局转发器
按照以下流程,使用 Ansible playbook 确保全局转发器在 IdM DNS 中被禁用。禁用的方法是将 forward_policy
变量设置为 none。
禁用全局转发器会导致 DNS 查询不会被转发。禁用转发仅作为全局转发配置的特定区覆盖。这个选项等同于在 BIND 配置中指定空转发器列表。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您的 IdM 环境包含一个集成的 DNS 服务器。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中生成 disable-global-forwarders.yml Ansible playbook 文件的副本。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/disable-global-forwarders.yml disable-global-forwarders-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/disable-global-forwarders.yml disable-global-forwarders-copy.yml
Copy to Clipboard Copied! - 打开 disable-global-forwarders-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipadnsconfig
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 将
forward_policy
变量设置为 none。这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to disable global DNS forwarders hosts: ipaserver become: true tasks: - name: Disable global forwarders. freeipa.ansible_freeipa.ipadnsconfig: ipaadmin_password: "{{ ipaadmin_password }}" forward_policy: none
--- - name: Playbook to disable global DNS forwarders hosts: ipaserver become: true tasks: - name: Disable global forwarders. freeipa.ansible_freeipa.ipadnsconfig: ipaadmin_password: "{{ ipaadmin_password }}" forward_policy: none
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file disable-global-forwarders-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file disable-global-forwarders-copy.yml
Copy to Clipboard Copied!
28.8. 使用 Ansible playbook 确保 IdM DNS 中禁用了正向和反向查找区域的同步
按照以下流程,使用 Ansible playbook 确保正向和反向查找区域在 IdM DNS 中未同步。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您的 IdM 环境包含一个集成的 DNS 服务器。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 从相关集合目录中复制 disallow-reverse-sync.yml Ansible playbook 文件。例如:
cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/disallow-reverse-sync.yml disallow-reverse-sync-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig/disallow-reverse-sync.yml disallow-reverse-sync-copy.yml
Copy to Clipboard Copied! - 打开 disallow -reverse-sync-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipadnsconfig
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 将
allow_sync_ptr
变量设置为 no。这是当前示例修改的 Ansible playbook 文件:
--- - name: Playbook to disallow reverse record synchronization hosts: ipaserver become: true tasks: - name: Disallow reverse record synchronization. freeipa.ansible_freeipa.ipadnsconfig: ipaadmin_password: "{{ ipaadmin_password }}" allow_sync_ptr: no
--- - name: Playbook to disallow reverse record synchronization hosts: ipaserver become: true tasks: - name: Disallow reverse record synchronization. freeipa.ansible_freeipa.ipadnsconfig: ipaadmin_password: "{{ ipaadmin_password }}" allow_sync_ptr: no
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file disallow-reverse-sync-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file disallow-reverse-sync-copy.yml
Copy to Clipboard Copied!
第 29 章 使用 Ansible playbook 管理 IdM DNS 区域
作为 RHEL 身份管理(IdM)管理员,您可以使用 ansible-freeipa
软件包中的 dnszone
模块来管理 IdM DNS 区域的工作方式。
先决条件
- DNS 服务安装在 IdM 服务器上。有关如何使用 Ansible 安装带有集成 DNS 的 IdM 服务器的更多信息,请参阅使用 Ansible playbook 安装身份管理服务器。
29.1. 支持的 DNS 区类型
RHEL 身份管理(IdM)支持两种类型的 DNS 区域: primary 和 forward zone。此处描述了这两种类型的区,包括 DNS 转发的一个场景示例。
本指南对区域类型使用 BIND 术语,不同于用于 Microsoft Windows DNS 的术语。BIND 服务器中的 Primary zones 与 Microsoft Windows DNS 中的 forward lookup zones 和 reverse lookup zones 作用相同。BIND 中的转发区域的作用与 Microsoft Windows DNS 中的条件 转发器相同。
- 主 DNS 区域
主 DNS 区域包含权威 DNS 数据,并且可以接受动态 DNS 更新。这个行为等同于标准 BIND 配置中的
类型 master
设置。您可以使用ipa dnszone
github 命令管理主区。在遵守标准 DNS 规则时,每个主区必须包含
start of authority
(SOA)和nameserver
(NS)记录。在创建 DNS 区域时,IdM 会自动生成这些记录,但您必须手动将 NS 记录复制到父区域,以创建正确委托。根据标准 BIND 行为,查询服务器不具有权威的名称将转发到其他 DNS 服务器。这些 DNS 服务器(称为转发器)可能是也可能不是查询的权威。
例 29.1. DNS 转发的示例
IdM 服务器包含
test.example.
主区域。此区域包含sub.test.example.
名称的 NS 委派记录。此外,使用sub.text.example
子区域的192.0.2.254
转发器 IP 地址配置了test.example.
区域。查询名称
不存在.test.example.
的客户端会收到NXDomain
回答,并且不会发生转发,因为 IdM 服务器对此名称具有权威。另一方面,查询
host1.sub.test.example.
name 会转发到配置的转发器192.0.2.254
,因为 IdM 服务器对此名称没有权威。- 转发 DNS 区域
从 IdM 的角度来看,转发 DNS 区域不包含任何权威数据。事实上,正向"区"通常仅包含两段信息:
- 域名
- 与域关联的 DNS 服务器的 IP 地址
所有对属于定义的域的名称的查询都转发到指定的 IP 地址。此行为等同于标准 BIND 配置中的 type forward
设置。您可以使用 ipa dnsforwardzone
fluentd 命令管理转发区。
转发 DNS 区域在 IdM-Active Directory(AD)信任的上下文中特别有用。如果 IdM DNS 服务器对 idm.example.com 区域具有权威,并且 AD DNS 服务器对 ad.example.com 区域具有权威,则 ad.example.com 是 idm.example.com 主区的 DNS 转发区域。这意味着,当查询来自 IdM 客户端以获取 somehost.ad.example.com 的 IP 地址时,查询将转发到 ad.example.com IdM DNS 转发区域中指定的 AD 域控制器。
29.2. 使用 Ansible 时主 IdM DNS 区的配置属性
RHEL 身份管理(IdM)创建一个带有特定默认配置的新区,如刷新周期、传输设置或缓存设置。在 IdM DNS 区域属性 中,您可以找到默认区配置的属性,您可以使用使用 ipadnszone
模块的 Ansible playbook 进行修改。
除了设置区域的实际信息外,这些设置定义了 DNS 服务器如何处理 权威启动 (SOA)记录条目以及它如何从 DNS 名称服务器更新其记录。
属性 | ansible-freeipa 变量 | 描述 |
---|---|---|
权威名称服务器 |
| 设置主 DNS 名称服务器的域名,也称为 SOA MNAME。
默认情况下,每个 IdM 服务器在 SOA MNAME 字段中公告其自身。因此,使用- |
管理员电子邮件地址 |
| 设置要用于区域管理员的电子邮件地址。这默认为主机上的 root 帐户。 |
SOA 串行 |
| 在 SOA 记录中设置序列号。请注意,IdM 会自动设置版本号,用户不应该修改它。 |
SOA 刷新 |
| 设置次要 DNS 服务器在从主 DNS 服务器请求更新前等待的间隔(以秒为单位)。 |
SOA 重试 |
| 设置在重试失败的刷新操作前要等待的时间(以秒为单位)。 |
SOA 过期 |
| 设置次要 DNS 服务器在结束操作尝试之前尝试执行刷新更新的时间(以秒为单位)。 |
最低 SOA |
| 根据 RFC 2308,将生存时间(TTL)值(以秒为单位)设置为负缓存。 |
SOA 生存时间 |
|
为区域 apex 的记录设置 TTL(以秒为单位)。例如,在区域 |
默认生存时间 |
| 将默认时间设置为 live(TTL),以秒为单位,为之前未设置单个 TTL 值的区域中的所有值提供负缓存。 |
BIND 更新策略 |
| 设置 DNS 区域中客户端允许的权限。 |
动态更新 |
| 启用对客户端的 DNS 记录的动态更新。 请注意,如果设置为 false,IdM 客户端计算机将无法添加或更新其 IP 地址。 |
允许传输 |
| 提供允许传输给定区域的 IP 地址或网络名称列表,用分号(;)分隔。
默认情况下禁用区域传送。默认的 |
允许查询 |
| 提供允许发出 DNS 查询的 IP 地址或网络名称列表,用分号(;)分隔。 |
允许 PTR 同步 |
| 设置区域的 A 或 AAAA 记录(转发记录)是否将自动与 PTR(反向)记录同步。 |
区域转发器 |
| 指定为 DNS 区域特别配置的转发器。这与 IdM 域中使用的任何全局转发器分开。 要指定多个转发器,请多次使用 选项。 |
forward 策略 |
| 指定 forward 策略。有关支持的策略的详情,请查看 IdM 中的 DNS 转发策略。 |
29.3. 使用 Ansible 在 IdM DNS 中创建主区域
按照以下流程,使用 Ansible playbook 确保主 DNS 区域存在。在以下流程使用的示例中,您确保 zone.idm.example.com DNS 区域存在。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您知道 IdM 管理员密码。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
Copy to Clipboard Copied! 打开清单文件,并确保
[ipaserver]
部分中列出了您要配置的 IdM 服务器。例如,要指示 Ansible 配置 server.idm.example.com,请输入:[ipaserver] server.idm.example.com
[ipaserver] server.idm.example.com
Copy to Clipboard Copied! 生成 dnszone-present.yml Ansible playbook 文件的副本。例如:
cp dnszone-present.yml dnszone-present-copy.yml
$ cp dnszone-present.yml dnszone-present-copy.yml
Copy to Clipboard Copied! - 打开 dnszone-present-copy.yml 文件进行编辑。
通过在
ipadnszone
task 部分中设置以下变量来调整文件:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 将
zone_name
变量设置为 zone.idm.example.com。这是当前示例修改的 Ansible playbook 文件:
--- - name: Ensure dnszone present hosts: ipaserver become: true tasks: - name: Ensure zone is present. ipadnszone: ipaadmin_password: "{{ ipaadmin_password }}" zone_name: zone.idm.example.com state: present
--- - name: Ensure dnszone present hosts: ipaserver become: true tasks: - name: Ensure zone is present. ipadnszone: ipaadmin_password: "{{ ipaadmin_password }}" zone_name: zone.idm.example.com state: present
Copy to Clipboard Copied! -
将
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file dnszone-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file dnszone-present-copy.yml
Copy to Clipboard Copied!
29.4. 使用 Ansible playbook 确保 IdM 中存在一个带有多个变量的主 DNS 区域
按照以下流程,使用 Ansible playbook 确保主 DNS 区域存在。在以下流程中使用的示例中,IdM 管理员确保存在 zone.idm.example.com DNS 区域。Ansible playbook 配置区域的多个参数。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
Copy to Clipboard Copied! 生成 dnszone-all-params.yml Ansible playbook 文件的副本。例如:
cp dnszone-all-params.yml dnszone-all-params-copy.yml
$ cp dnszone-all-params.yml dnszone-all-params-copy.yml
Copy to Clipboard Copied! - 打开 dnszone-all-params-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipadnszone
task 部分中设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
zone_name
变量设置为 zone.idm.example.com。 -
如果要允许正向和反向记录同步,这是 A 和 AAAA 记录与 PTR 记录的同步,请将
allow_sync_ptr
变量设置为 true。 -
将
dynamic_update
变量设置为 true,以启用 IdM 客户端计算机添加或更新其 IP 地址。 -
将
dnssec
变量设置为 true,以允许区域中的记录内联 DNSSEC 签名。 -
将
allow_transfer
变量设置为区域中次要名称服务器的 IP 地址。 -
将
allow_query
变量设置为允许发出查询的 IP 地址或网络。 -
将
forwarders
变量设置为全局转发器的 IP 地址。 -
将
serial
变量设置为 SOA 记录序列号。 -
定义区域中 DNS 记录的
refresh
、retry
、expire
、minimum
、ttl
和default_ttl
值。 -
使用
nsec3param_rec 变量,为区域定义 NSEC3
PARAM 记录。 -
将
skip_overlap_check
变量设置为 true,从而强制创建 DNS,即使它与现有区域重叠。 将
skip_nameserver_check
设置为 true,从而强制 DNS 区域创建,即使名称服务器不可解析。这是当前示例修改的 Ansible playbook 文件:
--- - name: Ensure dnszone present hosts: ipaserver become: true tasks: - name: Ensure zone is present. freeipa.ansible_freeipa.ipadnszone: ipaadmin_password: "{{ ipaadmin_password }}" zone_name: zone.idm.example.com allow_sync_ptr: true dynamic_update: true dnssec: true allow_transfer: - 1.1.1.1 - 2.2.2.2 allow_query: - 1.1.1.1 - 2.2.2.2 forwarders: - ip_address: 8.8.8.8 - ip_address: 8.8.4.4 port: 52 serial: 1234 refresh: 3600 retry: 900 expire: 1209600 minimum: 3600 ttl: 60 default_ttl: 90 name_server: server.idm.example.com. admin_email: admin.admin@idm.example.com nsec3param_rec: "1 7 100 0123456789abcdef" skip_overlap_check: true skip_nameserver_check: true state: present
--- - name: Ensure dnszone present hosts: ipaserver become: true tasks: - name: Ensure zone is present. freeipa.ansible_freeipa.ipadnszone: ipaadmin_password: "{{ ipaadmin_password }}" zone_name: zone.idm.example.com allow_sync_ptr: true dynamic_update: true dnssec: true allow_transfer: - 1.1.1.1 - 2.2.2.2 allow_query: - 1.1.1.1 - 2.2.2.2 forwarders: - ip_address: 8.8.8.8 - ip_address: 8.8.4.4 port: 52 serial: 1234 refresh: 3600 retry: 900 expire: 1209600 minimum: 3600 ttl: 60 default_ttl: 90 name_server: server.idm.example.com. admin_email: admin.admin@idm.example.com nsec3param_rec: "1 7 100 0123456789abcdef" skip_overlap_check: true skip_nameserver_check: true state: present
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file dnszone-all-params-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file dnszone-all-params-copy.yml
Copy to Clipboard Copied!
29.5. 在给定 IP 地址时,使用 Ansible playbook 确保存在用于反向 DNS 查找的区域
按照以下流程,使用 Ansible playbook 确保反向 DNS 区域存在。在以下步骤中使用的示例中,IdM 管理员使用 IdM 主机的 IP 地址和前缀长度确保存在反向 DNS 查找区域。
使用 name_from_ip
变量提供 DNS 服务器的 IP 地址前缀长度,允许您控制区域名称。如果您不声明前缀长度,系统会查询 DNS 服务器以获取区,并根据 192.168.1.2 的 name_from_ip
值,查询可以返回以下 DNS 区域中的任何一个:
- 1.168.192.in-addr.arpa.
- 168.192.in-addr.arpa.
- 192.in-addr.arpa.
由于查询返回的区域可能不是您预期的区域,name_from_ip
只能与 state
选项设置为 present 一起使用,以防止意外删除区域。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnszone
Copy to Clipboard Copied! 生成 dnszone-reverse-from-ip.yml Ansible playbook 文件的副本。例如:
cp dnszone-reverse-from-ip.yml dnszone-reverse-from-ip-copy.yml
$ cp dnszone-reverse-from-ip.yml dnszone-reverse-from-ip-copy.yml
Copy to Clipboard Copied! - 打开 dnszone-reverse-from-ip-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipadnszone
task 部分中设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 将
name_from_ip
变量设置为 IdM 名称服务器的 IP,并提供其前缀长度。这是当前示例修改的 Ansible playbook 文件:
--- - name: Ensure dnszone present hosts: ipaserver become: true tasks: - name: Ensure zone for reverse DNS lookup is present. freeipa.ansible_freeipa.ipadnszone: ipaadmin_password: "{{ ipaadmin_password }}" name_from_ip: 192.168.1.2/24 state: present register: result - name: Display inferred zone name. debug: msg: "Zone name: {{ result.dnszone.name }}"
--- - name: Ensure dnszone present hosts: ipaserver become: true tasks: - name: Ensure zone for reverse DNS lookup is present. freeipa.ansible_freeipa.ipadnszone: ipaadmin_password: "{{ ipaadmin_password }}" name_from_ip: 192.168.1.2/24 state: present register: result - name: Display inferred zone name. debug: msg: "Zone name: {{ result.dnszone.name }}"
Copy to Clipboard Copied!
playbook 创建一个区,用于从 192.168.1.2 IP 地址及其前缀长度 24 中反向 DNS 查找。接下来,playbook 显示生成的区域名称。
-
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file dnszone-reverse-from-ip-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file dnszone-reverse-from-ip-copy.yml
Copy to Clipboard Copied!
第 30 章 使用 Ansible 管理 IdM 中的 DNS 位置
作为身份管理(IdM)管理员,您可以使用 ansible-freeipa
软件包中提供 的位置模块管理 IdM DNS 位置
。
30.1. 基于 DNS 的服务发现
在基于 DNS 的服务发现中,客户端使用 DNS 协议在提供特定服务的网络中查找服务器,如 LDAP 或
Kerberos
。种典型的操作类型是允许客户端在最接近的网络基础架构中查找身份验证服务器,因为它们提供更高的吞吐量和较低的网络延迟,从而降低总体成本。
服务发现的主要优点是:
- 无需使用附近服务器的名称明确配置客户端。
- DNS 服务器用作策略的中央提供程序。使用同一 DNS 服务器的客户端有权访问关于服务提供商及其首选顺序的相同策略。
在 RHEL Identity Management (IdM)域中,LDAP
、Kerberos
和其他服务存在 DNS 服务记录(SRV 记录)。例如,以下命令在 IdM DNS 域中查询 DNS 服务器以获取提供基于 TCP 的 Kerberos
服务的主机:
例 30.1. 独立于 DNS 位置的结果
dig -t SRV +short _kerberos._tcp.idm.example.com
$ dig -t SRV +short _kerberos._tcp.idm.example.com
0 100 88 idmserver-01.idm.example.com.
0 100 88 idmserver-02.idm.example.com.
输出包含以下信息:
-
0
(优先级):目标主机的优先级.首选使用较低值。 -
100
(权重).为优先级相同的条目指定相对权重。如需更多信息,请参阅 RFC 2782 第 3 节。 -
88
(端口号):服务的端口号。 - 提供服务的主机的规范名称。
在示例中,返回的两个主机名具有相同的优先级和权重。在本例中,客户端使用来自结果列表中的随机条目。
相反,当客户端配置为查询在 DNS 位置配置的 DNS 服务器时,输出会有所不同。对于分配到某个位置的 IdM 服务器,会返回定制值。在以下示例中,客户端被配置为在位置 germany
中查询 DNS 服务器:
例 30.2. 基于 DNS 位置的结果
dig -t SRV +short _kerberos._tcp.idm.example.com
$ dig -t SRV +short _kerberos._tcp.idm.example.com
_kerberos._tcp.germany._locations.idm.example.com.
0 100 88 idmserver-01.idm.example.com.
50 100 88 idmserver-02.idm.example.com.
IdM DNS 服务器自动返回一个 DNS 别名(CNAME),指向一个 DNS 位置特定的 SRV 记录(首选本地服务器)。此 CNAME 记录显示在输出的第一行中。在示例中,主机 idmserver-01.idm.example.com 具有最低的优先级值,因此是首选的。idmserver-02.idm.example.com 具有更高的优先级,因此仅在首选主机不可用的情况下用作备份。
30.2. DNS 位置的部署注意事项
在使用集成的 DNS 时,RHEL 身份管理(IdM)可以生成特定于位置的服务(SRV)记录。因为每个 IdM DNS 服务器都会生成特定于位置的 SRV 记录,所以您必须在每个 DNS 位置至少安装一个 IdM DNS 服务器。
客户端与 DNS 位置的关联仅由客户端收到的 DNS 记录定义。因此,如果客户端执行 DNS 服务发现,从 IdM DNS 服务器解析特定于位置的记录,您可以将 IdM DNS 服务器与非 IdM DNS 使用者服务器合并,并递归器。
在大多数使用混合 IdM 和非 IdM DNS 服务的部署中,DNS 递归器都通过使用往返时间指标自动选择最接近的 IdM DNS 服务器。通常,这可确保使用非 IdM DNS 服务器的客户端正在获取最接近的 DNS 位置的记录,从而使用最佳 IdM 服务器集。
30.3. DNS 生存时间(TTL)
客户端可以在区域配置中设置的一段时间内缓存 DNS 资源记录。由于这种缓存,客户端可能无法接收更改,直到生存时间(TTL)值过期为止。RHEL Identity Management (IdM)中的默认 TTL 值为 1 天
。
如果您的客户端计算机在站点间漫游,您应该调整 IdM DNS 区的 TTL 值。将值设为比客户端在站点之间 roam 需要的时间值低。这样可确保客户端上缓存的 DNS 条目在重新连接到另一个站点之前过期,从而查询 DNS 服务器刷新特定于位置的 SRV 记录。
30.4. 使用 Ansible 确保存在 IdM 位置
作为 RHEL 身份管理系统管理员(IdM),您可以配置 IdM DNS 位置,以允许客户端在最接近的网络基础架构中查找身份验证服务器。
以下流程描述了如何使用 Ansible playbook 来确保 IdM 中存在 DNS 位置。这个示例描述了如何确保 IdM 中存在 germany DNS 位置。因此,您可以将特定的 IdM 服务器分配给这个位置,以便本地 IdM 客户端可以使用它们来缩短服务器响应时间。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 您了解 DNS 位置 的部署注意事项。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/location/
目录中的location-present.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/location/location-present.yml location-present-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/location/location-present.yml location-present-copy.yml
Copy to Clipboard Copied! -
打开
location-present-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipalocation
任务部分设置以下变量来调整文件:-
调整任务的
name
,使其与您的用例对应。 -
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为位置的名称。
这是当前示例修改的 Ansible playbook 文件:
--- - name: location present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "germany" location is present freeipa.ansible_freeipa.ipalocation: ipaadmin_password: "{{ ipaadmin_password }}" name: germany
--- - name: location present example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "germany" location is present freeipa.ansible_freeipa.ipalocation: ipaadmin_password: "{{ ipaadmin_password }}" name: germany
Copy to Clipboard Copied! -
调整任务的
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory location-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory location-present-copy.yml
Copy to Clipboard Copied!
30.5. 使用 Ansible 确保缺少 IdM 位置
作为 RHEL 身份管理系统管理员(IdM),您可以配置 IdM DNS 位置,以允许客户端在最接近的网络基础架构中查找身份验证服务器。
以下流程描述了如何使用 Ansible playbook 来确保 IdM 中没有 DNS 位置。这个示例描述了如何确保 IdM 中没有 germany DNS 位置。因此,您无法将特定的 IdM 服务器分配给这个位置,本地 IdM 客户端无法使用它们。
先决条件
- 没有 IdM 服务器被分配给 germany DNS 位置。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - 示例假定您已 创建并配置了 ~/MyPlaybooks/ 目录,来作为存储示例 playbook 副本的中心位置。
流程
进入 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 制作位于
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/location/
目录中的location-absent.yml
文件的副本:cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/location/location-absent.yml location-absent-copy.yml
$ cp /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/location/location-absent.yml location-absent-copy.yml
Copy to Clipboard Copied! -
打开
location-absent-copy.yml
Ansible playbook 文件以进行编辑。 通过在
freeipa.ansible_freeipa.ipalocation
任务部分设置以下变量来调整文件:-
调整任务的
name
,使其与您的用例对应。 -
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为 DNS 位置的名称。 -
确保
state
变量设置为absent
。
这是当前示例修改的 Ansible playbook 文件:
--- - name: location absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "germany" location is absent freeipa.ansible_freeipa.ipalocation: ipaadmin_password: "{{ ipaadmin_password }}" name: germany state: absent
--- - name: location absent example hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure that the "germany" location is absent freeipa.ansible_freeipa.ipalocation: ipaadmin_password: "{{ ipaadmin_password }}" name: germany state: absent
Copy to Clipboard Copied! -
调整任务的
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory location-absent-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory location-absent-copy.yml
Copy to Clipboard Copied!
第 31 章 在 IdM 中管理 DNS 转发
了解在身份管理(IdM) Web UI、IdM CLI 以及使用 Ansible 中配置 DNS 全局转发器和 DNS 转发区域的信息。
31.1. IdM DNS 服务器的两个角色
DNS 转发会影响 DNS 服务如何应答 DNS 查询。默认情况下,集成了 IdM 的 Berkeley Internet Name Domain (BIND) 作为一个 authoritative 和一个 recursive DNS 服务器:
- 权威 DNS 服务器
- 当 DNS 客户端查询属于 IdM 服务器具有权威的 DNS 区域的名称时,BIND 回复包含在配置区域中的数据。权威数据总是优先于任何其他数据。
- 递归 DNS 服务器
- 当 DNS 客户端查询 IdM 服务器不是权威的名称时,BIND 会尝试使用其他 DNS 服务器解析查询。如果未定义转发器,BIND 会询问 Internet 上的根服务器,并使用递归解析算法回答 DNS 查询。
在某些情况下,不需要让 BIND 直接联系其他 DNS 服务器,并根据 Internet 上可用的数据执行递归。您可以将 BIND 配置为使用另一个 DNS 服务器( 转发器 )来解析查询。
当您将 BIND 配置为使用转发器时,查询和答案将在 IdM 服务器和转发器之间来回转发,IdM 服务器充当非权威数据的 DNS 缓存。
31.2. 在 IdM Web UI 中添加全局转发器
按照以下流程,在身份管理(IdM) Web UI 中添加一个全局 DNS 转发器。
先决条件
- 以 IdM 管理员身份登录到 IdM WebUI。
- 您知道要将查询转发到的 DNS 服务器的 Internet 协议(IP)地址。
流程
在 IdM Web UI 中,选择
Network Services
→DNS Global Configuration
→DNS
。在
DNS Global Configuration
部分中,单击Add
。指定将接收转发 DNS 查询的 DNS 服务器的 IP 地址。
选择
Forward policy
。-
单击窗口顶部的
Save
。
验证
选择
Network Services
→DNS Global Configuration
→DNS
。验证 IdM Web UI 中是否存在并启用了带有您指定的 forward 策略的全局转发器。
31.3. 在 CLI 中添加全局转发器
按照以下流程,使用命令行(CLI)添加一个全局 DNS 转发器。
先决条件
- 以 IdM 管理员身份登录。
- 您知道要将查询转发到的 DNS 服务器的 Internet 协议(IP)地址。
流程
使用
ipa dnsconfig-mod
命令添加新的全局转发器。使用--forwarder
选项指定 DNS 转发器的 IP 地址。ipa dnsconfig-mod --forwarder=10.10.0.1
[user@server ~]$ ipa dnsconfig-mod --forwarder=10.10.0.1 Server will check DNS forwarder(s). This may take some time, please wait ... Global forwarders: 10.10.0.1 IPA DNS servers: server.example.com
Copy to Clipboard Copied!
验证
使用
dnsconfig-show
命令显示全局转发器。ipa dnsconfig-show
[user@server ~]$ ipa dnsconfig-show Global forwarders: 10.10.0.1 IPA DNS servers: server.example.com
Copy to Clipboard Copied!
31.4. 在 IdM Web UI 中添加 DNS 转发区域
按照以下流程,在身份管理(IdM) Web UI 中添加一个 DNS 转发区。
除非绝对需要,否则请不要使用转发区域。转发区域不是标准解决方案,使用它们可能会导致意外和有问题的行为。如果您必须使用 forward zone,限制使用它们覆盖全局转发配置。
在创建新 DNS 区域时,红帽建议您始终使用名称服务器(NS)记录和避免转发区域,始终使用标准 DNS 委派。在大多数情况下,使用全局转发器足够了,并且转发区不需要。
先决条件
- 以 IdM 管理员身份登录到 IdM WebUI。
- 您知道要将查询转发到的 DNS 服务器的 Internet 协议(IP)地址。
流程
在 IdM Web UI 中,选择
Network Services
→DNS Forward Zones
→DNS
。在
DNS Forward Zones
部分,点Add
。在
Add DNS forward zone
窗口中,指定 forward zone 名称。点击
Add
按钮,并指定 DNS 服务器的 IP 地址来接收转发请求。您可以为每个转发区指定多个转发器。选择
Forward policy
。-
单击窗口底部的
Add
,以添加新的正向区域。
验证
在 IdM Web UI 中,选择
Network Services
→DNS Forward Zones
→DNS
。验证您创建的 forward 区域(带有您指定的 forwarders 和 forward 策略)是否存在并在 IdM Web UI 中启用。
31.5. 在 CLI 中添加 DNS 转发区域
按照以下流程,使用命令行(CLI)添加一个 DNS 转发区域。
除非绝对需要,否则请不要使用转发区域。转发区域不是标准解决方案,使用它们可能会导致意外和有问题的行为。如果您必须使用 forward zone,限制使用它们覆盖全局转发配置。
在创建新 DNS 区域时,红帽建议您始终使用名称服务器(NS)记录和避免转发区域,始终使用标准 DNS 委派。在大多数情况下,使用全局转发器足够了,并且转发区不需要。
先决条件
- 以 IdM 管理员身份登录。
- 您知道要将查询转发到的 DNS 服务器的 Internet 协议(IP)地址。
流程
使用
dnsforwardzone-add
命令添加新的转发区域。如果转发策略不是none
,则使用--forwarder
选项至少指定一个转发器,并使用--forward-policy
选项指定转发策略。ipa dnsforwardzone-add forward.example.com. --forwarder=10.10.0.14 --forwarder=10.10.1.15 --forward-policy=first
[user@server ~]$ ipa dnsforwardzone-add forward.example.com. --forwarder=10.10.0.14 --forwarder=10.10.1.15 --forward-policy=first Zone name: forward.example.com. Zone forwarders: 10.10.0.14, 10.10.1.15 Forward policy: first
Copy to Clipboard Copied!
验证
使用
dnsforwardzone-show
命令显示您刚才创建的 DNS 转发区域。ipa dnsforwardzone-show forward.example.com.
[user@server ~]$ ipa dnsforwardzone-show forward.example.com. Zone name: forward.example.com. Zone forwarders: 10.10.0.14, 10.10.1.15 Forward policy: first
Copy to Clipboard Copied!
31.6. 使用 Ansible 在 IdM 中建立 DNS 全局转发器
按照以下流程,使用 Ansible playbook 在 IdM 中建立一个 DNS 全局转发器。
在以下示例流程中,IdM 管理员创建了一个到互联网协议(IP)v4 地址为 8.8.6.6
和 IPv6 地址为 2001:4860:4860::8800
的 DNS 服务器,端口为 53
的 DNS 全局转发器。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
Copy to Clipboard Copied! 复制
set-configuration.yml
Ansible playbook 文件。例如:cp set-configuration.yml establish-global-forwarder.yml
$ cp set-configuration.yml establish-global-forwarder.yml
Copy to Clipboard Copied! -
打开 create
-global-forwarder.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将 playbook
的 name
变量更改为 Playbook,以在 IdM DNS 中建立全局转发器
。 -
在
tasks
部分中,更改任务的名称
,来创建一个到 8.8.6.6 和 2001:4860:4860::8800 的 DNS 全局转发器
。 在
freeipa.ansible_freeipa.ipadnsconfig
部分的forwarders
部分中:-
将第一个
ip_address
值更改为全局转发器的 IPv4 地址:8.8.6.6
。 -
将第二个
ip_address
值更改为全局转发器的 IPv6 地址:2001:4860:4860::8800
。 -
验证
端口
值是否已设置为53
。
-
将第一个
将
forward_policy
更改为first
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Playbook to establish a global forwarder in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Create a DNS global forwarder to 8.8.6.6 and 2001:4860:4860::8800 freeipa.ansible_freeipa.ipadnsconfig: forwarders: - ip_address: 8.8.6.6 - ip_address: 2001:4860:4860::8800 port: 53 forward_policy: first allow_sync_ptr: true
--- - name: Playbook to establish a global forwarder in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Create a DNS global forwarder to 8.8.6.6 and 2001:4860:4860::8800 freeipa.ansible_freeipa.ipadnsconfig: forwarders: - ip_address: 8.8.6.6 - ip_address: 2001:4860:4860::8800 port: 53 forward_policy: first allow_sync_ptr: true
Copy to Clipboard Copied! -
将 playbook
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file establish-global-forwarder.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file establish-global-forwarder.yml
Copy to Clipboard Copied!
31.7. 使用 Ansible 确保 DNS 全局转发器在 IdM 中被禁用
按照以下流程,使用 Ansible playbook 确保 DNS 全局转发器在 IdM 中被禁用。在以下示例中,IdM 管理员确保将全局转发器的转发策略设置为 none
,这样可有效地禁用全局转发器。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
Copy to Clipboard Copied! 验证
disable-global-forwarders.yml
Ansible playbook 文件的内容,它已配置为禁用所有 DNS 全局转发器。例如:cat disable-global-forwarders.yml --- - name: Playbook to disable global DNS forwarders hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Disable global forwarders. freeipa.ansible_freeipa.ipadnsconfig: forward_policy: none
$ cat disable-global-forwarders.yml --- - name: Playbook to disable global DNS forwarders hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Disable global forwarders. freeipa.ansible_freeipa.ipadnsconfig: forward_policy: none
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file disable-global-forwarders.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file disable-global-forwarders.yml
Copy to Clipboard Copied!
31.8. 使用 Ansible 确保 IdM 中存在 DNS 转发区域
按照以下流程,使用 Ansible playbook 确保 DNS 转发区在 IdM 中存在。在以下示例中,IdM 管理员确保 example.com
的 DNS 转发区域存在到 Internet 协议(IP)地址为 8.8.8.8
的 DNS 服务器。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
Copy to Clipboard Copied! 制作
forwarders-absent.yml
Ansible playbook 文件的副本。例如:cp forwarders-absent.yml ensure-presence-forwardzone.yml
$ cp forwarders-absent.yml ensure-presence-forwardzone.yml
Copy to Clipboard Copied! -
打开
ensure-presence-forwardzone.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将 playbook
的 name
变量更改为 Playbook,以确保 IdM DNS 中存在 dnsforwardzone
。 -
在
tasks
部分,更改任务的名称
,来确保 example.com 到 8.8.8.8 的 dnsforwardzone 存在
。 -
在
tasks
部分中,将freeipa.ansible_freeipa.ipadnsconfig
标题改为freeipa.ansible_freeipa.ipadnsforwardzone
。 在
freeipa.ansible_freeipa.ipadnsforwardzone
部分:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
添加
name
变量,并将它设置为example.com
。 在
forwarders
部分中:-
删除
ip_address
和port
行。 通过在短划线后指定 DNS 服务器的 IP 地址来添加 DNS 服务器的 IP 地址以接收转发的请求:
- 8.8.8.8
- 8.8.8.8
Copy to Clipboard Copied!
-
删除
-
添加
forwardpolicy
变量,并将它设为第一
。 -
添加
skip_overlap_check
变量,并将它设为true
。 -
将
state
变量更改为present
。
对于当前示例为修改过的 Ansible playbook 文件:
-
表示
--- - name: Playbook to ensure the presence of a dnsforwardzone in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the presence of a dnsforwardzone for example.com to 8.8.8.8 freeipa.ansible_freeipa.ipadnsforwardzone: ipaadmin_password: "{{ ipaadmin_password }}" name: example.com forwarders: - 8.8.8.8 forwardpolicy: first skip_overlap_check: true state: present
--- - name: Playbook to ensure the presence of a dnsforwardzone in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the presence of a dnsforwardzone for example.com to 8.8.8.8 freeipa.ansible_freeipa.ipadnsforwardzone: ipaadmin_password: "{{ ipaadmin_password }}" name: example.com forwarders: - 8.8.8.8 forwardpolicy: first skip_overlap_check: true state: present
Copy to Clipboard Copied! -
将 playbook
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-presence-forwardzone.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-presence-forwardzone.yml
Copy to Clipboard Copied!
31.9. 使用 Ansible 确保 DNS 转发区域 在 IdM 中有多个转发器
按照以下流程,使用 Ansible playbook 确保 IdM 中的 DNS 转发区有多个转发器。在以下示例中,IdM 管理员确保 example .com
的 DNS 转发区转发到 8.8.8.8
和 4.4.4.4
。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
Copy to Clipboard Copied! 制作
forwarders-absent.yml
Ansible playbook 文件的副本。例如:cp forwarders-absent.yml ensure-presence-multiple-forwarders.yml
$ cp forwarders-absent.yml ensure-presence-multiple-forwarders.yml
Copy to Clipboard Copied! -
打开
ensure-presence-multiple-forwarders.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将 playbook
的 name
变量更改为 Playbook,以确保 IdM DNS 中的 dnsforwardzone 中存在多个转发器
。 -
在
tasks
部分,更改任务的名称
,来确保 example.com 的 dnsforwardzone 中存在 8.8.8.8 和 4.4.4.4 转发器
。 -
在
tasks
部分中,将freeipa.ansible_freeipa.ipadnsconfig
标题改为freeipa.ansible_freeipa.ipadnsforwardzone
。 在
freeipa.ansible_freeipa.ipadnsforwardzone
部分:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
添加
name
变量,并将它设置为example.com
。 在
forwarders
部分中:-
删除
ip_address
和port
行。 添加您要确保的 DNS 服务器的 IP 地址,以短划线开头:
- 8.8.8.8 - 4.4.4.4
- 8.8.8.8 - 4.4.4.4
Copy to Clipboard Copied!
-
删除
- 将 state 变量更改为 present。
对于当前示例为修改过的 Ansible playbook 文件:
-
表示
--- - name: name: Playbook to ensure the presence of multiple forwarders in a dnsforwardzone in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure presence of 8.8.8.8 and 4.4.4.4 forwarders in dnsforwardzone for example.com freeipa.ansible_freeipa.ipadnsforwardzone: ipaadmin_password: "{{ ipaadmin_password }}" name: example.com forwarders: - 8.8.8.8 - 4.4.4.4 state: present
--- - name: name: Playbook to ensure the presence of multiple forwarders in a dnsforwardzone in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure presence of 8.8.8.8 and 4.4.4.4 forwarders in dnsforwardzone for example.com freeipa.ansible_freeipa.ipadnsforwardzone: ipaadmin_password: "{{ ipaadmin_password }}" name: example.com forwarders: - 8.8.8.8 - 4.4.4.4 state: present
Copy to Clipboard Copied! -
将 playbook
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-presence-multiple-forwarders.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-presence-multiple-forwarders.yml
Copy to Clipboard Copied!
31.10. 使用 Ansible 确保 IdM 中禁用了 DNS 转发区
按照以下流程,使用 Ansible playbook 确保 DNS 转发区在 IdM 中被禁用。在以下示例中,IdM 管理员确保 example.com
的 DNS 转发区被禁用。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
Copy to Clipboard Copied! 制作
forwarders-absent.yml
Ansible playbook 文件的副本。例如:cp forwarders-absent.yml ensure-disabled-forwardzone.yml
$ cp forwarders-absent.yml ensure-disabled-forwardzone.yml
Copy to Clipboard Copied! -
打开
ensure-disabled-forwardzone.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将 playbook
的 name
变量更改为 Playbook,以确保在 IdM DNS 中禁用了 dnsforwardzone
。 -
在
tasks
部分中,更改任务的名称
,来确保 example.com 的 dnsforwardzone 被禁用
。 -
在
tasks
部分中,将freeipa.ansible_freeipa.ipadnsconfig
标题改为freeipa.ansible_freeipa.ipadnsforwardzone
。 在
freeipa.ansible_freeipa.ipadnsforwardzone
部分:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
添加
name
变量,并将它设置为example.com
。 -
删除整个
forwarders
部分。 -
将
state
变量更改为disabled
。
对于当前示例为修改过的 Ansible playbook 文件:
-
表示
--- - name: Playbook to ensure a dnsforwardzone is disabled in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure a dnsforwardzone for example.com is disabled freeipa.ansible_freeipa.ipadnsforwardzone: ipaadmin_password: "{{ ipaadmin_password }}" name: example.com state: disabled
--- - name: Playbook to ensure a dnsforwardzone is disabled in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure a dnsforwardzone for example.com is disabled freeipa.ansible_freeipa.ipadnsforwardzone: ipaadmin_password: "{{ ipaadmin_password }}" name: example.com state: disabled
Copy to Clipboard Copied! -
将 playbook
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-disabled-forwardzone.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-disabled-forwardzone.yml
Copy to Clipboard Copied!
31.11. 使用 Ansible 确保 IdM 中没有 DNS 转发区域
按照以下流程,使用 Ansible playbook 确保 DNS 转发区在 IdM 中不存在。在以下示例中,IdM 管理员确保 example.com
缺少 DNS 转发区。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsconfig
Copy to Clipboard Copied! 制作
forwarders-absent.yml
Ansible playbook 文件的副本。例如:cp forwarders-absent.yml ensure-absence-forwardzone.yml
$ cp forwarders-absent.yml ensure-absence-forwardzone.yml
Copy to Clipboard Copied! -
打开
ensure-absence-forwardzone.yml
文件进行编辑。 通过设置以下变量来调整文件:
-
将 playbook
的 name
变量更改为 Playbook,以确保 IdM DNS 中没有 dnsforwardzone
。 -
在
tasks
部分中,更改任务的名称
,来确保 example.com 的 dnsforwardzone 不存在
。 -
在
tasks
部分中,将freeipa.ansible_freeipa.ipadnsconfig
标题改为freeipa.ansible_freeipa.ipadnsforwardzone
。 在
freeipa.ansible_freeipa.ipadnsforwardzone
部分:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
添加
name
变量,并将它设置为example.com
。 -
删除整个
forwarders
部分。 -
将
state
变量保留为absent
。
对于当前示例为修改过的 Ansible playbook 文件:
-
表示
--- - name: Playbook to ensure the absence of a dnsforwardzone in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the absence of a dnsforwardzone for example.com freeipa.ansible_freeipa.ipadnsforwardzone: ipaadmin_password: "{{ ipaadmin_password }}" name: example.com state: absent
--- - name: Playbook to ensure the absence of a dnsforwardzone in IdM DNS hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure the absence of a dnsforwardzone for example.com freeipa.ansible_freeipa.ipadnsforwardzone: ipaadmin_password: "{{ ipaadmin_password }}" name: example.com state: absent
Copy to Clipboard Copied! -
将 playbook
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-absence-forwardzone.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-absence-forwardzone.yml
Copy to Clipboard Copied!
第 32 章 使用 Ansible 管理 IdM 中的 DNS 记录
本章论述了如何使用 Ansible playbook 在 RHEL 身份管理(IdM)中管理 DNS 记录。作为 IdM 管理员,您可以在 IdM 中添加、修改和删除 DNS 记录。
32.1. IdM 中的 DNS 记录
RHEL 身份管理(IdM)支持许多不同的 DNS 记录类型。以下 4 个是最常用的:
- A
这是主机名和 IPv4 地址的基本映射。A 记录的记录名称是主机名,如
www
。A 记录的IP Address
值是一个 IPv4 地址,如192.0.2.1
。有关 A 记录的更多信息,请参阅 RFC 1035。
- AAAA
这是主机名和 IPv6 地址的基本映射。AAAA 记录的记录名称是主机名,如
www
。IP Address
值是一个 IPv6 地址,如2001:DB8::1111
。有关 AAAA 记录的更多信息,请参阅 RFC 3596。
- SRV
服务(SRV)资源记录将服务名称映射到 提供该特定服务的服务器的 DNS 名称。例如,此记录类型可将 LDAP 目录等服务映射到管理此目录的服务器。
SRV 记录的记录名称格式为
_service. _protocol
,如_ldap._tcp
。SRV 记录的配置选项包括目标服务的优先级、权重、端口号和主机名。有关 SRV 记录的详情请参考 RFC 2782。
- PTR
指针记录(PTR)添加反向 DNS 记录,它将 IP 地址映射到域名。
注意IPv4 地址的所有反向 DNS 查找都使用在
in-addr.arpa.
域中定义的反向条目。反向地址(人类可读形式)与常规 IP 地址正好相反,其中in-addr.arpa.
域附加到该地址。例如,对于网络地址192.0.2.0/24
,反向区域为2.0.192.in-addr.arpa
。PTR 的记录名称必须采用 RFC 1035 中指定的标准格式,以 RFC 23 17 和 RFC 3596 扩展。主机名值必须是您要为其创建记录的主机的规范主机名。
注意也可以为 IPv6 地址配置反向区域,以及
.ip6.arpa.
域中的区域。有关 IPv6 反向区的更多信息,请参阅 RFC 3596。
添加 DNS 资源记录时,请注意很多记录需要不同的数据。例如,CNAME 记录需要主机名,而 A 记录则需要 IP 地址。在 IdM Web UI 中,用于添加新记录的表单中的字段会自动更新,以反映当前所选记录类型所需的数据。
32.2. Common ipa dnsrecord-* 选项
您可以在 RHEL Identity Management (IdM)中添加、修改和删除最常见的 DNS 资源记录类型时,可以使用以下选项:
- A (IPv4)
- AAAA (IPv6)
- SRV
- PTR
在 Bash
中,您可以通过列出大括号内的逗号分隔列表中的值来定义多个条目,如 --option={val1,val2,val3}
。
选项 | 描述 |
---|---|
| 为记录设置生存时间。 |
| 解析原始 DNS 记录,并以结构化格式返回它们。 |
选项 | 描述 | 示例 |
---|---|---|
| 传递单个 A 记录或 A 记录列表. |
|
可以使用给定 IP 地址创建通配符 A 记录. |
| |
|
提供 记录的 IP 地址。在创建记录时,指定 |
|
[a]
这个示例创建了一个通配符 A 记录,其 IP 地址为 192.0.2.123。
|
选项 | 描述 | 示例 |
---|---|---|
| 传递单个 AAAA(IPv6)记录或 AAAA 记录列表。 |
|
|
提供 记录的 IPv6 地址。在创建记录时,指定 |
|
选项 | 描述 | 示例 |
---|---|---|
|
传递单个 PTR 记录或 PTR 记录列表。添加反向 DNS 记录时,与添加其他 DNS 记录的用法不同,与 |
|
| ||
| 提供记录的主机名。 |
选项 | 描述 | 示例 |
---|---|---|
|
传递单个 SRV 记录或 SRV 记录列表。在右侧的示例中,_ ldap._tcp 定义 SRV 记录的服务类型和连接协议。 |
|
| ||
| 设置记录的优先级。某一服务类型可以有多个 SRV 记录。优先级(0 - 65535)设置记录的排名;数值越低,优先级越高。服务必须首先使用优先级最高的记录。 |
|
| 设置记录的权重。这有助于确定优先级相同的 SRV 记录的顺序。集合权重应加到 100,代表使用特定记录的可能性(百分比)。 |
|
| 指定目标主机上 服务的端口。 |
|
| 指定目标主机的域名。如果域中的服务不可用,这可以是单个句点(.)。 |
32.3. 确保使用 Ansible 在 IdM 中存在 A 和 AAAA DNS 记录
按照以下流程,使用 Ansible playbook 确保特定 IdM 主机的 A 和 AAAA 记录存在。在下面的示例中,IdM 管理员确保 idm.example.com DNS 区域中存在 host1 的 A 和 AAAA 记录。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - idm.example.com 区域存在,并由 IdM DNS 管理。有关在 IdM DNS 中添加主 DNS 区域的更多信息,请参阅使用 Ansible playbook 管理 IdM DNS 区域。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
Copy to Clipboard Copied! 生成 ensure-A- and-AAAA-records-are-present.yml Ansible playbook 文件的副本。例如:
cp ensure-A-and-AAAA-records-are-present.yml ensure-A-and-AAAA-records-are-present-copy.yml
$ cp ensure-A-and-AAAA-records-are-present.yml ensure-A-and-AAAA-records-are-present-copy.yml
Copy to Clipboard Copied! - 打开 ensure-A-and-AAAA-records-are-present-copy.yml 文件以进行编辑。
通过在
freeipa.ansible_freeipa.ipadnsrecord
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
zone_name
变量设置为 idm.example.com。 -
在
records
变量中,将name
变量设置为 host1,并将a_ip_address
变量设置为 192.168.122.123。 在
records
变量中,将name
变量设置为 host1,并将aaaa_ip_address
变量设置为 ::1。这是当前示例修改的 Ansible playbook 文件:
--- - name: Ensure A and AAAA records are present hosts: ipaserver become: true gather_facts: false tasks: # Ensure A and AAAA records are present - name: Ensure that 'host1' has A and AAAA records. freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" zone_name: idm.example.com records: - name: host1 a_ip_address: 192.168.122.123 - name: host1 aaaa_ip_address: ::1
--- - name: Ensure A and AAAA records are present hosts: ipaserver become: true gather_facts: false tasks: # Ensure A and AAAA records are present - name: Ensure that 'host1' has A and AAAA records. freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" zone_name: idm.example.com records: - name: host1 a_ip_address: 192.168.122.123 - name: host1 aaaa_ip_address: ::1
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-A-and-AAAA-records-are-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-A-and-AAAA-records-are-present-copy.yml
Copy to Clipboard Copied!
32.4. 确保使用 Ansible 在 IdM 中存在 A 和 PTR DNS 记录
按照以下流程,使用 Ansible playbook 确保特定 IdM 主机的 A 记录存在,且有相应的 PTR 记录。在以下流程中使用的示例中,IdM 管理员确保在 idm.example.com 区域中存在 IP 地址为 192.168.122.45 的 host1 的 A 和 PTR 记录。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - idm.example.com DNS 区域存在,并由 IdM DNS 管理。有关在 IdM DNS 中添加主 DNS 区域的更多信息,请参阅使用 Ansible playbook 管理 IdM DNS 区域。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
Copy to Clipboard Copied! 生成 ensure-dnsrecord-with-reverse-is-present.yml Ansible playbook 文件的副本。例如:
cp ensure-dnsrecord-with-reverse-is-present.yml ensure-dnsrecord-with-reverse-is-present-copy.yml
$ cp ensure-dnsrecord-with-reverse-is-present.yml ensure-dnsrecord-with-reverse-is-present-copy.yml
Copy to Clipboard Copied! - 打开 ensure-dnsrecord-with-reverse-is-present-copy.yml 文件以进行编辑。
通过在
freeipa.ansible_freeipa.ipadnsrecord
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为 host1。 -
将
zone_name
变量设置为 idm.example.com。 -
将
ip_address
变量设置为 192.168.122.45。 将
create_reverse
变量设置为 true。这是当前示例修改的 Ansible playbook 文件:
--- - name: Ensure DNS Record is present. hosts: ipaserver become: true gather_facts: false tasks: # Ensure that dns record is present - freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" name: host1 zone_name: idm.example.com ip_address: 192.168.122.45 create_reverse: true state: present
--- - name: Ensure DNS Record is present. hosts: ipaserver become: true gather_facts: false tasks: # Ensure that dns record is present - freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" name: host1 zone_name: idm.example.com ip_address: 192.168.122.45 create_reverse: true state: present
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-dnsrecord-with-reverse-is-present-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-dnsrecord-with-reverse-is-present-copy.yml
Copy to Clipboard Copied!
32.5. 确保使用 Ansible 在 IdM 中存在多个 DNS 记录
按照以下流程,使用 Ansible playbook 确保多个值与特定 IdM DNS 记录相关联。在以下流程中使用的示例中,IdM 管理员确保 idm.example.com DNS 区域中存在 host1 的多个 A 记录。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - idm.example.com 区域存在,并由 IdM DNS 管理。有关在 IdM DNS 中添加主 DNS 区域的更多信息,请参阅使用 Ansible playbook 管理 IdM DNS 区域。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
Copy to Clipboard Copied! 生成 ensure-presence-multiple-records.yml Ansible playbook 文件的副本。例如:
cp ensure-presence-multiple-records.yml ensure-presence-multiple-records-copy.yml
$ cp ensure-presence-multiple-records.yml ensure-presence-multiple-records-copy.yml
Copy to Clipboard Copied! - 打开 ensure-presence-multiple-records-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipadnsrecord
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
在
records
部分中,将name
变量设置为 host1。 -
在
records
部分中,将zone_name
变量设置为 idm.example.com。 -
在
records
部分中,将a_rec
变量设置为 192.168.122.112,并将 192.168.122.1 22 设为 192.168.122.122。 在
records
部分中定义第二个记录:-
将
name
变量设置为 host1。 -
将
zone_name
变量设置为 idm.example.com。 -
将
aaaa_rec
变量设置为 ::1。
这是当前示例修改的 Ansible playbook 文件:
-
将
--- - name: Test multiple DNS Records are present. hosts: ipaserver become: true gather_facts: false tasks: # Ensure that multiple dns records are present - freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" records: - name: host1 zone_name: idm.example.com a_rec: 192.168.122.112 a_rec: 192.168.122.122 - name: host1 zone_name: idm.example.com aaaa_rec: ::1
--- - name: Test multiple DNS Records are present. hosts: ipaserver become: true gather_facts: false tasks: # Ensure that multiple dns records are present - freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" records: - name: host1 zone_name: idm.example.com a_rec: 192.168.122.112 a_rec: 192.168.122.122 - name: host1 zone_name: idm.example.com aaaa_rec: ::1
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-presence-multiple-records-copy.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-presence-multiple-records-copy.yml
Copy to Clipboard Copied!
32.6. 确保使用 Ansible 在 IdM 中存在多个 CNAME 记录
Canonical Name 记录(CNAME 记录)是在域名系统(DNS)中一种资源记录类型,用于将一个域名、别名映射到另一个名称,即规范名称。
从单个 IP 地址运行多个服务时,您可能会发现 CNAME 记录很有用:例如,FTP 服务和 Web 服务,每个服务在不同端口上运行。
按照以下流程,使用 Ansible playbook 确保多个 CNAME 记录在 IdM DNS 中存在。在以下步骤中使用的示例中,host03 同时是 HTTP 服务器和 FTP 服务器。IdM 管理员确保在 idm.example.com 区域中存在 host03 A 记录的 www 和 ftp CNAME 记录。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - idm.example.com 区域存在,并由 IdM DNS 管理。有关在 IdM DNS 中添加主 DNS 区域的更多信息,请参阅使用 Ansible playbook 管理 IdM DNS 区域。
- host03 A 记录存在于 idm.example.com 区域中。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
Copy to Clipboard Copied! 生成 ensure-CNAME-record-is-present.yml Ansible playbook 文件的副本。例如:
cp ensure-CNAME-record-is-present.yml ensure-CNAME-record-is-present-copy.yml
$ cp ensure-CNAME-record-is-present.yml ensure-CNAME-record-is-present-copy.yml
Copy to Clipboard Copied! - 打开 ensure-CNAME-record-is-present-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipadnsrecord
任务部分设置以下变量来调整文件:-
可选:调整 play 的
名称
提供的描述。 -
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
zone_name
变量设置为 idm.example.com。 在 Record
变量
部分中,设置以下变量和值:-
将
name
变量设置为 www。 -
将
cname_hostname
变量设置为 host03。 -
将
name
变量设置为 ftp。 -
将
cname_hostname
变量设置为 host03。
这是当前示例修改的 Ansible playbook 文件:
-
将
--- - name: Ensure that 'www.idm.example.com' and 'ftp.idm.example.com' CNAME records point to 'host03.idm.example.com'. hosts: ipaserver become: true gather_facts: false tasks: - freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" zone_name: idm.example.com records: - name: www cname_hostname: host03 - name: ftp cname_hostname: host03
--- - name: Ensure that 'www.idm.example.com' and 'ftp.idm.example.com' CNAME records point to 'host03.idm.example.com'. hosts: ipaserver become: true gather_facts: false tasks: - freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" zone_name: idm.example.com records: - name: www cname_hostname: host03 - name: ftp cname_hostname: host03
Copy to Clipboard Copied! -
可选:调整 play 的
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-CNAME-record-is-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-CNAME-record-is-present.yml
Copy to Clipboard Copied!
32.7. 使用 Ansible 在 IdM 中存在 SRV 记录
DNS 服务 (SRV) 记录定义域中可用服务的主机名、端口号、传输协议、优先级和权重。在 RHEL Identity Management (IdM)中,您可以使用 SRV 记录来定位 IdM 服务器和副本。
按照以下流程,使用 Ansible playbook 确保 SRV 记录在 IdM DNS 中存在。在以下示例中,IdM 管理员可确保存在 _kerberos._udp.idm.example.com SRV 记录,其值为 10 50 88 idm.example.com。这会设置以下值:
- 它将服务的优先级设置为 10。
- 它将服务的权重设置为 50。
- 它将服务要使用的端口设置为 88。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - idm.example.com 区域存在,并由 IdM DNS 管理。有关在 IdM DNS 中添加主 DNS 区域的更多信息,请参阅使用 Ansible playbook 管理 IdM DNS 区域。
流程
导航到
/usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
目录:cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
$ cd /usr/share/ansible/collections/ansible_collections/freeipa/ansible_freeipa/playbooks/dnsrecord
Copy to Clipboard Copied! 生成 ensure-SRV-record-is-present.yml Ansible playbook 文件的副本。例如:
cp ensure-SRV-record-is-present.yml ensure-SRV-record-is-present-copy.yml
$ cp ensure-SRV-record-is-present.yml ensure-SRV-record-is-present-copy.yml
Copy to Clipboard Copied! - 打开 ensure-SRV-record-is-present-copy.yml 文件进行编辑。
通过在
freeipa.ansible_freeipa.ipadnsrecord
任务部分设置以下变量来调整文件:-
表示
ipaadmin_password
变量的值已在 secret.yml Ansible vault 文件中定义。 -
将
name
变量设置为 _kerberos._udp.idm.example.com。 -
将
srv_rec
变量设置为 '10 50 88 idm.example.com'。 将
zone_name
变量设置为 idm.example.com。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Test multiple DNS Records are present. hosts: ipaserver become: true gather_facts: false tasks: # Ensure a SRV record is present - freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" name: _kerberos._udp.idm.example.com srv_rec: '10 50 88 idm.example.com' zone_name: idm.example.com state: present
--- - name: Test multiple DNS Records are present. hosts: ipaserver become: true gather_facts: false tasks: # Ensure a SRV record is present - freeipa.ansible_freeipa.ipadnsrecord: ipaadmin_password: "{{ ipaadmin_password }}" name: _kerberos._udp.idm.example.com srv_rec: '10 50 88 idm.example.com' zone_name: idm.example.com state: present
Copy to Clipboard Copied! -
表示
- 保存这个文件。
运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-SRV-record-is-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-SRV-record-is-present.yml
Copy to Clipboard Copied!
第 34 章 使用 Ansible 将 IdM 与 NIS 域和 netgroups 集成
34.1. NIS 及其优点
在 UNIX 环境中,网络信息服务(NIS)是集中管理身份和身份验证的通用方法。NIS 最初被命名为 Yellow Pages (YP),集中管理身份验证和身份信息,例如:
- 用户和密码
- 主机名和 IP 地址
- POSIX 组
对于现代网络基础架构,NIS 被视为不安全,因为,例如它既不提供主机身份验证,也不会通过网络发送加密的数据。要临时解决这个问题,NIS 通常会与其他协议集成以增强安全性。
如果使用 RHEL 身份管理(IdM),您可以使用 NIS 服务器插件来连接无法完全迁移到 IdM 的客户端。IdM 将 netgroups 和其他 NIS 数据集成到 IdM 域中。另外,您可以轻松地将用户和主机身份从 NIS 域迁移到 IdM。
netgroups 可用在 NIS 组期望的任何位置。
34.2. IdM 中的 NIS
IdM 中的 NIS 对象
按照 RFC 2307,NIS 对象集成并存储在目录服务器后端。IdM 在 LDAP 目录中创建 NIS 对象,客户端通过系统安全服务守护进程(SSSD)或使用加密的 LDAP 连接的 nss_ldap
来检索它们。
IdM 管理 netgroups、帐户、组、主机和其他数据。IdM 使用 NIS 侦听器将密码、组和 netgroups 映射到 IdM 条目。
IdM 中的 NIS 插件
对于 NIS 支持,IdM 使用 slapi-nis 软件包中提供的以下插件:
- NIS 服务器插件
- NIS 服务器插件使 IdM 集成的 LDAP 服务器能够充当客户端的 NIS 服务器。在此角色中,目录服务器会根据配置动态生成和更新 NIS 映射。使用插件,IdM 作为 NIS 服务器为使用 NIS 协议的客户端提供服务。
- 模式兼容性插件
模式兼容性插件可使目录服务器后端提供存储在目录信息树(DIT)部分中条目的一个替代视图。这包括添加、删除或重命名属性值,以及可选择从树中的多个条目检索属性值。
详情请查看
/usr/share/doc/slapi-nis-version/sch-getting-started.txt
文件。
34.3. IdM 中的 NIS netgroups
NIS 实体可以存储在 netgroups 中。与 UNIX 组相比, netgroups 为以下情况提供支持:
- 嵌套组(作为其他组成员的组)。
- 对主机进行分组。
netgroup 定义一组以下信息: 主机、用户和域。这个集合被称为 triple。这三个字段可以包含:
- 值。
-
短划线(
-
),其指定 "no valid value" - 无值。空字段指定一个通配符。
(host.example.com,,nisdomain.example.com) (-,user,nisdomain.example.com)
(host.example.com,,nisdomain.example.com)
(-,user,nisdomain.example.com)
当客户端请求 NIS netgroup 时,IdM 将 LDAP 条目转换为:
- 传统的 NIS 映射,并使用 NIS 插件将其通过 NIS 协议发送到客户端。
- 与 RFC 2307 或 RFC 2307bis 兼容的 LDAP 格式。
34.4. 使用 Ansible 确保 netgroup 存在
您可以使用 Ansible playbook 确保 IdM netgroup 存在。这个示例描述了如何确保 TestNetgroup1 组存在。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
使用以下内容创建您的 Ansible playbook 文件 netgroup-present.yml :
--- - name: Playbook to manage IPA netgroup. hosts: ipaserver become: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure netgroup members are present freeipa.ansible_freeipa.ipanetgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: TestNetgroup1
--- - name: Playbook to manage IPA netgroup. hosts: ipaserver become: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure netgroup members are present freeipa.ansible_freeipa.ipanetgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: TestNetgroup1
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/netgroup-present.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/netgroup-present.yml
Copy to Clipboard Copied!
34.5. 使用 Ansible 确保成员在 netgroup 中存在
您可以使用 Ansible playbook 确保 IdM 用户、组和 netgroups 是 netgroup 的成员。这个示例描述了如何确保 TestNetgroup1 有以下成员:
- user1 和 user2 IdM 用户
- group1 IdM 组
- admins netgroup
- 是 IdM 客户端的 idmclient1 主机
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - TestNetgroup1 IdM netgroup 已存在。
- user1 和 user2 IdM 用户已存在。
- group1 IdM 组已存在。
- admins IdM netgroup 已存在。
流程
使用以下内容创建 Ansible playbook 文件 IdM-members-present-in-a-netgroup.yml :
--- - name: Playbook to manage IPA netgroup. hosts: ipaserver become: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure netgroup members are present freeipa.ansible_freeipa.ipanetgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: TestNetgroup1 user: user1,user2 group: group1 host: idmclient1 netgroup: admins action: member
--- - name: Playbook to manage IPA netgroup. hosts: ipaserver become: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure netgroup members are present freeipa.ansible_freeipa.ipanetgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: TestNetgroup1 user: user1,user2 group: group1 host: idmclient1 netgroup: admins action: member
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/IdM-members-present-in-a-netgroup.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/IdM-members-present-in-a-netgroup.yml
Copy to Clipboard Copied!
34.6. 使用 Ansible 确保一个成员在 netgroup 中不存在
您可以使用 Ansible playbook 确保 IdM 用户是 netgroup 的成员。这个示例描述了如何确保 TestNetgroup1 组在其 members. netgroup 中没有 user1 IdM 用户
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - TestNetgroup1 netgroup 已存在。
流程
使用以下内容创建 Ansible playbook 文件 IdM-member-absent-from-a-netgroup.yml :
--- - name: Playbook to manage IPA netgroup. hosts: ipaserver become: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure netgroup user, "user1", is absent freeipa.ansible_freeipa.ipanetgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: TestNetgroup1 user: "user1" action: member state: absent
--- - name: Playbook to manage IPA netgroup. hosts: ipaserver become: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure netgroup user, "user1", is absent freeipa.ansible_freeipa.ipanetgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: TestNetgroup1 user: "user1" action: member state: absent
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/IdM-member-absent-from-a-netgroup.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/IdM-member-absent-from-a-netgroup.yml
Copy to Clipboard Copied!
34.7. 使用 Ansible 确保 netgroup 不存在
您可以使用 Ansible playbook 确保 RHEL 身份管理(IdM)中不存在 netgroup。这个示例描述了如何确保 TestNetgroup1 组在 IdM 域中不存在。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
使用以下内容创建您的 Ansible playbook 文件 netgroup-absent.yml :
--- - name: Playbook to manage IPA netgroup. hosts: ipaserver become: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure netgroup my_netgroup1 is absent freeipa.ansible_freeipa.ipanetgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: my_netgroup1 state: absent
--- - name: Playbook to manage IPA netgroup. hosts: ipaserver become: no vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure netgroup my_netgroup1 is absent freeipa.ansible_freeipa.ipanetgroup: ipaadmin_password: "{{ ipaadmin_password }}" name: my_netgroup1 state: absent
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/netgroup-absent.yml
$ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory_/netgroup-absent.yml
Copy to Clipboard Copied!
第 35 章 使用 Ansible 在 IdM 中配置 HBAC 和 sudo 规则
在 RHEL 身份管理(IdM)中使用基于主机的访问控制(HBAC),您可以定义根据以下操作限制对主机或服务的访问的策略:
- 尝试登录的用户以及此用户的组
- 用户尝试访问的主机以及该主机所属的主机组
- 用于访问主机的服务
使用 sudo
,用户可以以其它具有不同特权的用户的身份运行程序,如 root
特权。在 IdM 中,您可以集中管理 sudo 规则。您可以根据用户组、主机组和命令组以及单个用户、主机和命令定义 sudo
规则。
完成这个流程以确保 IdM 用户的以下 HBAC 和 sudo
规则存在:
- jane 只能访问主机 client01.idm.example.com。
- john 只能访问主机 client02.idm.example.com。
-
包括默认的
admin
用户的admins
组的成员以及常规 alice 用户可以访问任何 IdM 主机。 admins
组的成员可以在任何 IdM 主机上运行带有以下命令的sudo
:-
/usr/sbin/reboot
-
/usr/bin/less
-
/usr/sbin/setenforce
-
下图显示了上述所需的配置:
图 35.1. IdM HBAC 和 SUDO 规则图

- 注意
-
该流程演示了使用操作组,通过
module_defaults
简化了模块的使用。您可以使用名为freeipa.ansible_freeipa.modules
的action_group
将默认值设置为应用到 playbook 中使用的集合的所有模块。在示例中,以这种方法定义 IdM 管理员密码。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - jane、john 和 alice 在 IdM 中存在。为这些帐户配置密码。
流程
使用以下内容创建您的 Ansible playbook 文件 add-hbac-and-sudo-rules-to-idm.yml :
--- - name: Playbook to manage IPA HBAC and SUDO rules hosts: ipaserver become: false gather_facts: false vars_files: - /home/<user_name>/MyPlaybooks/secret.yml module_defaults: group/freeipa.ansible_freeipa.modules: ipaadmin_password: "{{ ipaadmin_password }}" tasks: - name: HBAC Rule for Jane - can log in to client01 freeipa.ansible_freeipa.ipahbacrule: # Creates the rule name: Jane_rule hbacsvc: - sshd - login host: # Host name - client01.idm.example.com user: - jane - name: HBAC Rule for John - can log in to client02 freeipa.ansible_freeipa.ipahbacrule: # Creates the rule name: john_rule hbacsvc: - sshd - login host: # Host name - client02.idm.example.com user: - john - name: Add user member alice to group admins freeipa.ansible_freeipa.ipagroup: name: admins action: member user: - alice - name: HBAC Rule for IdM administrators freeipa.ansible_freeipa.ipahbacrule: # Rule to allow admins full access name: admin_access # Rule name servicecat: all # All services hostcat: all # All hosts group: # User group - admins - name: Add reboot command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/sbin/reboot state: present - name: Add less command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/bin/less state: present - name: Add setenforce command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/sbin/setenforce state: present - name: Create a SUDO command group freeipa.ansible_freeipa.ipasudocmdgroup: name: cmd_grp_1 description: "Group of important commands" sudocmd: - /usr/sbin/setenforce - /usr/bin/less - /usr/sbin/reboot action: sudocmdgroup state: present - name: Create a SUDO rule with a SUDO command group freeipa.ansible_freeipa.ipasudorule: name: sudo_rule_1 allow_sudocmdgroup: - cmd_grp_1 group: admins state: present - name: Disable allow_all HBAC Rule freeipa.ansible_freeipa.ipahbacrule: # Rule to allow admins full access name: allow_all # Rule name state: disabled # Disables rule to allow everyone the ability to login
--- - name: Playbook to manage IPA HBAC and SUDO rules hosts: ipaserver become: false gather_facts: false vars_files: - /home/<user_name>/MyPlaybooks/secret.yml module_defaults: group/freeipa.ansible_freeipa.modules: ipaadmin_password: "{{ ipaadmin_password }}" tasks: - name: HBAC Rule for Jane - can log in to client01 freeipa.ansible_freeipa.ipahbacrule: # Creates the rule name: Jane_rule hbacsvc: - sshd - login host: # Host name - client01.idm.example.com user: - jane - name: HBAC Rule for John - can log in to client02 freeipa.ansible_freeipa.ipahbacrule: # Creates the rule name: john_rule hbacsvc: - sshd - login host: # Host name - client02.idm.example.com user: - john - name: Add user member alice to group admins freeipa.ansible_freeipa.ipagroup: name: admins action: member user: - alice - name: HBAC Rule for IdM administrators freeipa.ansible_freeipa.ipahbacrule: # Rule to allow admins full access name: admin_access # Rule name servicecat: all # All services hostcat: all # All hosts group: # User group - admins - name: Add reboot command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/sbin/reboot state: present - name: Add less command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/bin/less state: present - name: Add setenforce command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/sbin/setenforce state: present - name: Create a SUDO command group freeipa.ansible_freeipa.ipasudocmdgroup: name: cmd_grp_1 description: "Group of important commands" sudocmd: - /usr/sbin/setenforce - /usr/bin/less - /usr/sbin/reboot action: sudocmdgroup state: present - name: Create a SUDO rule with a SUDO command group freeipa.ansible_freeipa.ipasudorule: name: sudo_rule_1 allow_sudocmdgroup: - cmd_grp_1 group: admins state: present - name: Disable allow_all HBAC Rule freeipa.ansible_freeipa.ipahbacrule: # Rule to allow admins full access name: allow_all # Rule name state: disabled # Disables rule to allow everyone the ability to login
Copy to Clipboard Copied! 运行 playbook:
ansible-playbook --vault-password-file=password_file -i inventory add-hbac-and-sudo-rules-to-idm.yml
$ ansible-playbook --vault-password-file=password_file -i inventory add-hbac-and-sudo-rules-to-idm.yml
Copy to Clipboard Copied!
验证
以 jane 用户身份连接到 client01:
ssh jane@client01
~]$ ssh jane@client01 Password: Last login: Fri Aug 11 15:32:18 2023 from 192.168.122.1 [jane@client01 ~]$
Copy to Clipboard Copied! 输出证明 jane 已登录到 client01。
尝试以 jane 用户身份连接到 client02 :
ssh jane@client02
~]$ ssh jane@client02 Password: Connection closed by 192.168.122.47 port 22
Copy to Clipboard Copied! 输出证明 jane 无法登录到 client02。
以 alice 用户身份连接到 client02 :
ssh alice@client02
~]$ ssh alice@client02 Password: Last login: Fri Aug 10 16:13:43 2023 from 192.168.122.1
Copy to Clipboard Copied! 输出证明 alice 已登录到 client02。
尝试使用
less
查看/etc/sssd/sssd.conf
文件的内容,而无需调用超级用户特权:less /etc/sssd/sssd.conf
[alice@client02 ~]$ less /etc/sssd/sssd.conf /etc/sssd/sssd.conf: Permission denied
Copy to Clipboard Copied! 尝试失败,因为该文件对除了文件的所有者(即
root
用户)之外的任何人都不可读。调用
root
特权以使用less
查看/etc/sssd/sssd.conf
文件的内容:sudo less /etc/sssd/sssd.conf
[alice@client02 ~]$ sudo less /etc/sssd/sssd.conf [sudo] password for alice: [domain/idm.example.com] id_provider = ipa ipa_server_mode = True [...]
Copy to Clipboard Copied! 输出证明 alice 可以对
/etc/sssd/sssd.conf
文件执行less
命令。
第 36 章 使用 Ansible 将 IdM 用户的身份验证委派给外部身份提供者
您可以使用 idp
ansible-freeipa
模块将用户与支持 OAuth 2 设备授权流的外部身份提供者(IdP)相关联。如果存在 IdP 引用和关联的 IdP 用户 ID,您可以使用它们为具有 user
ansible-freeipa
模块的 IdM 用户启用 IdP 身份验证。之后,这些用户会在外部 IdP 执行身份验证和授权后收到带有 Kerberos 票据的 RHEL 身份管理(IdM)单点登录功能。
36.1. 将 IdM 连接到外部 IdP 的好处
作为管理员,您可能想要允许存储在外部身份源(如云服务供应商)中的用户访问连接到 Identity Management (IdM) 环境的 RHEL 系统。要达到此目的,您可以将这些用户的 Kerberos 票据的身份验证和授权过程委托给该外部实体。
您可以使用此功能扩展 IdM 的功能,并允许存储在外部身份提供者(IdP) 中的用户访问由 IdM 管理的 Linux 系统。
36.2. IdM 如何通过外部 IdP 融合登录
SSSD 2.7.0 包含 sssd-idp
软件包,该软件包可实施 idp
Kerberos pre-authentication 方法。这个验证方法遵循 OAuth 2.0 设备授权流,将授权决策委托给外部 IdP:
-
IdM 客户端用户启动 OAuth 2.0 设备授权流,例如,通过在命令行中使用
kinit
实用程序检索 Kerberos TGT。 - 一个特殊的代码和网站链接从授权服务器发送到 IdM KDC 后端。
- IdM 客户端显示用户的链接和代码。在本例中,IdM 客户端会在命令行上输出链接和代码。
用户在浏览器中打开网站链接,可以在另一个主机上、移动电话等:
- 用户输入特殊代码。
- 如有必要,用户登录到基于 OAuth 2.0 的 IdP。
- 系统将提示用户授权客户端访问信息。
- 用户在原始设备提示符处确认访问。在这个示例中,用户在命令行中点 Enter 键。
- IdM KDC 后端轮询 OAuth 2.0 授权服务器以访问用户信息。
支持什么:
-
启用了
键盘互动
验证方法通过 SSH 远程登录,它允许调用可插拔式身份验证模块 (PAM) 库。 -
通过
logind
服务,使用控制台本地登录。 -
使用
kinit
实用程序检索 Kerberos ticket-granting ticket (TGT)。
当前不支持什么:
- 直接登录到 IdM WebUI。要登录到 IdM WebUI,您必须首先获取一个 Kerberos ticket。
- 直接登录 Cockpit WebUI。要登录 Cockpit Web UI,您必须首先获取一个 Kerberos ticket。
36.3. 使用 Ansible 创建到外部身份提供者的引用
要将外部身份提供程序(IdP)连接到 RHEL 身份管理(IdM)环境,请在 IdM 中创建 IdP 引用。完成此流程,以使用 idp
ansible-freeipa
模块配置到 github 外部 IdP 的引用。
先决条件
您已将 IdM 作为 OAuth 应用程序注册到外部 IdP,并在设备上生成了 IdM 用户将用来向 IdM 进行身份验证的客户端 ID 和客户端 secret 。示例假定:
- my_github_account_name 是 github 用户,其帐户将被 IdM 用户用于向 IdM 进行身份验证。
-
客户端 ID
为 2efe1acffe9e8ab869f4。 -
客户端 secret
为 656a5228abc5f9545c85fa626aecbf69312d398c。
- 您的 IdM 服务器使用 SSSD 2.7.0 或更高版本。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
在 Ansible 控制节点上,创建一个 configure-external-idp-reference.yml playbook:
--- - name: Configure external IdP hosts: ipaserver become: false gather_facts: false tasks: - name: Ensure a reference to github external provider is available freeipa.ansible_freeipa.ipaidp: ipaadmin_password: "{{ ipaadmin_password }}" name: github_idp provider: github client_ID: 2efe1acffe9e8ab869f4 secret: 656a5228abc5f9545c85fa626aecbf69312d398c idp_user_id: my_github_account_name
--- - name: Configure external IdP hosts: ipaserver become: false gather_facts: false tasks: - name: Ensure a reference to github external provider is available freeipa.ansible_freeipa.ipaidp: ipaadmin_password: "{{ ipaadmin_password }}" name: github_idp provider: github client_ID: 2efe1acffe9e8ab869f4 secret: 656a5228abc5f9545c85fa626aecbf69312d398c idp_user_id: my_github_account_name
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory configure-external-idp-reference.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory configure-external-idp-reference.yml
Copy to Clipboard Copied!
验证
在 IdM 客户端上,验证
ipa idp-show
命令的输出是否显示您创建的 IdP 引用。ipa idp-show github_idp
[idmuser@idmclient ~]$ ipa idp-show github_idp
Copy to Clipboard Copied!
36.4. 使用 Ansible ,以使 IdM 用户能够通过外部 IdP 进行身份验证
您可以使用 用户
ansible-freeipa
模块启用 RHEL 身份管理(IdM)用户通过外部身份提供程序(IdP)进行身份验证。为此,将之前创建的外部 IdP 引用与 IdM 用户帐户相关联。完成此流程,以使用 Ansible 将名为 github_idp 的外部 IdP 参考与名为 idm-user-with-external-idp 的 IdM 用户相关联。因此,用户可以使用 my_github_account_name github 身份作为 idm-user-with-external-idp 进行身份验证。
先决条件
- 您的 IdM 客户端和服务器使用 SSSD 2.7.0 或更高版本。
- 您已在 IdM 中创建了到外部 IdP 的引用。请参阅使用 Ansible 创建对外部身份提供程序的引用。
您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
在 Ansible 控制节点上,创建一个 enable-user-to-authenticate-via-external-idp.yml playbook:
--- - name: Ensure an IdM user uses an external IdP to authenticate to IdM hosts: ipaserver become: false gather_facts: false tasks: - name: Retrieve Github user ID ansible.builtin.uri: url: "https://api.github.com/users/my_github_account_name” method: GET headers: Accept: "application/vnd.github.v3+json” register: user_data - name: Ensure IdM user exists with an external IdP authentication freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" name: idm-user-with-external-idp first: Example last: User userauthtype: idp idp: github_idp idp_user_id: my_github_account_name
--- - name: Ensure an IdM user uses an external IdP to authenticate to IdM hosts: ipaserver become: false gather_facts: false tasks: - name: Retrieve Github user ID ansible.builtin.uri: url: "https://api.github.com/users/my_github_account_name” method: GET headers: Accept: "application/vnd.github.v3+json” register: user_data - name: Ensure IdM user exists with an external IdP authentication freeipa.ansible_freeipa.ipauser: ipaadmin_password: "{{ ipaadmin_password }}" name: idm-user-with-external-idp first: Example last: User userauthtype: idp idp: github_idp idp_user_id: my_github_account_name
Copy to Clipboard Copied! - 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory enable-user-to-authenticate-via-external-idp.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory enable-user-to-authenticate-via-external-idp.yml
Copy to Clipboard Copied!
验证
登录到 IdM 客户端,并验证 idm-user-with-external-idp 用户的
ipa user-show
命令的输出是否显示到 IdP 的引用:ipa user-show idm-user-with-external-idp
$ ipa user-show idm-user-with-external-idp User login: idm-user-with-external-idp First name: Example Last name: User Home directory: /home/idm-user-with-external-idp Login shell: /bin/sh Principal name: idm-user-with-external-idp@idm.example.com Principal alias: idm-user-with-external-idp@idm.example.com Email address: idm-user-with-external-idp@idm.example.com ID: 35000003 GID: 35000003 User authentication types: idp External IdP configuration: github External IdP user identifier: idm-user-with-external-idp@idm.example.com Account disabled: False Password: False Member of groups: ipausers Kerberos keys available: False
Copy to Clipboard Copied!
36.5. 以外部 IdP 用户身份检索 IdM 票据授予票据
如果您已将 RHEL 身份管理(IdM)用户的身份验证委派给外部身份提供程序(IdP),IdM 用户可以通过向外部 IdP 进行身份验证来请求 Kerberos 票据授予票据(TGT)。
完成此流程,来:
- 在本地检索和存储匿名 Kerberos 票据。
-
使用
kinit
和-T
选项为 idm-user-with-external-idp 用户请求 TGT,以通过 Secure Tunneling (FAST)渠道启用灵活的身份验证,来在 Kerberos 客户端和 Kerberos 分发中心(KDC)之间提供安全连接。
先决条件
- 您已在 IdM 中创建了到外部 IdP 的引用。请参阅使用 Ansible 创建对外部身份提供程序的引用。
- 您已与用户帐户关联了一个外部 IdP 参考。请参阅使用 Ansible 启用 IdM 用户通过外部 IdP 进行身份验证。
- 您最初以其身份登录的用户对本地文件系统上的目录有写权限。
流程
使用 Anonymous PKINIT 获取 Kerberos 票据,并将其存储在名为
./fast.ccache
的文件中。kinit -n -c ./fast.ccache
$ kinit -n -c ./fast.ccache
Copy to Clipboard Copied! 可选:查看检索到的票据:
klist -c fast.ccache
$ klist -c fast.ccache Ticket cache: FILE:fast.ccache Default principal: WELLKNOWN/ANONYMOUS@WELLKNOWN:ANONYMOUS Valid starting Expires Service principal 03/03/2024 13:36:37 03/04/2024 13:14:28 krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM
Copy to Clipboard Copied! 以 IdM 用户身份开始身份验证,使用
-T
选项启用 FAST 通信渠道。kinit -T ./fast.ccache idm-user-with-external-idp
[root@client ~]# kinit -T ./fast.ccache idm-user-with-external-idp Authenticate at https://oauth2.idp.com:8443/auth/realms/master/device?user_code=YHMQ-XKTL and press ENTER.:
Copy to Clipboard Copied! - 在浏览器中,以命令输出中提供的网站的用户身份进行身份验证。
- 在命令行中,按 Enter 键来完成身份验证过程。
验证
显示您的 Kerberos ticket 信息,并确认对于带有外部 IdP 的预身份验证的行
config: pa_type
显示152
。klist -C
[root@client ~]# klist -C Ticket cache: KCM:0:58420 Default principal: idm-user-with-external-idp@IDM.EXAMPLE.COM Valid starting Expires Service principal 05/09/22 07:48:23 05/10/22 07:03:07 krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM config: fast_avail(krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM) = yes 08/17/2022 20:22:45 08/18/2022 20:22:43 krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM config: pa_type(krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM) = 152
Copy to Clipboard Copied! pa_type = 152
表示外部 IdP 身份验证。
36.6. 以外部 IdP 用户身份通过 SSH 登录到 IdM 客户端
要以外部身份提供者(IdP) 用户的身份通过 SSH 登录到 IdM 客户端,请在命令行上开始登录过程。出现提示时,在与 IdP 关联的网站上执行身份验证过程,并在 Identity Management (IdM) 客户端上完成该过程。
先决条件
- 您已在 IdM 中创建了到外部 IdP 的引用。请参阅使用 Ansible 创建对外部身份提供程序的引用。
- 您已与用户帐户关联了一个外部 IdP 参考。请参阅使用 Ansible 启用 IdM 用户通过外部 IdP 进行身份验证。
流程
尝试通过 SSH 登录到 IdM 客户端。
ssh idm-user-with-external-idp@client.idm.example.com
[user@client ~]$ ssh idm-user-with-external-idp@client.idm.example.com (idm-user-with-external-idp@client.idm.example.com) Authenticate at https://oauth2.idp.com:8443/auth/realms/main/device?user_code=XYFL-ROYR and press ENTER.
Copy to Clipboard Copied! - 在浏览器中,以命令输出中提供的网站的用户身份进行身份验证。
- 在命令行中,按 Enter 键来完成身份验证过程。
验证
显示您的 Kerberos ticket 信息,并确认对于带有外部 IdP 的预身份验证的行
config: pa_type
显示152
。klist -C
[idm-user-with-external-idp@client ~]$ klist -C Ticket cache: KCM:0:58420 Default principal: idm-user-with-external-idp@IDM.EXAMPLE.COM Valid starting Expires Service principal 05/09/22 07:48:23 05/10/22 07:03:07 krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM config: fast_avail(krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM) = yes 08/17/2022 20:22:45 08/18/2022 20:22:43 krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM config: pa_type(krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM) = 152
Copy to Clipboard Copied!
36.7. ipaidp Ansible 模块中的 provider 选项
以下身份提供者 (IdP) 支持 OAuth 2.0 设备授权流:
- Microsoft Identity Platform,包括 Azure AD
- GitHub
- Keycloak,包括 Red Hat Single Sign-On (SSO)
- Okta
当使用 idp
ansible-freeipa
模块创建到这些外部 IdP 中的一个的引用时,您可以在 ipaidp
ansible-freeipa
playbook 任务中使用 provider
选项指定 IdP 类型,它扩展到其它选项,如下所述:
provider: microsoft
Microsoft Azure IdP 允许基于 Azure 租户 ID 的半虚拟化,您可以使用
organization
选项指定。如果您需要支持 live.com IdP ,请指定选项organization common
。选择
provider: microsoft
扩展,以使用以下选项。organization
选项的值替换表中的字符串${ipaidporg}
。选项 value auth_uri: URI
https://login.microsoftonline.com/${ipaidporg}/oauth2/v2.0/authorize
dev_auth_uri: URI
https://login.microsoftonline.com/${ipaidporg}/oauth2/v2.0/devicecode
token_uri: URI
https://login.microsoftonline.com/${ipaidporg}/oauth2/v2.0/token
userinfo_uri: URI
https://graph.microsoft.com/oidc/userinfo
keys_uri: URI
https://login.microsoftonline.com/common/discovery/v2.0/keys
scope: STR
openid email
idp_user_id: STR
email
provider: google
选择
provider: google
扩展,以使用以下选项:选项 value auth_uri: URI
https://accounts.google.com/o/oauth2/auth
dev_auth_uri: URI
https://oauth2.googleapis.com/device/code
token_uri: URI
https://oauth2.googleapis.com/token
userinfo_uri: URI
https://openidconnect.googleapis.com/v1/userinfo
keys_uri: URI
https://www.googleapis.com/oauth2/v3/certs
scope: STR
openid email
idp_user_id: STR
email
provider: github
选择
provider: github
扩展,以使用以下选项:选项 value auth_uri: URI
https://github.com/login/oauth/authorize
dev_auth_uri: URI
https://github.com/login/device/code
token_uri: URI
https://github.com/login/oauth/access_token
userinfo_uri: URI
https://openidconnect.googleapis.com/v1/userinfo
keys_uri: URI
https://api.github.com/user
scope: STR
user
idp_user_id: STR
login
provider: keycloak
使用 Keycloak 时,您可以定义多个域或机构。由于它通常是自定义部署的一部分,因此基本 URL 和域 ID 是必需的,您可以在
ipaidp
playbook 任务中使用base_url
和organization
选项指定它们:--- - name: Playbook to manage IPA idp hosts: ipaserver become: false tasks: - name: Ensure keycloak idp my-keycloak-idp is present using provider freeipa.ansible_freeipa.ipaidp: ipaadmin_password: "{{ ipaadmin_password }}" name: my-keycloak-idp provider: keycloak organization: main base_url: keycloak.domain.com:8443/auth client_id: my-keycloak-client-id
--- - name: Playbook to manage IPA idp hosts: ipaserver become: false tasks: - name: Ensure keycloak idp my-keycloak-idp is present using provider freeipa.ansible_freeipa.ipaidp: ipaadmin_password: "{{ ipaadmin_password }}" name: my-keycloak-idp provider: keycloak organization: main base_url: keycloak.domain.com:8443/auth client_id: my-keycloak-client-id
Copy to Clipboard Copied! 选择
provider: keycloak
扩展,以使用以下选项。您在base_url
选项中指定的值替换表中的字符串${ipaidpbaseurl}
,您为organization 选项指定的值替换字符串 '${ipaidporg}
。选项 value auth_uri: URI
https://${ipaidpbaseurl}/realms/${ipaidporg}/protocol/openid-connect/auth
dev_auth_uri: URI
https://${ipaidpbaseurl}/realms/${ipaidporg}/protocol/openid-connect/auth/device
token_uri: URI
https://${ipaidpbaseurl}/realms/${ipaidporg}/protocol/openid-connect/token
userinfo_uri: URI
https://${ipaidpbaseurl}/realms/${ipaidporg}/protocol/openid-connect/userinfo
scope: STR
openid email
idp_user_id: STR
email
provider: okta
在注册一个 Okta 中的新机构后,会关联一个新的基本 URL。您可以在
ipaidp
playbook 任务中使用base_url
选项指定这个基本 URL:--- - name: Playbook to manage IPA idp hosts: ipaserver become: false tasks: - name: Ensure okta idp my-okta-idp is present using provider freeipa.ansible_freeipa.ipaidp: ipaadmin_password: "{{ ipaadmin_password }}" name: my-okta-idp provider: okta base_url: dev-12345.okta.com client_id: my-okta-client-id
--- - name: Playbook to manage IPA idp hosts: ipaserver become: false tasks: - name: Ensure okta idp my-okta-idp is present using provider freeipa.ansible_freeipa.ipaidp: ipaadmin_password: "{{ ipaadmin_password }}" name: my-okta-idp provider: okta base_url: dev-12345.okta.com client_id: my-okta-client-id
Copy to Clipboard Copied! 选择
provider: okta
扩展,以使用以下选项。您为base_url
选项指定的值替换表中的字符串${ipaidpbaseurl}
。选项 value auth_uri: URI
https://${ipaidpbaseurl}/oauth2/v1/authorize
dev_auth_uri: URI
https://${ipaidpbaseurl}/oauth2/v1/device/authorize
token_uri: URI
https://${ipaidpbaseurl}/oauth2/v1/token
userinfo_uri: URI
https://${ipaidpbaseurl}/oauth2/v1/userinfo
scope: STR
openid email
idp_user_id: STR
email
第 37 章 在 IdM 中使用受限委托
受限委托使一个服务可以代表您访问其他服务。您只授予一个服务的权限,而不是为所有凭证提供完全访问权限。
37.1. 身份管理中的受限委托
用户到代理 (S4U2proxy
) 扩展的服务为代表用户的另一服务获取服务票据。此功能称为受限委托。第二个服务通常是在用户的授权上下文下代表第一个服务执行某些工作的代理。使用受限委托删除了用户委托其完整的票据授予票据 (TGT)的需要。
RHEL 身份管理(IdM)通常使用 Kerberos S4U2proxy
功能来允许 Web 服务器框架代表用户获取 LDAP 服务票据。IdM-AD 信任系统也使用受限委托来获取 cifs
主体。
您可以使用 S4U2proxy
功能配置 Web 控制台客户端,以允许使用智能卡进行身份验证的 IdM 用户来实现以下内容:
- 在运行 web 控制台服务的 RHEL 主机上以超级用户权限运行命令,而无需再次进行身份验证。
-
使用
SSH
访问远程主机并访问主机上的服务,而无需再次进行身份验证。
37.2. 使用 Ansible 为 web 控制台中的 SSH 登录配置智能卡验证
在 RHEL web 控制台中登录到用户帐户后,您可以使用 SSH 协议连接到远程机器。您可以使用 servicedelegationrule
和 servicedelegationtarget
Ansible 模块为受限委托功能配置 Web 控制台,这将启用 SSH 连接,而无需再次进行身份验证。
在示例流程中,web 控制台会话在 myhost.idm.example.com
主机上运行,并将它配置为代表经过身份验证的用户使用 SSH 访问 remote.idm.example.com
主机。
先决条件
-
您已在
myhost.idm.example.com
上获得了 IdMadmin
ticket-granting ticket (TGT)。 -
您有访问
remote.idm.example.com
的root
权限。 - 运行 Web 控制台的主机是 IdM 域的成员。
您已配置了 Ansible 控制节点以满足以下要求:
-
您已安装
ansible-freeipa
软件包。 -
示例假设您在
~/MyPlaybooks/
目录中创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。 -
示例假定
secret.yml
Ansible vault 存储了ipaadmin_password
。
-
您已安装
-
目标节点(即
ansible-freeipa
模块运行的节点)是 IdM 域的一部分,作为 IdM 客户端、服务器或副本。
流程
进入您的
~/MyPlaybooks/
目录:cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create secret.yml
$ ansible-vault create secret.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:ipaadmin_password: <admin_password>
ipaadmin_password: <admin_password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
在 Terminal 页面中,验证 web 控制台是否在用户会话中为 User to Proxy (S4U2proxy) Kerberos ticket 创建一个服务:
klist
$ klist … Valid starting Expires Service principal 05/20/25 09:19:06 05/21/25 09:19:06 HTTP/myhost.idm.example.com@IDM.EXAMPLE.COM …
Copy to Clipboard Copied! 创建包含以下内容的
web-console-smart-card-ssh.yml
playbook:创建确保存在委派目标的任务:
--- - name: Playbook to create a constrained delegation target hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure servicedelegationtarget web-console-delegation-target is present ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-target
--- - name: Playbook to create a constrained delegation target hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure servicedelegationtarget web-console-delegation-target is present ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-target
Copy to Clipboard Copied! 添加将目标主机添加到委派目标的任务:
- name: Ensure servicedelegationtarget web-console-delegation-target member principal host/remote.idm.example.com@IDM.EXAMPLE.COM is present ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-target principal: host/remote.idm.example.com@IDM.EXAMPLE.COM action: member
- name: Ensure servicedelegationtarget web-console-delegation-target member principal host/remote.idm.example.com@IDM.EXAMPLE.COM is present ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-target principal: host/remote.idm.example.com@IDM.EXAMPLE.COM action: member
Copy to Clipboard Copied! 添加一个任务来确保存在委派规则:
- name: Ensure servicedelegationrule delegation-rule is present ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-rule
- name: Ensure servicedelegationrule delegation-rule is present ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-rule
Copy to Clipboard Copied! 添加一项任务,该任务确保 Web 控制台客户端服务的 Kerberos 主体是受限委派规则的成员:
- name: Ensure the Kerberos principal of the web console client service is added to the servicedelegationrule web-console-delegation-rule ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-rule principal: HTTP/myhost.idm.example.com action: member
- name: Ensure the Kerberos principal of the web console client service is added to the servicedelegationrule web-console-delegation-rule ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-rule principal: HTTP/myhost.idm.example.com action: member
Copy to Clipboard Copied! 添加一个任务,以确保 delegation 规则与 web-console-delegation-target 委派目标关联:
- name: Ensure a constrained delegation rule is associated with a specific delegation target ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-rule target: web-console-delegation-target action: member
- name: Ensure a constrained delegation rule is associated with a specific delegation target ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: web-console-delegation-rule target: web-console-delegation-target action: member
Copy to Clipboard Copied! 添加一个任务,该任务在
remote.idm.example.com
上启用 Kerberos 身份验证:- name: Enable Kerberos authentication hosts: remote.idm.example.com vars: sshd_config: GSSAPIAuthentication: true roles: - role: rhel-system-roles.sshd
- name: Enable Kerberos authentication hosts: remote.idm.example.com vars: sshd_config: GSSAPIAuthentication: true roles: - role: rhel-system-roles.sshd
Copy to Clipboard Copied!
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护
secret.yml
文件和清单文件的密码的文件:ansible-playbook --vault-password-file=password_file -v -i inventory web-console-smart-card-ssh.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory web-console-smart-card-ssh.yml
Copy to Clipboard Copied!
37.3. 使用 Ansible 配置 Web 控制台,允许用户使用智能卡进行身份验证的用户运行 sudo,而无需再次进行身份验证
登录到 RHEL web 控制台中的用户帐户后,作为 RHEL Identity Management (IdM)系统管理员,您可能需要使用超级用户权限运行命令。您可以使用 受限委托 功能在系统上运行 sudo
,而无需再次进行身份验证。
按照以下流程,使用 ipaservicedelegationrule
和 ipaservicedelegationtarget
ansible-freeipa
模块将 Web 控制台配置为使用受限的委托。在以下示例中,Web 控制台会话运行在myhost.idm.example.com主机上。
先决条件
-
您已通过使用智能卡向 web 控制台会话进行身份验证,而获得了一个 IdM
admin
票据授予票(TGT)。 - Web 控制台服务已注册到 IdM 。
- myhost.idm.example.com 主机在 IdM 中存在。
-
您已为 IdM 服务器 上的域管理员启用了
admin
sudo
访问权限。 Web 控制台在用户会话中创建了一个
S4U2Proxy
Kerberos ticket。要验证是否是这种情况,请以 IdM 用户身份登录 Web 控制台,打开Terminal
页面,并输入:klist
$ klist Ticket cache: FILE:/run/user/1894000001/cockpit-session-3692.ccache Default principal: user@IDM.EXAMPLE.COM Valid starting Expires Service principal 07/30/21 09:19:06 07/31/21 09:19:06 HTTP/myhost.idm.example.com@IDM.EXAMPLE.COM 07/30/21 09:19:06 07/31/21 09:19:06 krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM for client HTTP/myhost.idm.example.com@IDM.EXAMPLE.COM
Copy to Clipboard Copied! 您已配置了 Ansible 控制节点以满足以下要求:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa
集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password
,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa
模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。
流程
在 Ansible 控制节点上,导航到 ~/MyPlaybooks/ 目录:
cd ~/MyPlaybooks/
$ cd ~/MyPlaybooks/
Copy to Clipboard Copied! 使用以下内容创建
web-console-smart-card-sudo.yml
playbook:创建确保存在委派目标的任务:
--- - name: Playbook to create a constrained delegation target hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure servicedelegationtarget named sudo-web-console-delegation-target is present freeipa.ansible_freeipa.ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-target
--- - name: Playbook to create a constrained delegation target hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure servicedelegationtarget named sudo-web-console-delegation-target is present freeipa.ansible_freeipa.ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-target
Copy to Clipboard Copied! 添加将目标主机添加到委派目标的任务:
- name: Ensure that a member principal named host/myhost.idm.example.com@IDM.EXAMPLE.COM is present in a service delegation target named sudo-web-console-delegation-target freeipa.ansible_freeipa.ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-target principal: host/myhost.idm.example.com@IDM.EXAMPLE.COM action: member
- name: Ensure that a member principal named host/myhost.idm.example.com@IDM.EXAMPLE.COM is present in a service delegation target named sudo-web-console-delegation-target freeipa.ansible_freeipa.ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-target principal: host/myhost.idm.example.com@IDM.EXAMPLE.COM action: member
Copy to Clipboard Copied! 添加一个任务来确保存在委派规则:
- name: Ensure servicedelegationrule named sudo-web-console-delegation-rule is present freeipa.ansible_freeipa.ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule
- name: Ensure servicedelegationrule named sudo-web-console-delegation-rule is present freeipa.ansible_freeipa.ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule
Copy to Clipboard Copied! 添加一个任务,确保 Web 控制台服务的 Kerberos 主体是约束委派规则的一个成员:
- name: Ensure the Kerberos principal of the web console service is added to the service delegation rule named sudo-web-console-delegation-rule freeipa.ansible_freeipa.ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule principal: HTTP/myhost.idm.example.com action: member
- name: Ensure the Kerberos principal of the web console service is added to the service delegation rule named sudo-web-console-delegation-rule freeipa.ansible_freeipa.ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule principal: HTTP/myhost.idm.example.com action: member
Copy to Clipboard Copied! 添加一个任务,确保约束委派规则与 sudo-web-console-delegation-target 委派目标关联:
- name: Ensure a constrained delegation rule is associated with a specific delegation target freeipa.ansible_freeipa.ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule target: sudo-web-console-delegation-target action: member
- name: Ensure a constrained delegation rule is associated with a specific delegation target freeipa.ansible_freeipa.ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule target: sudo-web-console-delegation-target action: member
Copy to Clipboard Copied!
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储保护 secret.yml 文件的密码,以及清单文件:
ansible-playbook --vault-password-file=password_file -v -i inventory web-console-smart-card-sudo.yml
$ ansible-playbook --vault-password-file=password_file -v -i inventory web-console-smart-card-sudo.yml
Copy to Clipboard Copied! 启用
pam_sss_gss
,用来通过通用安全服务应用程序接口(GSSAPI)与系统安全服务守护进程(SSSD)合作来验证用户的 PAM 模块:-
打开
/etc/sssd/sssd.conf
文件进行编辑。 指定
pam_sss_gss
可以为 IdM 域中的sudo
和sudo -i
命令提供身份验证:[domain/idm.example.com] pam_gssapi_services = sudo, sudo-i
[domain/idm.example.com] pam_gssapi_services = sudo, sudo-i
Copy to Clipboard Copied! - 保存并退出文件。
-
打开
/etc/pam.d/sudo
文件进行编辑。 将以下行插入到
#%PAM-1.0
列表的顶部以允许但不要求sudo
命令的 GSSAPI 身份验证:auth sufficient pam_sss_gss.so
auth sufficient pam_sss_gss.so
Copy to Clipboard Copied! - 保存并退出文件。
-
打开
重启
SSSD
服务,以便上述更改立即生效:systemctl restart sssd
$ systemctl restart sssd
Copy to Clipboard Copied!
第 38 章 提供身份管理功能的系统角色
以下角色不包含在 ansible-freeipa
软件包中。它们是 rhel-system-roles
软件包的一部分。您可以在附加了 Red Hat Enterprise Linux Server
订阅的系统上安装 rhel-system-roles
。
certificate
系统角色,ad_integration
角色如果您的机构使用 Microsoft Active Directory (AD)集中管理用户、组和其他资源,您可以将 Red Hat Enterprise Linux (RHEL)主机加入到此 AD 。AD 用户可以登录 RHEL,您可以在 RHEL 主机上为经过身份验证的 AD 用户提供服务。通过使用
ad_integration
RHEL 系统角色,您可以将 Red Hat Enterprise Linux 系统自动集成到活动目录(AD)域中。注意ad_integration
角色用于使用没有身份管理(IdM)环境的直接 AD 集成的部署。对于 IdM 环境,请使用ansible-freeipa
角色。