按照集团运维信息安全制度, 需要每3或6个月对线上服务器密码进行一次变更,通过shell脚本部署比较繁琐,所以决定采用ansible脚本对远程主机root密码进行批量重置,该脚本已经在稳定运行在正式环境下。具体方法如下:

1)  在服务端安装ansible

[root@ansible-server ~]# yum install -y ansible

2) 配置ansible到远程主机的ssh无密码登录的信任关系  (authoried_keys 模块)

首先采用Ansible批量建立ssh无密码登录的信任关系!![root@ansible-server ~]# ssh-keygen -t rsa          #一路回车[root@ansible-server ~]# ls /root/.ssh/id_rsa  id_rsa.pub ####################################################################################################需要注意ssh建立互信的命令格式:# ssh-copy-id -i ~/.ssh/id_rsa.pub username@ip或hostname#################################################################################################### 在客户机比较多的情况下,使用 ssh-copy-id命令的方法显然是有些费时,使用ansible-playbook 推送 ymal进行批量创建ssh互信关系就显得省事多了,这里就使用到了ansible的authoried_keys 模块: 首先要配置ansible清单 (远程主机的密码这里为"123456")[root@ansible-server ~]# vim /etc/ansible/hosts................................[ssh-host]172.16.60.204172.16.60.205172.16.60.206172.16.60.207 [ssh-host:vars]ansible_ssh_pass="123456" ####################################################################################################发送公钥到目标机器命令格式如下:# ansible ssh-host -m copy -a "src=/root/.ssh/id_rsa.pub dest=/root/.ssh/authorized_keys mode=600"####################################################################################################在上面分发密钥中,如果清单文件/etc/ansible/hosts里没有使用ansible_ssh_pass变量指明密码,则可以使用下面命令:这里默认ssh-host组下的机器root密码都一样,使用-k 参数,回车输入root密码即可:# ansible ssh-host -m authorized_key -a "user=root state=present key=\"{{ lookup('file', '/root/.ssh/id_rsa.pub') }} \"" -k#################################################################################################### 编写playbook文件[root@ansible-server ~]# vim /opt/ssh_key.yaml---  - hosts: ssh-host    user: root    tasks:     - name: ssh-copy       authorized_key: user=root key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}" 注意上面yaml脚本中的"ssh-key-host"是在/etc/ansible/hosts清单文件里配置的远程客户机列表这里做的是基于远程主机root用户的ssh互信 执行批量互信[root@ansible-server ~]# ansible-playbook /opt/ssh_key.yaml PLAY [ssh-host] ************************************************************************************************************************ TASK [Gathering Facts] *****************************************************************************************************************ok: [172.16.60.204]ok: [172.16.60.205]ok: [172.16.60.206]ok: [172.16.60.207] TASK [ssh-copy] ************************************************************************************************************************changed: [172.16.60.205]changed: [172.16.60.204]changed: [172.16.60.206]changed: [172.16.60.207] PLAY RECAP *****************************************************************************************************************************172.16.60.204              : ok=2    changed=1    unreachable=0    failed=0  172.16.60.205              : ok=2    changed=1    unreachable=0    failed=0  172.16.60.206              : ok=2    changed=1    unreachable=0    failed=0  172.16.60.207              : ok=2    changed=1    unreachable=0    failed=0 最后验证下ssh互信[root@ansible-server ~]# ansible -i /etc/ansible/hosts ssh-host -m shell -a "whoami"172.16.60.204 | SUCCESS | rc=0 >>root 172.16.60.205 | SUCCESS | rc=0 >>root 172.16.60.207 | SUCCESS | rc=0 >>root 172.16.60.206 | SUCCESS | rc=0 >>root 这样,ansible批量创建到远程客户机的ssh信任关系已经实现了!

3) Ansible批量更新远程主机用户密码方法

方法一:  使用Ansible的user模块批量修改远程客户机的用户密码

