修改WAS中HCL Connections的MailSession及变更检测方案咨询
解决方案
方案1:直接调用修改接口后通过官方API检测变更(推荐)
WAS的AdminConfig.modify接口本身会自动校验传入的属性值与现存配置是否一致,只有存在差异时才会生成待保存的变更记录。你可以跳过自行解析showall结果比对的步骤,直接执行修改操作,再通过AdminConfig.queryChanges()官方接口判断是否真的产生了变更,该接口会返回当前会话所有未保存的配置修改内容,返回为空则说明无变更,完全规避了密码返回星号无法比对的问题。
示例代码:
properties = [ ["mailTransportHost", "{{ mail_host }}"], ["mailTransportUser", "{{ mail_user }}"], ["mailTransportPassword", "{{ mail_pw }}"], ["mailFrom", "{{ mail_sender }}"], ["debug", "{{ mail_debug | lower }}"] ] session = AdminConfig.list('MailSession', 'lcnotification*') # 直接调用修改接口 AdminConfig.modify(session, properties) # 检查是否有实际变更 changes = AdminConfig.queryChanges() if changes: print("Detected mail session config changes, start save and sync") AdminConfig.save() import shared shared.synchAllNodes() else: print("No mail session config changes detected")
对应的Ansible任务changed_when直接判断输出中存在Detected mail session config changes即可,逻辑更简单,准确率也更高。
方案2:保留属性比对逻辑,特殊处理密码字段
如果你需要明确输出哪些属性发生了变更用于审计,可以保留原有的比对逻辑,做如下调整:
- 非密码类属性正常执行比对
- 密码字段跳过直接比对,新增可选的强制更新变量
force_update_mail_password,当你明确需要修改密码时设为true触发变更 - 最后同样通过
AdminConfig.queryChanges()做最终校验,避免误判
示例调整后的代码片段:
properties = [ ["mailTransportHost", "{{ mail_host }}"], ["mailTransportUser", "{{ mail_user }}"], ["mailTransportPassword", "{{ mail_pw }}"], ["mailFrom", "{{ mail_sender }}"], ["debug", "{{ mail_debug | lower }}"] ] session = AdminConfig.list('MailSession', 'lcnotification*') existing = AdminConfig.showall(session) need_modify = 0 force_pw_update = {{ force_update_mail_password | lower }} # 比对非密码属性 for line in existing.splitlines(): noBrackets = line[1:-1] firstSpace = noBrackets.index(" ") key = noBrackets[0:firstSpace] val = noBrackets[firstSpace:].strip() if key == "mailTransportPassword": continue for prop in properties: propKey = prop[0] propVal = prop[1] if propKey == key and val != propVal: print(f"{propKey} not matching:\n\tPresent: {val}\n\tWanted: {propVal}") need_modify = 1 # 处理密码强制更新 if force_pw_update: print("Force update mail transport password") need_modify = 1 if need_modify: AdminConfig.modify(session, properties) changes = AdminConfig.queryChanges() if changes: print("Config changes confirmed, start save and sync") AdminConfig.save() import shared shared.synchAllNodes() else: print("No actual config changes after modify operation")
内容的提问来源于stack exchange,提问作者Lion
相关产品推荐
相关产品推荐

