WLST执行writeDomain失败:目录非空问题排查咨询
WebLogic WLST创建域时目录提前生成导致writeDomain失败的问题解决
问题根源分析
你遇到的问题是WLST脚本中cd('Servers/AdminServer')操作意外在目标目录生成了servers/AdminServer子目录,导致后续writeDomain报错(该命令要求目标目录完全为空)。结合代码和偶发失败的特征,核心原因大概有这几个:
- 路径不一致:代码中检查的目录是
/srv/wlp/domains/aserver/wlp_domain_test,但writeDomain的目标路径是/srv/eip/domains/aserver/eip_domain_test,如果Ansible执行上下文存在路径映射、软链接或权限交叉的情况,可能导致两个路径实际指向同一位置,触发冲突。 - WLST版本bug:部分旧版本WebLogic的WLST在执行
cd导航MBean节点时,会意外触发临时目录生成——正常情况下cd只是内存中操作MBean树,不应该触发生成文件系统目录。 - 文件操作不规范:用
file(fn,"w")打开日志文件后未关闭,导致日志写入不及时,可能误导你对目录生成时机的判断。
WebLogic域创建核心机制
WLST创建域的标准流程是:
- 加载模板:
selectTemplate+loadTemplates把模板中的MBean配置加载到内存,此时完全不涉及文件系统写入。 - 修改配置:
cd、cmo.setXXX或lookup等操作都是在内存中修改MBean属性,不会生成实际文件或目录。 - 写入域:只有调用
writeDomain()时,才会将内存中的所有配置写入目标目录,生成完整的域文件结构。 - 清理退出:
closeTemplate+exit释放资源。
正常情况下,writeDomain是唯一会写入文件系统的步骤,之前的操作都不应该产生目录。
具体解决方案
1. 统一目标目录路径
把代码中所有涉及域目录的路径改成同一个,彻底避免路径混淆:
# 统一目标目录 domain_path = "/srv/eip/domains/aserver/eip_domain_test" fn = "/home/svuser/wlst.log" # 检查目录时用统一路径 with open(fn, "w") as f: f.write(str(os.listdir(domain_path))) # 最后writeDomain也用这个路径 writeDomain(domain_path)
2. 替换cd操作为直接MBean查找
如果是cd操作触发的目录生成bug,改用lookup直接获取MBean对象,跳过导航操作:
# 替换cd('Servers/AdminServer')的写法 admin_server = lookup("Servers/AdminServer") admin_server.setName('AdminServer') admin_server.setListenAddress('my.domain.de') admin_server.setListenPort(10100) # 修改用户密码同理 weblogic_user = lookup("/Security/base_domain/User/weblogic") weblogic_user.setPassword('XXX')
3. 强制确保目标目录为空
在执行WLST脚本前,用Ansible的file模块彻底清理目标目录:
- name: 清理域目录 file: path: /srv/eip/domains/aserver/eip_domain_test state: absent - name: 创建空的域目录 file: path: /srv/eip/domains/aserver/eip_domain_test state: directory owner: svuser group: svgroup mode: '0755'
或者在WLST脚本开头添加清理逻辑(Python2.7):
import shutil domain_path = "/srv/eip/domains/aserver/eip_domain_test" if os.path.exists(domain_path): shutil.rmtree(domain_path) os.makedirs(domain_path)
4. 修复日志文件操作
用with语句确保文件正确关闭,避免日志写入延迟:
fn = "/home/svuser/wlst.log" with open(fn, "w") as f: f.write(str(os.listdir(domain_path))) cd('Servers/AdminServer') f.write(str(os.listdir(domain_path)))
5. 检查WebLogic版本补丁
如果是WLST的bug导致的问题,查看对应WebLogic版本的官方补丁列表,安装针对WLST目录生成异常的补丁。
内容的提问来源于stack exchange,提问作者groovehunter
相关产品推荐
相关产品推荐

