Ansible批量更新远程主机用户密码 - 运维笔记

网友投稿 939 2022-10-13

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Ansible批量更新远程主机用户密码 - 运维笔记

按照集团运维信息安全制度, 需要每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

上一篇:Kubernetes相关概念入门
下一篇:GaussDB数据库单机建库
相关文章

 发表评论

暂时没有评论,来抢沙发吧~