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上执行:

image

 10.0.0.26上执行:

image

 

在10.0.0.22上配置ssh免密

image

 把公钥发到另外两台主机

image

 

image

 测试效果

image

 在10.0.0.22上创建目录

image

 编写ansible.cfg文件

文件内容含义:

inventory = inventory/hosts.ini:默认主机清单路径

roles_path = roles:role 存放目录

host_key_checking = False:第一次 SSH 不再交互确认

stdout_callback = yaml:输出更好读

image

 

编写文件inventory/hosts.ini

这份文件的作用是:

ldap_server 组只有 10.0.0.23

ldap_clients 组有 10.0.0.22 和 10.0.0.26

控制节点自己用 local 执行

所有机器统一使用 /usr/bin/python3

image

 测试是否可行

image

 

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

image

 

编写总入口文件site.yml

这就是 role 的入口。意思是:

第一段只对 ldap_server 组执行 ldap_server role

第二段只对 ldap_clients 组执行 ldap_client role

become: true 表示提权执行

image

 

编写服务端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 上,会直接报错

image

 

debconf 预置 slapd 安装答案:

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

image

 

安装 LDAP 服务端软件:

image

 

template 生成 LDAP 配置:

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

image

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

image

 

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

image

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

image

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

image

 语法检查

image

 

直接执行

image

 测试服务是否起来

image

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

image

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

image

 

posted on 2026-06-02 19:55  长谷部优月  阅读(8)  评论(0)    收藏  举报