1. 前言
需求:一批云主机,要求每周修改一次密码。
2. 实践
使用 ansible + sendmail 即可实现。
主机信息:
(1)安装 sendmail
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz tar zxf sendEmail-v1.56.tar.gz -C /usr/src/ cd /usr/src/sendEmail-v1.56/ cp -a sendEmail /usr/local/bin/ yum install perl-Net-SSLeay perl-IO-Socket-SSL -y wget http://www.cpan.org/src/5.0/perl-5.10.0.tar.gz tar zxf perl-5.10.0.tar.gz cd perl-5.10.0 ./configure.gnu -des -Dprefix=/usr/local/perl make make install mv /usr/bin/perl /usr/bin/perl.bak ln -s /usr/local/perl/bin/perl /usr/bin/perl
测试:
/usr/local/bin/sendEmail -f 发送方邮箱地址 -t 接收方邮件地址 -s 发送方SMTP服务器 -u "test" -xu 发送方邮箱登录用户名 -xp 发送方邮件服务器登录密码 -m "test-1234567890" -l /var/log/sendmail.log
邮件查收
(2)配置 ansible
建立ssh互信登录
#yum install -y ansible expect #ssh-keygen -t rsa -P '' # 两下回车 #mkdir copy_key #cd copy_key/ #cat ip.txt # 所有要做 ssh 互信的主机ip列表 192.168.118.12 192.168.118.13 #cat copykey.sh # 通过 expect 批量进行 ssh 互信操作,这样可以节省很多时间 #!/bin/bash # Author:hukey while read line do expect <
配置 ansible
#cd /etc/ansible/ #mv hosts hosts_bak #vim hosts [nodes] 192.168.118.12 ansible_ssh_user=root 192.168.118.13 ansible_ssh_user=root 测试ssh 互信是否完成 #ansible all -m ping 192.168.118.13 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.118.12 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } ok, 以上信息没有报错就说明ssh互信完成。
编写 playbook 实现批量修改主机密码
#mkdir change_passwd #cd change_passwd/ 通过 user 模块很容易修改主机密码 #cat change_passwd.yaml - hosts: all # 主机组为 ansible hosts 中的所有主机 gather_facts: false tasks: - name: Change password user: name={{ name1 }} password={{ chpass | password_hash('sha512') }} update_password=always # 需要传递2个变量 name1 和 chpass 测试执行: #ansible-playbook change_passwd.yaml -e "name1=root chpass=123456" PLAY [all] ******************************************** TASK [Change password] ******************************** changed: [192.168.118.12] changed: [192.168.118.13] PLAY RECAP ******************************************** 192.168.118.12 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.118.13 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 通过结果,可以判断是执行成功的,也就是 ansible hosts 中的主机 root 密码已经修改为 123456
(3)编写脚本
这是做主机 root 密码的修改,脚本必须谨慎谨慎再谨慎,如下:
#!/bin/bash # Author:hukey sendMail(){ to=$1 subject=$2 body=$3 user='[email protected]' # 邮件发送者,这里如果没有,建议 126注册一个 smtp_server='smtp.126.com' # 邮箱 smtp 服务器 password='xxx' # smtp 密码 /usr/local/bin/sendEmail -f $user -t "$to" -s $smtp_server -u "$subject" -o tls=no -o message-content-type=html -o message-charset=utf8 -xu $user -xp $password -m "$body" >> /var/log/sendmail.log } USERMAIL='xxx,xxx' # 邮件接收者,多人接收格式 '[email protected],[email protected]' USER=root PASSWD=$(tr -dc _A-Z-a-z#$%^*_0-9 /tmp/ansible_ping.log # 首先通过 ping 模块检测主机存活和连接情况 if [ $? -ne 0 ];then # 一旦有一台主机无法连接则发送错误邮件后退出脚本执行 sendMail $USERMAIL 'xxx主机- 批处理错误' "
电信云 - 批处理错误 | |
主机 | 192.168.1.222 |
错误日志 | /tmp/ansible_ping.log |
电信云主机信息 | |
用户名 | ${USER} |
密码 | ${PASSWD} |
测试下脚本执行:
主机批量修改成功,root 用户密码修改为上面的随机串。随后就可以加入到 crontab 中。
3. 总结
其实,这是一个需要很严谨的操作,通过脚本来执行有些欠妥,但是对于大批量的主机操作,这也算比较好的方式吧。目前,以上脚本已经在生产环境中使用,但是 批量管理主机 不在修改密码的行列。这样,就算出现bug,也能及时补救。