LADP的role的编写和调试
一、环境准备
准备三台虚拟机:
10.0.0.22:Ansible 控制节点,也顺便做 Ubuntu 客户端
10.0.0.23:LDAP 服务端,Ubuntu 24
10.0.0.26:LDAP 客户端,Rocky 10
整个实验目的:
(1)用 Ansible 的 role 组织代码
(2)自动把 10.0.0.23 配成 LDAP 服务端
(3)自动把 10.0.0.22 和 10.0.0.26 配成 LDAP 客户端
(4)最后用 ldapsearch 测试三台机器之间的 LDAP 查询是否成功
二、软件安装
安装分类
在10.0.0.22上安装Ansible,10.0.0.23和10.0.0.26安装python3和ssh
安装过程
在10.0.0.22和10.0.0.23上执行:

10.0.0.26上执行:

在10.0.0.22上配置ssh免密

把公钥发到另外两台主机


测试效果

在10.0.0.22上创建目录

编写ansible.cfg文件
文件内容含义:
inventory = inventory/hosts.ini:默认主机清单路径
roles_path = roles:role 存放目录
host_key_checking = False:第一次 SSH 不再交互确认
stdout_callback = yaml:输出更好读

编写文件inventory/hosts.ini
这份文件的作用是:
ldap_server 组只有 10.0.0.23
ldap_clients 组有 10.0.0.22 和 10.0.0.26
控制节点自己用 local 执行
所有机器统一使用 /usr/bin/python3

测试是否可行

编写公共变量文件group_vars/all.yml

编写总入口文件site.yml
这就是 role 的入口。意思是:
第一段只对 ldap_server 组执行 ldap_server role
第二段只对 ldap_clients 组执行 ldap_client role
become: true 表示提权执行

编写服务端role
代码如下:
---
- name: Verify ldap_server role only runs on Debian family
ansible.builtin.assert:
that:
- ansible_facts['os_family'] == 'Debian'
fail_msg: "ldap_server role 当前只演示 Ubuntu 24 上的 slapd 部署。"
- name: Preseed slapd package answers
ansible.builtin.debconf:
name: slapd
question: "{{ item.question }}"
value: "{{ item.value }}"
vtype: "{{ item.vtype }}"
loop:
# 这组预置答案避免 apt 安装时进入交互式界面。
- { question: "slapd/no_configuration", value: "false", vtype: "boolean" }
- { question: "slapd/domain", value: "{{ ldap_domain }}", vtype: "string" }
- { question: "shared/organization", value: "{{ ldap_organization }}", vtype: "string" }
- { question: "slapd/password1", value: "{{ ldap_admin_password }}", vtype: "password" }
- { question: "slapd/password2", value: "{{ ldap_admin_password }}", vtype: "password" }
- { question: "slapd/backend", value: "MDB", vtype: "select" }
- { question: "slapd/purge_database", value: "true", vtype: "boolean" }
- { question: "slapd/move_old_database", value: "true", vtype: "boolean" }
- name: Install OpenLDAP server packages
ansible.builtin.apt:
name: "{{ ldap_server_packages }}"
state: present
update_cache: true
- name: Deploy LDAP client defaults on the server itself
ansible.builtin.template:
src: ldap.conf.j2
dest: /etc/ldap/ldap.conf
owner: root
group: root
mode: "0644"
notify: restart slapd
- name: Ensure slapd service is enabled and started
ansible.builtin.service:
name: slapd
state: started
enabled: true
- name: Render initial LDAP data
ansible.builtin.template:
src: base.ldif.j2
dest: /tmp/ansible-base.ldif
owner: root
group: root
mode: "0600"
- name: Check whether demo LDAP data was already imported
ansible.builtin.stat:
path: "{{ ldap_seed_marker }}"
register: ldap_seed_file
- name: Import base LDAP entries
ansible.builtin.command:
cmd: >-
ldapadd -x -D {{ ldap_bind_dn }} -w {{ ldap_admin_password }}
-f /tmp/ansible-base.ldif
when: not ldap_seed_file.stat.exists
register: ldapadd_result
changed_when: ldapadd_result.rc == 0
- name: Create marker after successful import
ansible.builtin.file:
path: "{{ ldap_seed_marker }}"
state: touch
mode: "0600"
when: not ldap_seed_file.stat.exists
- name: Verify LDAP base entry can be queried
ansible.builtin.command:
cmd: >-
ldapsearch -x -H {{ ldap_server_uri }}
-D {{ ldap_bind_dn }} -w {{ ldap_admin_password }}
-b {{ ldap_base_dn }} -s base dn
register: ldap_search_verify
changed_when: false
- name: Show ldapsearch verification output
ansible.builtin.debug:
var: ldap_search_verify.stdout_lines
关键字段解析:
限定这个 role 只在 Ubuntu 上跑,
- 如果你误把服务端 role 跑到 Rocky 上,会直接报错

用 debconf 预置 slapd 安装答案:
Ubuntu 装 slapd 时通常会弹出交互界面,debconf 提前把域名、组织名、管理员密码写进去,这样 Ansible 执行时不会卡住。

安装 LDAP 服务端软件:

用 template 生成 LDAP 配置:
template 会先把模板里的变量替换成真实值,再把结果写到目标机器。

编写模板文件roles/ldap_server/templates/ldap.conf.j2

编写roles/ldap_server/templates/base.ldif.j2文件

编写roles/ldap_server/handlers/main.yml文件;只有模板文件变了,才重启 slapd,不是每次 playbook 都重启服务。

编写客户端role文件roles/ldap_client/tasks/main.yml

语法检查

直接执行

测试服务是否起来

查看有389端口,说明服务已经起来

查看LDAP,输出ou=People,ou=Groups,uid=demo说明成功

浙公网安备 33010602011771号