Ansible批量更新远程主机用户密码 (包括Ansible批量做ssh互信)

这篇具有很好参考价值的文章主要介绍了Ansible批量更新远程主机用户密码 (包括Ansible批量做ssh互信)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1) 在服务端安装ansible

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

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

批量实现多台服务器之间ssh无密码登录的相互信任关系, 可以参考之前的文章:  https://www.cnblogs.com/kevingrace/p/9063745.html
这里采用Ansible 实现批量建立互信, 方法如下:

首先要生成ansible服务端本机ssh的key 
[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.204
172.16.60.205
172.16.60.206
172.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"
==========================================================

编写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脚本, 适用于修改清单中部分远程主机的用户密码文章来源地址https://www.toymoban.com/news/detail-852898.html

编写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.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 [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=22
172.16.60.221 ansible_ssh_user=root ansible_ssh_pass=bo@123 ansible_ssh_port=22
172.16.60.222 ansible_ssh_user=app ansible_ssh_pass=bj@123 ansible_ssh_port=22 ansible_sudo_pass=bj@123
 
即172.16.60.220客户机上要提前配置, 允许app用户具有sudo权限.

执行:
[root@ansible-server ~]# ansible test-host -m shell -a "hostname"                      
172.16.60.222 | SUCCESS | rc=0 >>
k8s-node02

172.16.60.220 | SUCCESS | rc=0 >>
k8s-master01

172.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-node02

172.16.60.220 | SUCCESS | rc=0 >>
k8s-master01

172.16.60.221 | SUCCESS | rc=0 >>
k8s-node01

到了这里,关于Ansible批量更新远程主机用户密码 (包括Ansible批量做ssh互信)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Xshell “所选的用户密钥未在远程主机上注册,请再试一次”SSH 登录远程linux服务器(良心整理)

    这个问题真的要把我逼疯了,为什么呢? 为了解决这个问题,我搜遍了CSDN、知乎、简书上的解决方案,CSDN上的回答真的是水文太多,相互抄,抄就抄吧,只抄一半。这让真正想解决问题的人走了太多的弯路。 也不知道是谁写的原文,可能作者解决了,但是写的很不清楚,也

    2023年04月15日
    浏览(45)
  • ansible 修改远程主机nginx配置文件

    设置秘钥   ansible添加主机 ansible测试一下 ping功能 sudo ansible 192.168.1.10 -m ping   测试传送文件到B机 整体目标: 在本机修改好nginx配置文件,并批量更新到目标主机。 分解目标是 1.拷贝文件   2. 重启服务    给所有的目标主机的nginx的配置文件末尾都添加如下: 在ansible的主

    2024年02月12日
    浏览(34)
  • ansible创建用户账户和更新ansible库的密钥

    1.创建⽤户帐户 从 http://materials/user_list.yml 下载要创建的⽤户的列表,并将它保存到 /home/greg/ansible 在本次考试中使⽤在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook ,从⽽按以下所述创建⽤户帐户: 职位描述为 developer 的⽤户应当

    2024年04月16日
    浏览(47)
  • Ansible fetch 模块 该模块用于从远程某主机获取(复制)文件到本地

    dest :用来存放文件的目录 src :在远程拉取的文件,并且必须是一个 file ,不能是**目录* 可以看到一个执行成功的输出 从客服主机复制文件到本主机 并且 备注ip 或者解析域名

    2024年02月19日
    浏览(41)
  • 第七章 使用ssh服务管理远程主机

    一、配置网卡服务 1、配置网卡参数 (1)、执行nmtui命令运行网络配置工具 (2)、选择编辑连接并按回车 (3)、选择以太网中网卡名称并编辑 (4)、将IPv4的配置方式改成手动模式 (5)、按下显示按钮显示详细信息 (6)、填写IP地址、子网掩码和网关并按下确定 (7)、

    2024年02月03日
    浏览(47)
  • Linux SSH 远程连接主机,并执行命令

    应用场景 当需要远程到另一台Linux上,并在另一台机器上执行 Shell 命令,则需要注意命令的书写格式 示例说明 远程到 192.158.157.47 机器上,并执行命令 cd /tmp ./zabbixagent_install.sh echo Success 1、错误方式 因为命令间用 拼接,表示多条命令是顺序执行,所以, ssh命令和后续的命令

    2024年02月14日
    浏览(49)
  • 远程管理通道安全SSH协议主机验证过程

            可以使用SSH协议进行远程管理通道安全保护,其中涉及的主要安全功能包括主机验证、数据加密性和数据完整性保护。         这里要注意的是【主机验证】和【身份验证】的区别,主机验证是客户端确认所访问的服务端是目标访问对象,比如从从客户端A(192.1

    2024年02月10日
    浏览(48)
  • 如何通过ssh远程连接自己的主机(Linux)?

    可以看到,有多块网卡在工作,其中eno1是有线网卡,UP表示开启了,但没有运行(RUNNING),因为此时主机并没有连接有线网络。 lo是本地虚拟网卡,所有设备都为127.0.0.1,可以在没有网络的环境中用来测试。 wlp4s0是无线网卡,它被开启(UP),且正在工作(RUNNING)。第二行

    2024年02月04日
    浏览(53)
  • 通过设置向导设置dlink无线路由器包括登陆用户名和密码等等

    dlink路由器设置有设置向导,按照向导进行设置,很简单。 首先,你要知道路由器的IP地址,登陆用户名和密码,这些都在路由器的背面。 步骤 1、打开浏览器,在浏览器地址栏中输入你的路由器的地址,我的路由器的地址是192.168.0.1.所以我就输入192.168.0.1,点击回车 2、弹出输

    2024年02月06日
    浏览(58)
  • Jenkins部署ssh连接远程主机执行脚本找不到环境变量的问题

    最近在Jenkins部署远程执行其他服务器上的编译脚本时遇到报找不到编译器的问题,耗时两天尝试了排序比较靠前的一些方法,但都没能解决问题,所以决定记录下,希望能帮助到大家。 执行命令:ssh root@远程主机 /studio/test.sh 编译报错: /bin/sh: 1: aarch64-linux-gnu-gcc: not found 注

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包