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

1)  在服务端安装ansible

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

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

  1. 首先采用Ansible批量建立ssh无密码登录的信任关系!!
  2.  
  3. [root@ansible-server ~]# ssh-keygen -t rsa #一路回车
  4. [root@ansible-server ~]# ls /root/.ssh/
  5. id_rsa id_rsa.pub
  6.  
  7. ####################################################################################################
  8. 需要注意ssh建立互信的命令格式:
  9. # ssh-copy-id -i ~/.ssh/id_rsa.pub username@ip或hostname
  10. ####################################################################################################
  11.  
  12. 在客户机比较多的情况下,使用 ssh-copy-id命令的方法显然是有些费时,使用ansible-playbook 推送 ymal进行批量创建ssh互信关系就显得省事多了,
  13. 这里就使用到了ansibleauthoried_keys 模块:
  14.  
  15. 首先要配置ansible清单 (远程主机的密码这里为"123456")
  16. [root@ansible-server ~]# vim /etc/ansible/hosts
  17. ................
  18. ................
  19. [ssh-host]
  20. 172.16.60.204
  21. 172.16.60.205
  22. 172.16.60.206
  23. 172.16.60.207
  24.  
  25. [ssh-host:vars]
  26. ansible_ssh_pass="123456"
  27.  
  28. ####################################################################################################
  29. 发送公钥到目标机器命令格式如下:
  30. # ansible ssh-host -m copy -a "src=/root/.ssh/id_rsa.pub dest=/root/.ssh/authorized_keys mode=600"
  31. ####################################################################################################
  32. 在上面分发密钥中,如果清单文件/etc/ansible/hosts里没有使用ansible_ssh_pass变量指明密码,则可以使用下面命令:
  33. 这里默认ssh-host组下的机器root密码都一样,使用-k 参数,回车输入root密码即可:
  34. # ansible ssh-host -m authorized_key -a "user=root state=present key=\"{{ lookup('file', '/root/.ssh/id_rsa.pub') }} \"" -k
  35. ####################################################################################################
  36.  
  37. 编写playbook文件
  38. [root@ansible-server ~]# vim /opt/ssh_key.yaml
  39. ---
  40. - hosts: ssh-host
  41. user: root
  42. tasks:
  43. - name: ssh-copy
  44. authorized_key: user=root key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
  45.  
  46. 注意上面yaml脚本中的"ssh-key-host"是在/etc/ansible/hosts清单文件里配置的远程客户机列表
  47. 这里做的是基于远程主机root用户的ssh互信
  48.  
  49. 执行批量互信
  50. [root@ansible-server ~]# ansible-playbook /opt/ssh_key.yaml
  51.  
  52. PLAY [ssh-host] ************************************************************************************************************************
  53.  
  54. TASK [Gathering Facts] *****************************************************************************************************************
  55. ok: [172.16.60.204]
  56. ok: [172.16.60.205]
  57. ok: [172.16.60.206]
  58. ok: [172.16.60.207]
  59.  
  60. TASK [ssh-copy] ************************************************************************************************************************
  61. changed: [172.16.60.205]
  62. changed: [172.16.60.204]
  63. changed: [172.16.60.206]
  64. changed: [172.16.60.207]
  65.  
  66. PLAY RECAP *****************************************************************************************************************************
  67. 172.16.60.204 : ok=2 changed=1 unreachable=0 failed=0
  68. 172.16.60.205 : ok=2 changed=1 unreachable=0 failed=0
  69. 172.16.60.206 : ok=2 changed=1 unreachable=0 failed=0
  70. 172.16.60.207 : ok=2 changed=1 unreachable=0 failed=0
  71.  
  72. 最后验证下ssh互信
  73. [root@ansible-server ~]# ansible -i /etc/ansible/hosts ssh-host -m shell -a "whoami"
  74. 172.16.60.204 | SUCCESS | rc=0 >>
  75. root
  76.  
  77. 172.16.60.205 | SUCCESS | rc=0 >>
  78. root
  79.  
  80. 172.16.60.207 | SUCCESS | rc=0 >>
  81. root
  82.  
  83. 172.16.60.206 | SUCCESS | rc=0 >>
  84. root
  85.  
  86. 这样,ansible批量创建到远程客户机的ssh信任关系已经实现了!

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

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

  1. 由于在使用ansible修改用户密码的时候不能使用明文的方式,需要先加密,所以就需要使用一个方法对输入的明文的密码进行加密.
  2. 废话不多说了. 下面直接记录下操作方法:
  3.  
  4. [root@ansible-server ~]# vim /opt/root_passwd.yaml
  5. ---
  6. - hosts: ssh-host
  7. gather_facts: false
  8. tasks:
  9. - name: change user passwd
  10. user: name={{ item.name }} password={{ item.chpass | password_hash('sha512') }} update_password=always
  11. with_items:
  12. - { name: 'root', chpass: 'kevin@123' }
  13. - { name: 'app', chpass: 'bjop123' }
  14.  
  15. 注意上面在yaml文件中修改了远程客户机的root用户密码, app用户密码.
  16. 如果还想要修改其他用户密码, 则继续按照上面规则添加即可!
  17.  
  18. 执行ansible-play
  19. [root@ansible-server ~]# ansible-playbook /opt/root_passwd.yaml
  20.  
  21. PLAY [ssh-host] ************************************************************************************************************************
  22.  
  23. TASK [change user passwd] **************************************************************************************************************
  24. changed: [172.16.60.204] => (item={u'chpass': u'kevin@123', u'name': u'root'})
  25. changed: [172.16.60.205] => (item={u'chpass': u'kevin@123', u'name': u'root'})
  26. changed: [172.16.60.204] => (item={u'chpass': u'bjop123', u'name': u'app'})
  27. changed: [172.16.60.205] => (item={u'chpass': u'bjop123', u'name': u'app'})
  28. changed: [172.16.60.206] => (item={u'chpass': u'kevin@123', u'name': u'root'})
  29. changed: [172.16.60.206] => (item={u'chpass': u'bjop123', u'name': u'app'})
  30. changed: [172.16.60.207] => (item={u'chpass': u'kevin@123', u'name': u'root'})
  31. changed: [172.16.60.207] => (item={u'chpass': u'bjop123', u'name': u'app'})
  32.  
  33. PLAY RECAP *****************************************************************************************************************************
  34. 172.16.60.204 : ok=1 changed=1 unreachable=0 failed=0
  35. 172.16.60.205 : ok=1 changed=1 unreachable=0 failed=0
  36. 172.16.60.206 : ok=1 changed=1 unreachable=0 failed=0
  37. 172.16.60.207 : ok=1 changed=1 unreachable=0 failed=0

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

  1. 编写playbook文件
  2. [root@ansible-server ~]# vim /opt/root_passwd2.yaml
  3. ---
  4. - hosts: ssh-host
  5. gather_facts: false
  6. tasks:
  7. - name: Change password
  8. user: name={{ name1 }} password={{ chpass | password_hash('sha512') }} update_password=always
  9.  
  10. 执行ansible-playbook, 使用-e参数传递用户名和密码给剧本,其中root为用户名,admin#123就是修改后的root密码
  11. [root@ansible-server ~]# ansible-playbook /opt/root_passwd2.yaml -e "name1=root chpass=admin#123"
  12.  
  13. PLAY [ssh-host] ************************************************************************************************************************
  14.  
  15. TASK [Change password] *****************************************************************************************************************
  16. changed: [172.16.60.204]
  17. changed: [172.16.60.205]
  18. changed: [172.16.60.206]
  19. changed: [172.16.60.207]
  20.  
  21. PLAY RECAP *****************************************************************************************************************************
  22. 172.16.60.204 : ok=1 changed=1 unreachable=0 failed=0
  23. 172.16.60.205 : ok=1 changed=1 unreachable=0 failed=0
  24. 172.16.60.206 : ok=1 changed=1 unreachable=0 failed=0
  25. 172.16.60.207 : ok=1 changed=1 unreachable=0 failed=0

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

  1. 编写ansible-playbook脚本 (需要注意下面脚本中"ens192"是客户机ip所在的网卡设备名称, 这个要根据自己实际环境去配置, 比如eth0, eth1等)
  2. [root@ansible-server ~]# cat /opt/root_passwd4.yaml
  3. - hosts: test-host
  4. remote_user: root
  5. tasks:
  6. - name: change password for root
  7. shell: echo '{{ item.password }}' |passwd --stdin root
  8. when: ansible_ens192.ipv4.address == '{{ item.ip }}'
  9. with_items:
  10. - { ip: "172.16.60.220", password: 'haha@123' }
  11. - { ip: "172.16.60.221", password: 'kevin@123' }
  12. - { ip: "172.16.60.222", password: 'bobo@123' }
  13.  
  14. 执行ansible-playbook:
  15. [root@ansible-server ansible]# ansible-playbook /opt/root_passwd3.yaml
  16.  
  17. PLAY [ssh-host] ************************************************************************************************************************
  18.  
  19. TASK [Gathering Facts] *****************************************************************************************************************
  20. ok: [172.16.60.204]
  21. ok: [172.16.60.205]
  22. ok: [172.16.60.206]
  23. ok: [172.16.60.207]
  24.  
  25. TASK [change password for root] ********************************************************************************************************
  26. [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ansible_eth0.ipv4.address
  27. == '{{ item.ip }}'
  28.  
  29. [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ansible_eth0.ipv4.address
  30. == '{{ item.ip }}'
  31.  
  32. skipping: [172.16.60.205] => (item={u'ip': u'172.16.60.204', u'password': u'haha@123'})
  33. [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ansible_eth0.ipv4.address
  34. == '{{ item.ip }}'
  35.  
  36. skipping: [172.16.60.206] => (item={u'ip': u'172.16.60.204', u'password': u'haha@123'})
  37. skipping: [172.16.60.206] => (item={u'ip': u'172.16.60.205', u'password': u'kevin@123'})
  38. [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: ansible_eth0.ipv4.address
  39. == '{{ item.ip }}'
  40.  
  41. skipping: [172.16.60.207] => (item={u'ip': u'172.16.60.204', u'password': u'haha@123'})
  42. skipping: [172.16.60.207] => (item={u'ip': u'172.16.60.205', u'password': u'kevin@123'})
  43. skipping: [172.16.60.207] => (item={u'ip': u'172.16.60.206', u'password': u'bobo@123'})
  44. changed: [172.16.60.205] => (item={u'ip': u'172.16.60.205', u'password': u'kevin@123'})
  45. skipping: [172.16.60.205] => (item={u'ip': u'172.16.60.206', u'password': u'bobo@123'})
  46. changed: [172.16.60.204] => (item={u'ip': u'172.16.60.204', u'password': u'haha@123'})
  47. skipping: [172.16.60.204] => (item={u'ip': u'172.16.60.205', u'password': u'kevin@123'})
  48. skipping: [172.16.60.204] => (item={u'ip': u'172.16.60.206', u'password': u'bobo@123'})
  49. changed: [172.16.60.206] => (item={u'ip': u'172.16.60.206', u'password': u'bobo@123'})
  50.  
  51. PLAY RECAP *****************************************************************************************************************************
  52. 172.16.60.204 : ok=2 changed=1 unreachable=0 failed=0
  53. 172.16.60.205 : ok=2 changed=1 unreachable=0 failed=0
  54. 172.16.60.206 : ok=2 changed=1 unreachable=0 failed=0
  55. 172.16.60.207 : ok=1 changed=0 unreachable=0 failed=0
  1. 如果ansible服务端没有和远程主机做ssh信任关系, 则可以在hosts清单配置里直接指明用户名和密码.
  2. 如果使用普通用户, 并且允许sudo, 则需要提前在客户机里的/etc/sudoers文件里配置好该普通用户的sudo配置, 即允许该普通用户有sudo权限.
  3.  
  4. [root@ansible-server ~]# vim /etc/ansible/hosts
  5. ................
  6. [test-host]
  7. 172.16.60.220 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_ssh_port=22
  8. 172.16.60.221 ansible_ssh_user=root ansible_ssh_pass=bo@123 ansible_ssh_port=22
  9. 172.16.60.222 ansible_ssh_user=app ansible_ssh_pass=bj@123 ansible_ssh_port=22 ansible_sudo_pass=bj@123
  10.  
  11. 172.16.60.222客户机上要提前配置, 允许app用户具有sudo权限.
  12.  
  13. 执行:
  14. [root@ansible-server ~]# ansible test-host -m shell -a "hostname"
  15. 172.16.60.222 | SUCCESS | rc=0 >>
  16. k8s-node02
  17.  
  18. 172.16.60.220 | SUCCESS | rc=0 >>
  19. k8s-master01
  20.  
  21. 172.16.60.221 | SUCCESS | rc=0 >>
  22. k8s-node01
  23.  
  24. [root@ansible-server ~]# ansible -i /etc/ansible/hosts test-host -m shell -a "hostname"
  25. 172.16.60.222 | SUCCESS | rc=0 >>
  26. k8s-node02
  27.  
  28. 172.16.60.220 | SUCCESS | rc=0 >>
  29. k8s-master01
  30.  
  31. 172.16.60.221 | SUCCESS | rc=0 >>
  32. k8s-node01

Ansible批量更新远程主机用户密码 (包括Ansible批量做ssh互信)的更多相关文章

  1. oracle 批量更新之将一个表的数据批量更新至另一个表

      oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...

  2. Shell 批量修改主机 用户密码

    问题:132.121.114 和 132.121.118 网段共 48 台主机未添加基础监控,但是 wh 账户不能登录 需进行批量修改密码操作. 目前情况:op1对上述48台机器设备均能免密登录. 操 ...

  3. shell批量修改mysql用户密码

    需求 现在有这么一个需求, 需要大批量修改用户的密码, 需要注意的规则是: 必须添加的字符: *$#sjdKw% 用户名的第一位+*$#sjdKw%+用户名的最后一位,比如用户名chenglee,密码 ...

  4. MYSQL 处理批量更新数据的一些经验。

    首先,我们需要了解下MYSQL CASE EXPRESSION 语法. 手册传送门:http://dev.mysql.com/doc/refman/5.7/en/control-flow-functi ...

  5. oracle批量更新之使用游标进行分批次更新的5种方式及速度比对

      1.情景展示 一共有22w条数据, 需要将A表的主键更新至B表的指定字段,如何快速完成更新? 2.解决方案 声明: 解决方案不只一种,该文章只介绍快速游标法及代码实现: 两张表的ID和ID_CAR ...

  6. oracle 批量更新之update case when then

      oracle 批量更新之update case when then CreationTime--2018年8月7日15点51分 Author:Marydon 1.情景描述 根据表中同一字段不同情况 ...

  7. oracle 批量更新表字段

      (一) 将数字替换成汉字 第一步,去重查询 使用distinct关键字先对该字段值进行去重查询,看共有几种情况 --查询指定区间内表停诊字段的值 SELECT DISTINCT T.CLOSE_T ...

  8. EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除

    原文链接:http://blog.csdn.net/fanbin168/article/details/51485969   批量插入 (17597条数据批量插入耗时1.7秒)   using Sys ...

  9. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

随机推荐

  1. javascript生成器

    next()方法 如果给next方法传参数, 那么这个参数将会作为上一次yield语句的返回值 ,这个特性在异步处理中是非常重要的, 因为在执行异步代码以后, 有时候需要上一个异步的结果, 作为下次异 ...

  2. 2019.03.09 bzoj4999: This Problem Is Too Simple!(树链剖分+线段树动态开点)

    传送门 题意:给一颗树,每个节点有个初始值,要求支持将i节点的值改为x或询问i节点到j节点的路径上有多少个值为x的节点. 思路: 考虑对每种颜色动态开点,然后用树剖+线段树维护就完了. 代码: #in ...

  3. JS入门经典第四章总结

    charAt():该函数有一个参数,即选择哪一个位置上的参数.返回值就是该位置上的字符. charCodeAt():该函数有一个参数,即选择哪一个位置上的参数.返回值是该位置字符在Unicode字符集 ...

  4. Java中的==与equals

    当使用==操作符判断类时,实际上判断的是二者是否指向同一个对象 若要判断两个对象是否含有相同的数据,需使用Object类中的equals方法 java中所有类都是从Object类中派生出来的

  5. centos7.2安装图文详解

    centos镜像下载地址  https://www.centos.org/download/ Install CentOS 7 ----直接安装Test this media & instal ...

  6. jQuery-爱奇艺图片切换

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  7. 解读IEEE 7417的软件体系架构描述的概念模型

    本文将解读标准IEEE Std 1471-2000(密集型软件的体系结构描述推荐实施规程)的概念模型图部分,从中一窥作为软件架构师的进行架构设计的思考角度与策略.如果我们把世界当做一场游戏,现在要玩的 ...

  8. 在Ubuntu 18.04中安装pyenv(Python多版本管理工具)

    最近正在重头梳理Python的基础知识,为了更好地使用Python进行开发,防止发生版本混乱(不同的第三方库有可能因为Python版本不兼容而报错),所以需要使用pyenv进行版本管理. *** 通常 ...

  9. dom4j 解析XML文件

    <?xml version="1.0" encoding="UTF-8"?> <!-- 手机的根节点 --> <Phones> ...

  10. python常用的十进制、16进制之间的转换

    一 整数之间的进制转换: hex(16) # 10进制转16进制 oct(8) # 10进制转8进制 bin(8) # 10进制转2进制 二 字符串转整数 int(') # 字符串转换成10进制整数 ...