安全运维中基线检查的自动化之ansible工具巧用
i春秋作家:yanzm
原文来自:安全运维中基线检查的自动化之ansible工具巧用
前几周斗哥分享了基线检查获取数据的脚本,但是在面对上百台的服务器,每台服务器上都跑一遍脚本那工作量可想而知,而且都是重复性的操作,于是斗哥思考能不能找到一种方法来实现自动下发脚本,批量执行,并且能取回执行的结果。对比参考学习某些开源的平台都有这么一个特点就是需要安装客户端(说白了就是类似后门木马的插件),客户端的兼容性适应问题不说,而且全部服务器都要装相应的客户端,明显超出斗哥预期的轻量级的实现自动化的初衷,但是办法总比困难多作为老板的省钱小能手身轻如燕的斗哥还真找到一个工具无需安装客户端就能实现自动化运维的工具。
话不多说,斗哥决定先给大家演示一下ansible如何实现基线检查脚本的自动下发,批量执行和结果取回,然后再进一步学习这款工具的安装和使用,以及后期的自动化思路。
0x01 效果演示
环境说明:
主控端:192.168.159.55
节点:192.168.159.92、192.168.159.94
确保主控端和节点的连通性,主控端/tmp目录下已创建好需执行的基线检查脚本。
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#!/bin/bash#主控端生成密钥ssh-keygen -t rsa#将节点加入/etc/ansible/hosts,增加的可参照下面的格式添加echo "[web]" >> /etc/ansible/hostsecho "192.168.159.92 ansible_ssh_pass=root" >> /etc/ansible/hostsecho "192.168.159.94 ansible_ssh_pass=root" >> /etc/ansible/hosts#记录节点密钥,新增节点参照下面的格式进行添加ssh-keyscan 192.168.159.92 >> /root/.ssh/known_hostsssh-keyscan 192.168.159.94 >> /root/.ssh/known_hosts#创建playbooktouch /etc/ansible/push-ssh.ymlecho "---" >> /etc/ansible/push-ssh.ymlecho "- hosts: web" >> /etc/ansible/push-ssh.ymlecho " user: root" >> /etc/ansible/push-ssh.ymlecho " tasks:" >> /etc/ansible/push-ssh.ymlecho " - name: ssh-key-copy" >> /etc/ansible/push-ssh.ymlecho " authorized_key: user=root key=\"{{lookup('file','/root/.ssh/id_rsa.pub')}}\"" >> /etc/ansible/push-ssh.ymlecho " tags:" >> /etc/ansible/push-ssh.ymlecho " - sshkey" >> /etc/ansible/push-ssh.yml#执行playbookansible-playbook /etc/ansible/push-ssh.yml#测试ansible web -m ping #主控端创建脚本,在节点执行mkdir /tmp/checkansible web -m script -a "/tmp/linux_centos7.sh"#ansible web -m raw -a "ls /tmp/check"#取回脚本执行结果,保存在/tmp/check/目录下result=(`ansible web -m raw -a "ls /tmp/check" | grep dict | awk '{print $1}'`)for i in ${result[@]}doansible ${i:13:14} -m raw -a "cat /tmp/check/$i" >> /tmp/check/$idone |
执行自动化脚本demo,linux_centos7.sh为创建在主控端的基线检查脚本:
脚本执行结束即可在本地的/tmp/check目录下查看到节点的执行结果:
上述的过程,在面对众服务器节点的时候可以省去很多工作量,是不是感觉一下清爽了许多。
but
当节点没有python的情况下,上述脚本是不适用的哦,会出现如下报错提示。
这里先卖个关子,如何实现节点没有安装python的情况下的批量化请继续往下看,斗哥决定先带领大家先来掌握批量脚本涉及的相关知识,工欲善其事必先利其器。
0x02 ansible介绍以及安装
Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric,ps:反正斗哥是没用过啦)的优点,同时ansible最大的优点是不需要在节点中安装任何客户端,它使用SSH来和节点进行通信。 ansible是基于模块工作的,比如常用的script、command、shell、copy、fetch、raw等模块,同时ansible还支持自定义模块和playbook以适应更丰富的自动化运维场景的需求(得益于python的强大基因)。
step1:准备工作
主控端:centos7.5(Red Hat Enterprise Linux,CentOS,Fedora和Ubuntu等发行版都默认安装了python 2.X的解释器,pip不一定是默认安装,如果有安装也需要更新到最新版),具体主控端安装环境要求如下:
ansible的主控端只能安装在类unix的操作系统上,其他发行版的linux安装可以详见ansible中文权威指南-安装管理主机,本文的安装方法仅适用于centos系统。
step2:下载和安装EPEL仓库
[root@root tmp]# wget http://dl.fedoraproject.org/pub/ ... latest-7.noarch.rpm
[root@root tmp]# rpm -ivh epel-release-latest-7.noarch.rpm
step3:安装Ansible以及查看对应的版本
[root@root tmp]# yum -y install ansible
[root@root tmp]# ansible –version
到step3 ansible就已经安装完毕,如果安装在虚拟机的强烈建议这里可以打个快照方便后续的测试调试。step4和step5步骤后面纳入批量化要考虑的需求,但是手工的流程我们先走一遍。
step4:设置用于鉴权的SSH密钥
主控端生成ssh的公私钥,默认生成的密钥保存在/root/.ssh文件夹下
[root@root tmp]# ssh-keygen
主控端向单个节点下发公钥:
[root@root tmp]# ssh-copy-id -i [email]root@192.168.159.61[/email]
step5:添加Ansible定义的节点到host清单
在ansible的配置文件添加host清单,建议根据实际分类对组进行命名。
[root@root tmp]# vi /etc/ansible/hosts
step6:在ansible主控端运行命令测试
[root@root tmp]# ansible -m command -a “ifconfig” ‘webservers’
以上只是针对单个节点的情况下ansible的基本要达到的条件。
0x03 ansible的基础用法、模块的使用条件以及playbook的使用
1. Ansible基本语法如下:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
指定操作的节点 指定模块名称 为模块指定参数
<pattern_goes_here>指的是要操作节点的组名,即/etc/ansible/hosts文件中定义的节点分类的组名或者具体的节点的IP地址或者域名等;
-m 用于指定模块的名称,比如常用的command、script、raw等模块;
-a 定义模块的参数,比如指定模块command后再-a “date”即可查看节点的时间,其他使用以此类推。
2. ansible执行结果的颜色含义:
红色:表示ansible对节点执行的命令出现异常
绿色:表示ansible对节点执行的命令正常执行,并且没有对节点产生修改操作。
黄色:表示ansible对节点执行的命令正常执行,并且对节点产生相应的改动操作。
3. 模块的使用条件:
模块的使用,这里斗哥考虑的是条件是节点是否需要python环境。这里ansible有两个模块是节点是不需要安装python环境就可以使用,分别是raw模块和script模块,其他模块的使用都是基于节点有python环境。
具体的模块的使用条件,参数说明可以在使用相关模块的时候再查读ansible 模块官方文档即可。
4. playbook初识:
playbook其实就是ansible各个模块的组合使用,用专门的yaml语言将一个或多个模块合并在一个playbook里面的组合使用。playbook具体由playbook的角色以及playbook的角色要执行的任务task两部组成,一个playbook由一个或者多个角色(play)组成,一个角色(play)可以包含多个任务(task)。playbook的基本构成看下图:
调用playbook命令的格式:[root@root tmp]#ansible-playbook+参数[options]+playbook文件路径。
栗子: 创建如下playbook:
执行playbook,–tags可指定具体要执行的task:
[root@root tmp]# ansible-playbook –tags t2 playbook.yml
验证执行情况:
0x04 实际问题中自动化的思考
这里斗哥想从实际的需求以及遇到的问题出发来达到轻量级地实现自动化的目标。基于ansible这个开源神器,我们不用直接了解底层ssh的通信原理以及python实现的模块化。在使用ansible这个工具时我们要考虑的批量化需求详见下图分析。
1.基础环境和条件
●基线检查脚本(漏斗公总号回复基线自动化运维可得,当然斗哥手上还有其他操作系统的、中间件、数据库等众多基线脚本,不同的节点运行的脚本的组合不同,这个也需做好分类)
●安装好ansible的主控端主机一台,安装在虚拟机的可以在0x02的step3保存快照。
●需要检查的节点清单(确保开放ssh端口,不是默认22端口的话另分类出来这里暂不做考虑、节点root权限的账号密码)
2.主控端的公钥需要批量下发
主控端通过ssh-keygen命令生成公私钥后,公钥需要下发到节点才可实现主控端对节点的控制,0x02中的是单个节点的公钥下发,并且需要人机交互键入节点ssh密码,显然不适合面对多个节点的下发。
这里斗哥的解决方案是通过expect来实现自动化的交互,以下脚本适用条件于节点无python环境,且节点密码一致的情况。
[root@root tmp]# ./demo
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#!/bin/bash#生成密钥ssh-keygen -t rsa#节点IP以及密码批量发下SERVERS="192.168.159.88 192.168.159.89"PASSWD="root"function sshcopyid{expect -c "set timeout -1;spawn ssh-copy-id $1;expect { \"yes/no\" { send \"yes\r\";exp_continue; } \"password:\" { send \"$PASSWD\r\";exp_continue; } }; expect eof; "}for server in $SERVERSdo sshcopyid $serverdone |
3.基线检查脚本的批量
脚本适用范围:节点未安装python环境,主控端事先创建好要执行的基线脚本。这里斗哥只是使用了ansible的raw和script这两个模块。
|
01
02
03
04
05
06
07
08
09
10
|
#主控端创建/tmp/check文件夹用于存放取回的脚本执行结果mkdir /tmp/check#使用script模块执行脚本ansible web -m script -a "/tmp/linux_centos7.sh"#使用raw模块查看脚本执行的结果并导出保存在主控端result=(`ansible web -m raw -a "ls /tmp/check" | grep dict | awk '{print $1}'`)for i in ${result[@]}doansible ${i:13:14} -m raw -a "cat /tmp/check/$i" >> /tmp/check/$idone |
以上就是斗哥梳理的整个自动化的流程,拆分每个步骤,针对各个坑点逐一击破,从而实现自动化过程和思考。其实ansible还可以跟其他工具相结合使用,比如和Jenkins结合实现可视化等。如果你有疑问或者不同的见解,欢迎给斗哥留言,期待和大家的交流。
大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~
安全运维中基线检查的自动化之ansible工具巧用的更多相关文章
- DBA避坑宝典:Oracle运维中的那些事儿
对于Oracle运维中的那些事儿,我的最终目的:不是比谁更惨,而是能够从中吸取经验和教训. 从我的理解来看,我会从下面的几个方面来进行说明DBA运维中的一些事儿. 每个部分都是非常关键的,缺一不可,而 ...
- autohotkey在运维中的应用
AutoHotkey是一个自由.开源的宏生成器和自动化软件工具,它让用户能够自动执行重复性任务.AutoHotkey可以修改任何应用程序的用户界面(例如,把默认的Windows按键控制命令替 ...
- linux运维中的命令梳理(一)
在linux日常运维中,我们平时会用到很多常规的操作命令. 下面对常用命令进行梳理: 命令行日常系快捷键(不分大小写)CTRL + A 移动光标到行首CTRL + E 移动光标到行末CTRL + U ...
- HDFS datanode心跳与运维中的实际案例
分布式系统的节点之间常采用心跳来维护节点的健康状态,如yarn的rm与nm之间,hdfs的nn与dn之间.DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向 ...
- 漫谈ELK在大数据运维中的应用
漫谈ELK在大数据运维中的应用 圈子里关于大数据.云计算相关文章和讨论是越来越多,愈演愈烈.行业内企业也争前恐后,群雄逐鹿.而在大数据时代的运维挑站问题也就日渐突出,任重而道远了.众所周知,大数据平台 ...
- 运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)
对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮 ...
- 运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)(转)
对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮 ...
- Apache运维中常用功能配置笔记梳理
Apache 是一款使用量排名第一的 web 服务器,LAMP 中的 A 指的就是它.由于其开源.稳定.安全等特性而被广泛使用.下边记录了使用 Apache 以来经常用到的功能,做此梳理,作为日常运维 ...
- 日常运维中的相关日志切割处理方法总结 [Logrotate、python、shell脚本实现 ]
对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮 ...
随机推荐
- 《AlwaysRun!团队》第二次作业:团队项目选题报告
第二次作业:团队项目选题报告 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblog ...
- ARM汇编指令格式
一.ARM介绍 1) arm汇编中,程序下一步执行哪一条指令,是根据程序计数器(PC)的值来决定. 类比于8086的CS:IP的功能. 2) 8086属于CISC(复杂指令集),每条指令长度不等,ar ...
- Struct2 基础介绍
前面花一周时间学习了servlet+jsp+mysql, 并且简单实现了登录注册等操作.对Servlet应用有了基础了解! 关于Struct2这个经常听说,但是自己没有用过.今天在这学习总结下,目的是 ...
- 从本地上传项目到 github 以及从github 下载项目到本地环境
前置条件:成功安装github,安装成功后,要配置密钥,不然上传不成功,要报错 具体上传步骤: git init //初始化 git add 文件名 //更新文件 git commit -m ...
- linux ssh反向代理
参考:https://segmentfault.com/a/1190000002718360 内外运行:sshpass -p 123456 ssh -fNR 5000:localhost:22 ser ...
- 国内最火的10款Java开源项目,都是国人开发,CMS居多
原文链接:https://www.cnblogs.com/jimcsharp/p/8266954.html 国内的开源环境已经相当好,但是国内开发注重是应用,创新有但不多,从榜单可以看出,专门搞技术的 ...
- 弹飞绵羊[HNOI2010]
--BZOJ2002 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线 ...
- python实现bt种子 torrent转magnet
Python实现bt转磁链 参考前人资料主要两种方式 1,利用python的bencode模块 2,安装libtorrent模块 尝试过两种方法特记录 环境:Windows系统 python 3 ...
- WCF系列_WCF常用绑定选择
一.五种常用绑定常用绑定的传输协议以及编码格式 名称 传输协议 编码格式 互操作性 BasicHttpBinding HTTP/HTTPS Text,MTOM Yes NetTcpBinding TC ...
- UE4的委托
UE中委托的使用很广泛,许多Event的触发都有对应的虚函数和委托,虚函数不用讲,只能在派生类中使用,而委托可以在别的类或者蓝图中使用,就应用范围而言,委托的使用更灵活.以AActor的 /** * ...