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文件或变量文件中,为了安全,也可以用类似的方式加密。