专栏首页MyPanda的学习笔记shell配合ansible实现reboot in sequence要求

shell配合ansible实现reboot in sequence要求

任务需求: 有一组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:

[root@localhost ~]# cat my_reboot.lst
server1
server2
[root@localhost ~]#

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

[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. 测试结果如下:
[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内容如下:
[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脚本,本例只是简单的例子,如果有类似需求,自己可以根据实际情形进行扩充.

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • dockerfile 常用易混指令--(1)

    学会写dockerfile是我们学习docker的必经之路;在写dockerfile的时候,感觉如下命令还是需要做个记录,以备需要时方便查阅参考: -----...

    qsjs
  • 网络文件系统的掉线监控(inotifywait)

    在工作中遇到有批量的网络文件系统(100个左右)挂载在同一个机器上,结果一个频发的问题是: 时不时总有一些网络文件系统不明原因的掉线,时间也不确定,当然找到根...

    qsjs
  • python正则表达式学习拾遗

    本篇学习笔记参考re——正则表达式 所作,不明白之处可以参阅上述的官方文档。 因为是个人学习笔记,所以并不会完全介绍所有的正则表达式,而是查漏补缺性质的. ...

    qsjs
  • Codeforces Round #527 (Div. 3) D1. Great Vova Wall (Version 1) (思维+栈)

    题目链接:http://codeforces.com/contest/1092/problem/D1

    Ch_Zaqdt
  • 五角大楼认证,三段UFO官方视频来了,神秘的51区能承载人类的宇宙梦想吗?

    你相信地球文明的诞生是外星人引导的结果吗?就像《2001 太空漫游》里那块巨大的黑石

    新智元
  • RecyclerView定制:通用ItemDecoration及全展开RecyclerView的实现不同场景RecyclerView实现

    看书的小蜗牛
  • 自动化运维—Ansible(上)

      ansible甚至都不用启动服务,仅仅只是一个工具,可以很轻松的实现分布式扩展

    yaohong
  • Spring Boot2 系列教程(十一)Spring Boot 中的静态资源配置

    当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,之前老有小伙伴在微信上问松哥 Spring Boot 中的静态资源加载问题:“松哥,...

    江南一点雨
  • 在自动驾驶的商业化道路上,能站着把钱挣了吗?

    这个问题的答案见仁见智。2009年谷歌看似不经意的“GooCamp”沙龙,却开启了日后九年内自动驾驶的蜕变之路。

    镁客网
  • POJ1656

    比较水的题,数据量暴力可破,但是你以为这样就结束了吗? 如果数据量大一点呢?不得不说,平时做题还是应该深入一点。 我是在写二维线段树找手感的时候做到这题的,顺势...

    triplebee

扫码关注云+社区

领取腾讯云代金券