由于在使用ansible修改用户密码的时候不能使用明文的方式,需要先加密,所以就需要使用一个方法对输入的明文的密码进行加密.废话不多说了. 下面直接记录下操作方法:[root@ansible-server ~]# vim /opt/root_passwd.yaml---  - hosts: ssh-host    gather_facts: false    tasks:    - name: change user passwd      user: name={{ item.name }} password={{ item.chpass | password_hash('sha512') }}  update_password=always      with_items:           - { name: 'root', chpass: 'kevin@123' }           - { name: 'app', chpass: 'bjop123' }注意上面在yaml文件中修改了远程客户机的root用户密码, app用户密码. 如果还想要修改其他用户密码, 则继续按照上面规则添加即可!执行ansible-play[root@ansible-server ~]# ansible-playbook /opt/root_passwd.yaml PLAY [ssh-host] ************************************************************************************************************************TASK [change user passwd] **************************************************************************************************************changed: [172.16.60.204] => (item={u'chpass': u'kevin@123', u'name': u'root'})changed: [172.16.60.205] => (item={u'chpass': u'kevin@123', u'name': u'root'})changed: [172.16.60.204] => (item={u'chpass': u'bjop123', u'name': u'app'})changed: [172.16.60.205] => (item={u'chpass': u'bjop123', u'name': u'app'})changed: [172.16.60.206] => (item={u'chpass': u'kevin@123', u'name': u'root'})changed: [172.16.60.206] => (item={u'chpass': u'bjop123', u'name': u'app'})changed: [172.16.60.207] => (item={u'chpass': u'kevin@123', u'name': u'root'})changed: [172.16.60.207] => (item={u'chpass': u'bjop123', u'name': u'app'})PLAY RECAP *****************************************************************************************************************************172.16.60.204              : ok=1    changed=1    unreachable=0    failed=0   172.16.60.205              : ok=1    changed=1    unreachable=0    failed=0   172.16.60.206              : ok=1    changed=1    unreachable=0    failed=0   172.16.60.207              : ok=1    changed=1    unreachable=0    failed=0

方法二:  修改远程主机的单个用户密码使用此方法比较方便

编写playbook文件[root@ansible-server ~]# vim /opt/root_passwd2.yaml---  - hosts: ssh-host    gather_facts: false    tasks:    - name: Change password      user: name={{ name1 }}  password={{ chpass | password_hash('sha512') }}  update_password=always执行ansible-playbook,  使用-e参数传递用户名和密码给剧本,其中root为用户名,admin#123就是修改后的root密码[root@ansible-server ~]# ansible-playbook /opt/root_passwd2.yaml -e "name1=root chpass=admin#123"            PLAY [ssh-host] ************************************************************************************************************************TASK [Change password] *****************************************************************************************************************changed: [172.16.60.204]changed: [172.16.60.205]changed: [172.16.60.206]changed: [172.16.60.207]PLAY RECAP *****************************************************************************************************************************172.16.60.204              : ok=1    changed=1    unreachable=0    failed=0   172.16.60.205              : ok=1    changed=1    unreachable=0    failed=0   172.16.60.206              : ok=1    changed=1    unreachable=0    failed=0   172.16.60.207              : ok=1    changed=1    unreachable=0    failed=0

方法三:  使用如下Ansible脚本, 适用于修改清单中部分远程主机的用户密码

