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

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 "Encrypted pwd: ", en

dsName = 'DS1'

print 'Changing Password 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: update password 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:7001 duser=weblogic dpass=welcome1

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

[cell:vars]

newpass=test

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

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

执行ansible playbook

将updatepw.py, updatepw.sh, updatepw.yml放在ansible server上的同一路径下,执行:

# ansible-playbook updatepw.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 [run updatepw.sh] ************************************************************************************************

changed: [192.168.0.19]

changed: [192.168.0.18]

PLAY RECAP ************************************************************************************************

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-vault encrypt hosts

New Vault password:

Confirm New Vault password:

Encryption successful

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

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

# cat hosts

$ANSIBLE_VAULT;1.1;AES256

63326132643838643339346635346234626139613665393430613435626533643634363139373932

3630656434313261313039626432613435343034636430350a323132396435623030383632353461

36323061343434623337646637376465643332366330383461386566613139623661663665643730

……

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

# ansible-playbook --ask-vault-pass updatepw.yml

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

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

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

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

Comments are closed.