Ansible批量修改WebLogic JDBC 数据源口令

Posted Oracle一体机用户组

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible批量修改WebLogic JDBC 数据源口令相关的知识,希望对你有一定的参考价值。

根据安全最佳实践,数据库用户口令需要定期更改,当数据库用户口令修改后,对应的weblogic中的数据源也要进行相应的修改,当weblogic domain的个数比较多时,可以利用ansbile这样的工具批量修改,提高效率。


修改Data Source口令的wlst脚本


本地执行的wlst脚本网上有很多例子,比如:


##################################################################

#

#  Update password for JNDI connections

#

##################################################################

print("*** Trying to Connect.... *****")

connect('weblogic','welcome1','t3://localhost:7001')

print("*** Connected *****")

edit()

startEdit()

print ("*** Encrypt the password ***")

en = encrypt('hr')

print "Encrypted pwd: ", en

print ("*** Changing pwd for LocalDB ***")

dsName = 'LocalDB'

print 'Changing Password for DataSource ', dsName

cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName+'/JDBCDriverParams/'+dsName)

set('PasswordEncrypted',en)

save()

activate()


为了使用ansible调用在多个主机执行,我们需要将脚本的几个关键信息,修改为变量,通过给脚本传参数,适应多个主机上运行,比如:


# cat updatepw.py

import sys

 

connect(sys.argv[2],sys.argv[3],sys.argv[1])

print("***Connected *****")

edit()

startEdit()

 

print ("***Encrypt the password ***")

en =encrypt(sys.argv[4])

print "Encryptedpwd: ", en

 

dsName = 'DS1'

print 'ChangingPassword for DataSource ', dsName

cd('/JDBCSystemResources/'+dsName+'/JDBCResource/'+dsName+'/JDBCDriverParams/'+dsName)

set('PasswordEncrypted',en)

save()

activate()


这样改造以后,管理服务器URL,weblogic用户名,口令,以及新口令都是以参数形式传递给脚本的。

 

为了保证加密口令语句的成功,必须保证从domain的根目录下调用wlst。为了简单起见,再写一个shell脚本来保证这一点:


# cat updatepw.sh

#!/bin/bash

 

cd/home/oracle/mw/user_projects/domains/$1

/home/oracle/mw/wlserver_10.3/common/bin/wlst.sh/tmp/updatepw.py $2 $3 $4 $5


其中wlst.sh的绝对路径请根据具体情况修改。我这里假设所有主机上weblogic的home目录都是一样的,如果不一样,也可以实现,就是更麻烦一点,把这部分也变成变量,通过参数传递值。


Ansible playbook及变量定义


具体的playbook脚本比较简单:


# cat updatepw.yml

- name: updatepassword of jdbc DS

  hosts: cell

  remote_user: oracle

  gather_facts: no

  tasks:

   - name: copy updatepw.py

     copy: src=./updatepw.py dest=/tmp/mode=0755 force=yes

   - name: copy updatepw.sh

     copy: src=./updatepw.sh dest=/tmp/mode=0755 force=yes

   - name: run updatepw.sh

     shell: /tmp/updatepw.sh {{dname}} {{durl}}{{duser}} {{dpass}} {{newpass}}


将updatepw.py和updatepw.sh分发到各个主机,然后再执行updatepw.sh,并使用ansible变量传递参数,在脚本中定义了5个变量:

 

Weblogic域名称: dname

管理服务器URL: durl

Weblogic用户名: duser

Weblogic口令: dpass

更改的新口令: newpass

 

这几个变量我在ansible的inventory文件中给出了值,也就是/etc/ansible/hosts


[cell]

192.168.0.18  dname=domain3 durl=t3://localhost:7001duser=weblogic dpass=welcome1

192.168.0.19  dname=domain1 durl=t3://localhost:7001duser=weblogic dpass=welcome1

                                    

[cell:vars]

newpass=test


在每个主机后面写的是host vars,每个主机对应的值可以不一样。


[cell:vars] 部分给出的是group vars,这个变量的值在组中所有主机上都一样。


执行ansible playbook


# ansible-playbookupdatepw.yml

 

PLAY[update password of jdbc DS]************************************************************************************************

 

TASK[copy updatepw.py] ************************************************************************************************

ok:[192.168.0.19]

ok:[192.168.0.18]

 

TASK[copy updatepw.sh]************************************************************************************************

ok:[192.168.0.19]

ok:[192.168.0.18]

 

TASK [runupdatepw.sh]************************************************************************************************

changed:[192.168.0.19]

changed:[192.168.0.18]

 

PLAYRECAP ************************************************************************************************

192.168.0.18               : ok=3    changed=1   unreachable=0    failed=0  

192.168.0.19               : ok=3    changed=1   unreachable=0    failed=0


口令安全问题


使用ansible做这样的事,有很多口令都是明文写在inventory文件中的,存在安全隐患,如果要提高安全性,可以使用ansible-vault来加密信息:


比如我们可以将ansible的hosts文件加密,这样,写在其中的口令信息就不会泄露了,具体方法:


# ansible-vaultencrypt hosts

New Vault password:

Confirm New Vaultpassword:

Encryption successful


执行时会要求你输入加密的口令,这个口令在执行playbook时需要用来解密相应的文件。


加密后的hosts文件内容会变成这样:


# cat hosts

$ANSIBLE_VAULT;1.1;AES256

63326132643838643339346635346234626139613665393430613435626533643634363139373932

3630656434313261313039626432613435343034636430350a323132396435623030383632353461

36323061343434623337646637376465643332366330383461386566613139623661663665643730

……


使用加密后的hosts文件运行playbook的方法:


# ansible-playbook --ask-vault-passupdatepw.yml


系统会提问加密口令,输入加密口令后,在内存中解密hosts文件,保证playbook能够被正常执行。


加密后的文件,可以通过ansible-vault decrypt <文件名>方式解密。


也可以通过ansible-vault view <文件名>方式直接查看内容,还可以通过ansible-vault edit <文件名>来直接编辑,当然,这些命令都是会要求输入加密口令的。

 

另外,当配置ansbile使用用户名/口令登录各主机时,需要将ansible_ssh_user, ansible_ssh_pass以host vars的形式写在inventory文件或变量文件中,为了安全,也可以用类似的方式加密。



原创文章,版权归本文作者所有,如需转载请注明出处


喜欢本文请长按下方的二维码订阅Oracle一体机用户组

以上是关于Ansible批量修改WebLogic JDBC 数据源口令的主要内容,如果未能解决你的问题,请参考以下文章

ansible 批量修改密码

ansible批量修改主机密码

使用ansible批量修改ubuntu系统密码

ansible 批量修改密码

ansible-批量修改主机名

ansible 使用主机IP批量修改机器名