编写ansible-playbook脚本 (需要注意下面脚本中"ens192"是客户机ip所在的网卡设备名称, 这个要根据自己实际环境去配置, 比如eth0, eth1等)[root@ansible-server ~]# cat /opt/root_passwd4.yaml - hosts: test-host  remote_user: root  tasks:  - name: change password for root    shell: echo '{{ item.password }}' |passwd --stdin root    when: ansible_ens192.ipv4.address  == '{{ item.ip }}'    with_items:     - { ip: "172.16.60.220", password: 'haha@123' }     - { ip: "172.16.60.221", password: 'kevin@123' }     - { ip: "172.16.60.222", password: 'bobo@123' } 执行ansible-playbook: [root@ansible-server ansible]# ansible-playbook /opt/root_passwd3.yamlPLAY [ssh-host] ************************************************************************************************************************TASK [Gathering Facts] *****************************************************************************************************************ok: [172.16.60.204]ok: [172.16.60.205]ok: [172.16.60.206]ok: [172.16.60.207]TASK [change password for root] ******************************************************************************************************** [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ansible_eth0.ipv4.address== '{{ item.ip }}' [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ansible_eth0.ipv4.address== '{{ item.ip }}'skipping: [172.16.60.205] => (item={u'ip': u'172.16.60.204', u'password': u'haha@123'})  [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ansible_eth0.ipv4.address== '{{ item.ip }}'skipping: [172.16.60.206] => (item={u'ip': u'172.16.60.204', u'password': u'haha@123'}) skipping: [172.16.60.206] => (item={u'ip': u'172.16.60.205', u'password': u'kevin@123'})  [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ansible_eth0.ipv4.address== '{{ item.ip }}'skipping: [172.16.60.207] => (item={u'ip': u'172.16.60.204', u'password': u'haha@123'}) skipping: [172.16.60.207] => (item={u'ip': u'172.16.60.205', u'password': u'kevin@123'}) skipping: [172.16.60.207] => (item={u'ip': u'172.16.60.206', u'password': u'bobo@123'}) changed: [172.16.60.205] => (item={u'ip': u'172.16.60.205', u'password': u'kevin@123'})skipping: [172.16.60.205] => (item={u'ip': u'172.16.60.206', u'password': u'bobo@123'}) changed: [172.16.60.204] => (item={u'ip': u'172.16.60.204', u'password': u'haha@123'})skipping: [172.16.60.204] => (item={u'ip': u'172.16.60.205', u'password': u'kevin@123'}) skipping: [172.16.60.204] => (item={u'ip': u'172.16.60.206', u'password': u'bobo@123'}) changed: [172.16.60.206] => (item={u'ip': u'172.16.60.206', u'password': u'bobo@123'})PLAY RECAP *****************************************************************************************************************************172.16.60.204              : ok=2    changed=1    unreachable=0    failed=0   172.16.60.205              : ok=2    changed=1    unreachable=0    failed=0   172.16.60.206              : ok=2    changed=1    unreachable=0    failed=0   172.16.60.207              : ok=1    changed=0    unreachable=0    failed=0

                                                                                                                                                                           

如果ansible服务端没有和远程主机做ssh信任关系, 则可以在hosts清单配置里直接指明用户名和密码.如果使用普通用户, 并且允许sudo, 则需要提前在客户机里的/etc/sudoers文件里配置好该普通用户的sudo配置, 即允许该普通用户有sudo权限. [root@ansible-server ~]# vim /etc/ansible/hosts................[test-host]172.16.60.220 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_ssh_port=22172.16.60.221 ansible_ssh_user=root ansible_ssh_pass=bo@123 ansible_ssh_port=22172.16.60.222 ansible_ssh_user=app ansible_ssh_pass=bj@123 ansible_ssh_port=22 ansible_sudo_pass=bj@123 即172.16.60.222客户机上要提前配置, 允许app用户具有sudo权限.执行:[root@ansible-server ~]# ansible test-host -m shell -a "hostname"                      172.16.60.222 | SUCCESS | rc=0 >>k8s-node02172.16.60.220 | SUCCESS | rc=0 >>k8s-master01172.16.60.221 | SUCCESS | rc=0 >>k8s-node01[root@ansible-server ~]# ansible -i /etc/ansible/hosts test-host -m shell -a "hostname"172.16.60.222 | SUCCESS | rc=0 >>k8s-node02172.16.60.220 | SUCCESS | rc=0 >>k8s-master01172.16.60.221 | SUCCESS | rc=0 >>k8s-node01
©著作权归作者所有:来自51CTO博客作者80民工的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. deepin mysql安装 用户创建
  2. 如何仿照OSINT模式进行机密信息的收集与发掘
  3. 【linux】循序渐进学运维-用户管理篇
  4. Linux系统用户密码规则 - 运维总结
  5. CentOS7 或者 CentOS6 忘记root密码重新设置方法
  6. CentOS7 安装MySQL 5.7方法总结 - 实操手册
  7. 1分钟手把手教你破解华为交换机密码
  8. 3分钟掌握思科路由器密码破解
  9. 世界上没有绝对安全的手机,保护iPhone安全的七个提示

随机推荐

  1. Android 系统字体和颜色样式
  2. Android(安卓)面试题及答案(英文)
  3. 在android 中开发java.net.SocketExcepti
  4. Android 网络多线程断点下载
  5. Android 设置系统SystemUI 顶部StatusBar
  6. Android之发送短信和接收验证码
  7. android应用去掉title bar 及全屏处理方
  8. Android 各种基础控件布局
  9. Android 8、Android 9获取手机序列号的兼
  10. Android(安卓)开源组件和第三方库汇总