使用WLST更改数据源密码(多个域)

1 投票
1 回答
2381 浏览
提问于 2025-04-18 13:50

我刚接触WLST脚本,目前还是个初学者。我有一个脚本,它会在读取每个数据源时提示输入密码。这个部分运行得很好,但我现在面临的挑战是,在生产环境中,我们想要运行这个脚本时,会有多个管理服务器,它们有相同的数据源,但名字不同,JNDI却是一样的,因为这两个数据源连接的是同一个数据库。

在这种情况下,脚本现在的工作方式是,它会为每个找到的数据源都提示输入密码,但我想修改这个脚本,让它检查数据源的JNDI名称。如果之前已经为某个相同JNDI的数据源输入过密码,那么就应该使用这个密码,而不是再次提示输入。

另外,还有多个数据源,这些该怎么处理呢?这样做可行吗?而且我不知道如何获取每个数据源的JNDI名称。我尝试用以下方式获取JNDI名称,但没有成功——

jndiName = dataSource.getJNDIName()

这是我在命令行上遇到的错误——

Problem invoking WLST - Traceback (innermost last):
  File "C:\Script\PostDeploy-DataSourcePasswords.py", line 59, in ?
  File "C:\Script\PostDeploy-DataSourcePasswords.py", line 43, in updateJDBCPasswords
AttributeError: getJNDIName

这是我正在使用的脚本——

import sys

#import wlstutility
#wlstutility.initialise(globals())
#from wlstutility import *
#from wlstutility.constructors import *

if len(sys.argv)<1:
    print 'Usage: wlst.sh wibble.py <host:port>' 
    print '   for example: wlst.sh wibble.py prfadmin:14801' 
exit()

hostPort = sys.argv[1]    
print ('host:port = %s' % hostPort )

connectionUrl = ('t3://%s' % hostPort)

WL_USER='weblogic'
commitChanges=True

WL_PWD=raw_input("Enter Weblogic console password: ")

connect(WL_USER, WL_PWD, connectionUrl)

def updateJDBCPasswords():

    PARAMS_TEMPLATE = '/JDBCSystemResources/%s/JDBCResource/%s/JDBCDriverParams/%s'

    domainConfig()

    # Get JDBC DataSources
    cd("JDBCSystemResources")
    dataSources = cmo.getJDBCSystemResources()

    edit()
    # For each DataSource update the password
    for dataSource in dataSources :
        dsName = dataSource.getName()
        print ('DataSource Name : = %s' % dsName)
        password=raw_input("Enter database password for " + dsName +" : ")
        cd(PARAMS_TEMPLATE % (dsName, dsName, dsName) )
        cmo.setPassword(password)

## ===========================================================
# Let's get going

edit()
startEdit()

updateJDBCPasswords()

# dump the changes made so far
print "=== START: The changes that will be applied ==="
showChanges()

if commitChanges :
    # =========================================================
    # commit the changes
    save()
    activate(block="true")
else:
    # =========================================================
    # rollback the changes
    print "=== ROLLBACK - cancelling the changes so that they don't get applied ==="
    cancelEdit('y')

# =========================================================
# all done - bye!
disconnect()
exit()

任何帮助都将非常感激。

谢谢,

Amrut Raut.

1 个回答

0

你可以在测试或预上线环境中,试着用简单的WLST脚本来获取JNDI名称。你可以从下面的ds中获取JNDI名称:

cd('/JDBCSystemResource/' + dsName + '/JdbcResource/' + dsName + '/JDBCDataSourceParams/NO_NAME_0')
jarray_jndi_names=get('JNDINames')
jndi_names=[]
for jname in jarray_jndi_names:
  jndi_names.append(jname)

把dsName的值换成你自己的输入,或者换成你觉得更适合你环境的值。一旦你得到了JNDI名称,就需要用简单的if条件来检查它是否已经存在,然后你就可以用你的逻辑来处理了。

请注意,所有的多数据源都是和通用数据源一起配置的。试试上面的提示后,分享一下你的经验吧。

撰写回答