
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
tar -zxf tcl8.4.11-src.tar.gz
cd tcl8.4.11/unix
./configure --prefix=/usr/tcl --enable-shared
make
make install
cp tclUnixPort.h ../generic/wget https://sourceforge.net/projects/expect/files/Expect/5.45.4/expect5.45.4.tar.gz/download --no-check-certificate -O expect5.45.4.tar.gz
tar -zxf expect5.45.4.tar.gz
cd expect5.45.4
./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic
make
make install
ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
ln -s /usr/tcl/bin/expect /usr/bin/expect
说明:由于使用Ambari自带LDAP集成插件无法做到自动化LDAP用户同步与集成,无法及时同步LDAP最新用户信息,需要依靠Except shell交互式插件是实现,且Except依赖TCL环境,也需安装TCL环境 yum list expect --showduplicates
yum install -y expect[-5.45-14.el7_1].x86_64
# 也可以先下载rpm包,然后安装
yum list expect
yum install --downloadonly --downloaddir ./ expect[-5.45-14.el7_1].x86_64
yum install -y ./*.rpm安装后,可以使用expect命令进行验证,出现except1.1的交互窗口说明安装成功
常见指令:
spawn:交互程序开始后面跟命令或者指定程序(在壳内启动这个进程)
expect:获取匹配信息匹配成功则执行expect后面的程序动作(检测由壳内进程发出的特定交互指令反馈字符串后向下执行)
send:用于向进程发送字符串(从壳外向壳内进程发送一条字符串,换行符为确认结束)
interact:允许用户交互
exp_continue:在expect中多次匹配就需要用到
send_user:用来打印输出 相当于shell中的echo
exit:退出expect脚本
eof:expect执行结束 退出
set:定义变量
puts:输出变量
set timeout:设置超时时间LDAP是轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)。简单理解可以把LDAP看作是一个树形结构的数据库,通常用于实现账号的统一管理。名词 | 含义 |
|---|---|
DN(distinguished name) | 专用名称唯一标识,相当于数据库中的主键.通常有两种组织形式:基于cn,cn+ou+dc;基于uid,uid+ou+dc. |
RDN(relative) | 相对标识名称,通过RDN和父条目连在一起构成DN |
CN(common name) | 公共名称 |
OU(organizational unit) | 组织对象,可以包括组织,具体的人等.容器条目,下面包含真正的用户条目 |
DC(domain component) | 域名,例如amabri.com 表示就是"dc=ambari,dc=com" |
uid(user id) | 用户id,用来标识用户 |
c(country) | 国家,一个两位的国家代码 |
SN(sur name) | 姓氏 |
giveName() | 名字 |
# 创建data和conf目录给ldap容器挂载
mkdir -p /data/ldap/{data,conf}
#拉取ldap容器
docker pull osixia/openldap
#启动容器
#LDAP_ORGANISATTON 工作空间名称
#LDAP_ADMIN_PASSWORD admin用户的密码
#LDAP_TLS_VERIFY_CLIENT 不开启TLS
docker run -d -p 389:389 -p 636:636 \
--name 172.22.16.30 \
--env LDAP_TLS_VERIFY_CLIENT="never" \
--env LDAP_ORGANISATTON="admin" \
--env LDAP_DOMAIN="amabri.com" \
--env LDAP_ADMIN_PASSWORD="123456" \
-v /data/ldap/data:/var/lib/ldap \
-v /data/ldap/conf:/etc/ldap/slapd.d \
--detach osixia/openldap#拉取镜像
docker pull osixia/phpldapadmin
# 运行镜像
docker run \
-d \
--privileged \
-p 808:80 \
--name phpldapadmin \
--env PHPLDAPADMIN_HTTPS=false \
--env PHPLDAPADMIN_LDAP_HOSTS=172.22.16.30 \
--detach osixia/phpldapadmin


1、运行ambari-server --ldap-setup命令进入Amabri LDAP配置界面配置LDAP信息
Using python /usr/bin/python
Setting up LDAP properties...
Primary URL* {host:port} (172.22.16.30:389): -->设置主域LDAP服务映射地址
Secondary URL {host:port} (172.22.16.30:389): -->设置次域、备用域服务映射地址
Use SSL* [true/false] (false): -->设置SSL登录验证
User object class* (user): -->代表在LDAP用户对象中对用户分类的名字
User name attribute* (cn): -->当载入用户名的时候使用的属性字段:
1>cn
2>sAMAccountName
Group object class* (groupOfNames): -->代表在LDAP用户组对象中使用的类的名称
Group name attribute* (cn): -->设置用户组名
Group member attribute* (member): -->定义用于包含LDAP中的组成员的属性名称
Distinguished name attribute* (dn): -->设置可以分辨属性
Base DN* (dc=ambari,dc=com): -->定义授权Ldap 账户的base dn条目路径
Referral method [follow/ignore] (follow): -->推荐方法设置
Bind anonymously* [true/false] (false): -->匿名绑定
Handling behavior for username collisions [convert/skip] for LDAP sync* (convert):
--设置用户名相同冲突解决方式
Manager DN* (cn=admin,dc=ambari,dc=com):
--设置管理员(授权LDAP)账户DN条目路径
Enter Manager Password* : --配置管理员(授权LDAP)账户的DN条目密码
Password cannot be blank.
Enter Manager Password* :
备注:输入密码,保存后出现successfully,即配置完成,配置完成后需要重启ambari服务
友情提示:
1、配置错误导致同步失败,有可能会导致amabri 所有用户变成LDAP用户,包括admin账户,
变成LDAP账户后,管理员账户将无法登录,修复方法则是通过更改ambari 元数据中admin的
用户权限,修改后登录会出现闪卡的情况,需要等待闪卡结束,闪卡失败1000多次后,会出现
错乱界面,立即进入之后,快速创建一个管理员账户,即可解决当前问题
2、建议再进行LDAP配置之前,备份amabri配置文件,以及额外创建一个管理员用户,同步失
败篡改管理员权限的问题,并不会影响修改手动创建的管理员账户,只会修改默认的管理员账户
cron_sync_job.sh: 负责定时任务。设置及自动化同步过程的日志管理
ldap_sync.sh : 负责解析users.txt文件中的用户,进行用户同步
sync_shell.sh : 负责与ambari自动化交互,进行用户数据同步
init.sh : 配置文件,包含日志目录,用户文件路径等等配置
log : 日志目录,主要用于保存同步过程中的日志
install : 安装目录,所依赖的插件均保存在这个目录下
package : 主要存放依赖及插件的安装包
groups.txt : 用于配置用户组LDAP用户同步文件
users.txt : LDAP多用户同步配置文件
user.txt : LDAP单用户同步配置文件1>进入init.sh配置文件,修改以下内容:
SYNC_USERS=./users.txt 为 SYNC_USERS=./user.txt
2>修改完成后,可以在user.txt单用户配置文件中配置要同步的用户
3>配置完成后再运行ldap_sync.sh脚本,进行LDAP用户同步
4>登录ambari用户管理界面查看用户同步情况
5>进入ambari元数据库查看LDAP用户同步情况
1>多用户的LDAP同步与单用户同步类似:
进入init.sh配置文件,修改以下内容:
SYNC_USERS=./user.txt 为 SYNC_USERS=./users.txt
2>修改配置文件后,进入users.txt,配置要同步的用户,每个用户占一行
3>用户配置完成后,再运行ldap_sync.sh脚本,进行LDAP用户同步
4>使用管理员账户登录ambari进行查看同步情况
5>进入ambari元数据库,查询users表,检查同步情况
友情提示:以下内容为自主开发功能,非Ambari LDAP插件所有,广大开发者可根据自身情况
使用与更改脚本作用:用于接收user.txt单用户文件中的用户与amabri 自带ldap插件交互
脚本名称:sync_shell.sh
脚本内容:
#Load initialization profile
source ./init.sh
#Perform automatic interactive LDAP integration user synchronization
/usr/bin/expect <<EOF
set timeout 2
spawn expect -i
send "ambari-server sync-ldap --user=${LDAP_USERS}\r"
expect "Enter Ambari Admin login:"
send "wing\r"
expect "Enter Ambari Admin password:"
send "123456\r"
expect "Ambari Server 'sync-ldap' completed successfully"
#send "\003"
expect eof
EOF脚本作用:用于接收users.txt多用户配置文件的用户传寄给交互脚本(sync_shell.sh)
脚本名称: ldap_sync.sh
脚本内容:
#!/bin/bash
#Get basic variables
source ./init.sh
#LDAP User Synchronization Core Method
function users_action(){
param1=${1}
echo ${param1[*]} > ${LDAP_USERS}
echo ${LDAP_USERS}
bash ./sync_shell.sh
}
#Ambari integrated ldap user file parsing method
function for_in_file(){
for i in `cat $SYNC_USERS`
do
users_action $i
true > ./user.txt
done
}
#Amabri integration, ldap user integration and synchronization
for_in_file脚本作用:用户定时更新同步LDAP用户并生成详细同步日志
脚本名称:cron_sync_job.sh
脚本内容:
#Build ldap user synchronization log
#Switch to the synchronization directory
cd /etc/ambari-server/ldap
#Introducing initialization configuration variables
source ./init.sh
echo "=======================>(ambari ldap user sync)Start creating log file:"
log_date=`date +%Y-%m-%d`"_ladp_integrated_synchronization.log"
touch ${LOG_HOME}/$log_date
echo "=======================>(ambari ldap user sync)Log file creation completed!"
echo "=======================>(ambari ldap user sync)Enable ambari integrated Ldap user synchronization program!" >> ${LOG_HOME}/$log_date
start_date=$(date +%Y%m%d' '%H:%M:%S)
echo "=======================>(ambari ldap user sync)The start time of this ambari ldap user synchronization:${start_date}" >> ${LOG_HOME}/$log_date
bash ./ldap_sync.sh >> ${LOG_HOME}/$log_date
end_date=$(date +%Y%m%d' '%H:%M:%S)
#Statistics on synchronization time of ldap users
time_difference=$(($(date +%s -d "${end_date}")-$(date +%s -d "${start_date}")))
echo "=======================>(ambari ldap user sync)The ambari ldap user synchronization is completed this time:${end_date}" >> ${LOG_HOME}/$log_date
echo "=======================>(ambari ldap user sync)The total time spent for this ambari ldap user synchronization:${time_difference}s" >> ${LOG_HOME}/$log_date脚本作用:配置常规变量让所有子脚本赋予
脚本名称:init.sh
脚本内容:
#!/bin/bash
#Amabri Integration Ldap Initialization Configuration Variables
SYNC_USERS=./users.txt
LDAP_USERS=./user.txt
LOG_HOME=/etc/ambari-server/ldap/log