前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell配合ansible实现reboot in sequence要求

shell配合ansible实现reboot in sequence要求

作者头像
qsjs
发布2020-06-29 15:55:55
2.2K0
发布2020-06-29 15:55:55
举报
文章被收录于专栏:MyPanda的学习笔记

任务需求: 有一组20台server组成的应用服务器,其每台server的应用服务已经配置了开机启动,但是服务要running well,那么服务必须按照顺序启动,对于这20台需要经常reboot的server, 如何通过ansible来实现reboot顺序的管理,从而保证服务都是按照顺序start的呢?

在这里,当重启服务器的时候,按照顺序reboot服务器就成为了关键,对于这个问题,可以manually 来按照顺序进行reboot, 这是最简单的,但是也是最效率低下的,在一个“自动化运维“的大环境下,我们也需要考虑自动化的实现方式. 在网上查了不少资料,主要考虑了以下的解决方法(基于ansible): A. 创建不同的分组,然后通过分组以及分组组合进行 reboot控制. 这个也是网上资料最多的一种. 然而这个不符合我们的环境,我们这20台是独立的,如果分组,要不就是20个为一组,这样就没有什么作用 。要不就需要每个单独一组,这样就需要20组,这样用起来看起来不是很合理。 B. ansible 默认为并发工作模式,也就是同时在多台server执行task , 但是ansible也支持对并发数量的限制,当限制为1的时候,就变成按照顺序执行了,看起来符合我们的要求,然而 ansible并不会按照inventory的group中描述的先后顺序来执行task, 它是一个随机的”依次“执行,每次执行一台没有问题,但无法保证 按照期望的顺序执行. C. 创建一个shell脚本,然后ansible来调用这个shell脚本到目标机器去执行reboot, 这样shell脚本需要判断其他server的状态,才能进而在目标机器执行合理的action. 实现起来比较麻烦. 如果是200台,估计脚本都写不下去了... D. 创建一个shell脚本,然后通过shell脚本调用ansible-playbook命令实现reboot, 因为shell脚本可以按照指定的顺序依次进行action, 而ansible 可以每次都只在一台server上进行reboot,这样看起来就可以实现按照顺序进行reboot了。详细的思路如下: 1)配置一个本地的文件,按照重启的顺序将 server 写入文件,示例中的顺序是server1, server2:

代码语言:javascript
复制
[root@localhost ~]# cat my_reboot.lst
server1
server2
[root@localhost ~]#

2)创建shell脚本,调用ansible-playbook命令:

代码语言:javascript
复制
[root@localhost ~]# cat my_reboot.sh
#!/bin/bash
f_path=./my_reboot.lst
for h in `cat ${f_path}`;do
        ansible-playbook  -i  ./my_host.ini -l $h ./my_reboot.yml
done
[root@localhost ~]#
  1. 测试结果如下:
代码语言:javascript
复制
[root@localhost ~]# ./my_reboot.sh

PLAY [reboot the server and wait the reboot completed.] ***********************************************************************

TASK [Gathering Facts] ********************************************************************************************************
ok: [server1]

TASK [command] ****************************************************************************************************************
 [WARNING]: Module invocation had junk after the JSON data:   Broadcast message from root@localhost.localdomain (Sun
2020-06-28 15:29:56 CST):    The system is going down for reboot at Sun 2020-06-28 15:30:56 CST!

changed: [server1]

TASK [wait_for] ***************************************************************************************************************
ok: [server1 -> localhost]

PLAY RECAP ********************************************************************************************************************
server1                    : ok=3    changed=1    unreachable=0    failed=0


PLAY [reboot the server and wait the reboot completed.] ***********************************************************************

TASK [Gathering Facts] ********************************************************************************************************
ok: [server2]

TASK [command] ****************************************************************************************************************
 [WARNING]: Module invocation had junk after the JSON data:   Broadcast message from root@localhost.localdomain (Sun
2020-06-28 15:31:30 CST):    The system is going down for reboot at Sun 2020-06-28 15:32:30 CST!

changed: [server2]

TASK [wait_for] ***************************************************************************************************************
ok: [server2 -> localhost]

PLAY RECAP ********************************************************************************************************************
server2                    : ok=3    changed=1    unreachable=0    failed=0

[root@localhost ~]#
  1. 用于server reboot的playbook内容如下:
代码语言:javascript
复制
[root@localhost ~]# cat my_reboot.yml
---
- name: reboot the server and wait the reboot completed.
  hosts:
    - all
  tasks:
    - shell: "shutdown -r 1"
    - delegate_to: localhost
      wait_for:
        host: "{{ (inventory_hostname|default(ansible_host))|default(inventory_hostname) }}"
        port: 22
        delay: 90
        timeout: 180
[root@localhost ~]#
总结:

如果要实现reboot server in sequence, 那么可以用shell脚本来调用ansible-playbook命令达到目的,如果看你到本文的您有更好的解决方法,欢迎分享

2.

而如果要实现一台服务器内的多个服务按照顺序启动,那么可以 把服务的启动顺序写成shell脚本,然后直接用ansible在远程目标机器上执行shell脚本.

3.

对于上面的shell脚本,本例只是简单的例子,如果有类似需求,自己可以根据实际情形进行扩充.

本文原创,转载请注明出处!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结:
  • 本文原创,转载请注明出处!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档