自动化运维之SaltStack,批量安装httpd实战
SaltStack原理
SaltStack由Master和Minion构成,Master 是服务端, 表示一台服务器;Minion是客户服务端,表示多台服务器。在Master上发送命令给符合条件的Minion,Minin就会执行相应的命令,Master和Minion之间是通过ZeroMQ (消息队列)进行通信的。
SaltStack的Master端监听4505与4506端口,4505为Master和Minion认证通信端口,4506为Master用来发送命令或者接收Minion的命令执行返回信息。
当客户端启动后,会主动连接Master端注册,然后一直保持该TCP连接,而Master通过这条TCP连接对客户端进行控制。如果连接断开,Master对客户端将不能进行控制。但是,当客户端检查到连接断开后,会定期向Master端请求注册连接。
SaltStack常用模块
- pkg模块:包管理,包括增删更新。
- file模块:管理文件操作,包括同步文件、设置文件权限和所属用户组、删除文件等操作。
- cmd模块:在Minion上执行命令或者脚本。
- user模块:管理系统账号操作。
- service模块:管理系统服务操作。
- cron模块:管理cron服务操作。
SaltStack批量部署并配置Apache
部署环境
角色 | 主机名 | IP地址 |
---|---|---|
master | master | 192.168.10.157 |
minion | web1 | 192.168.10.161 |
minion | web2 | 192.168.10.129 |
开始部署
SaltStack安装
1、修改所有主机的主机名和hosts文件后重启
master:vim /etc/hostname master //修改主机名vim /etc/hosts192.168.10.157 master
192.168.10.161 web1
192.168.10.129 web2init 6 //重启
web1:vim /etc/hostname web1 //修改主机名vim /etc/hosts192.168.10.157 master
192.168.10.161 web1
192.168.10.129 web2init 6 //重启
web2:vim /etc/hostname web2 //修改主机名vim /etc/hosts192.168.10.157 master
192.168.10.161 web1
192.168.10.129 web2init 6 //重启
2、三台主机上安装epel源
yum install epel-release -y
3、master上安装salt-master
yum install salt-master -y
4、编辑master主机上的salt配置文件
vim /etc/salt/masterinterface: 192.168.10.157 //15行,改为为本机地址 auto_accept: True //215行,自动认证被控端的认证 file_roots: //416-418行,去掉注释开启 base:- /srv/salt //这个目录默认是没有的,需要创建。pillar_roots: //529-531行, 去掉注释开启base:- /srv/pillar //这个目录默认是没有的,需要创建。pillar_opts: True //552行,开启pillar功能nodegroups: //710行,组的分类group1: 'web1'group2: 'web2'
5、查看修改的内容
cat /etc/salt/master | grep -v ^$ | grep -v ^#
6、创建salt目录及pillar目录
mkdir /srv/salt
mkdir /srv/pillar
7、关闭防火墙和安全功能,开启salt-master服务并查看4505端口和4506端口是否开启
systemctl stop firewalld.service
setenforce 0 //关闭防火墙和安全功能systemctl start salt-master.service 开启服务
netstat -ntap | egrep '4505|4506'
8、在两台被控端web1,web2上安装salt-minion
yum install salt-minion -y
9、编辑salt-minion的配置文件
vim /etc/salt/minionmaster: 192.168.10.157 //16行,指定控制端IP
id: web1 //78行,指定本机主机名,web2则为web2
10、两台被控端关闭防火墙和安全功能,开启服务
systemctl stop firewalld.service
setenforce 0 //关闭防火墙和安全功能
systemctl start salt-minion.service //开启服务
11、测试控制端与被控端的通信状态
salt '*' test.ping
web2:True
web1:True
SaltStack批量部署Apache
1、master上创建top.sls文件并写入以下内容
vim /srv/salt/top.slsbase:'*': //表示在所有的客户端执行apache模块- apache
2、master上创建apache.sls文件并写入以下内容
vim /srv/salt/apache.slsapache-service:pkg.installed:- names:- httpd- httpd-develservice.running:- name: httpd- enable: True
3、重启salt-master服务
systemctl restart salt-master
4、刷新state配置命令,让两台被控端去执行安装apache
salt '*' state.highstateweb2:
----------ID: apache-serviceFunction: pkg.installedName: httpdResult: TrueComment: Package httpd is already installed.Started: 15:22:08.547203Duration: 1363.436 msChanges:
----------ID: apache-serviceFunction: pkg.installedName: httpd-develResult: TrueComment: Package httpd-devel is already installed.Started: 15:22:09.910806Duration: 0.533 msChanges:
----------ID: apache-serviceFunction: service.runningName: httpdResult: TrueComment: Service httpd is already enabled, and is in the desired stateStarted: 15:22:09.911959Duration: 360.802 msChanges: Summary
------------
Succeeded: 3
Failed: 0
------------
Total states run: 3
web1:
----------ID: apache-serviceFunction: pkg.installedName: httpdResult: TrueComment: Package httpd is already installed.Started: 15:22:08.546047Duration: 1364.252 msChanges:
----------ID: apache-serviceFunction: pkg.installedName: httpd-develResult: TrueComment: Package httpd-devel is already installed.Started: 15:22:09.910497Duration: 0.516 msChanges:
----------ID: apache-serviceFunction: service.runningName: httpdResult: TrueComment: Service httpd is already enabled, and is in the desired stateStarted: 15:22:09.911733Duration: 375.981 msChanges: Summary
------------
Succeeded: 3
Failed: 0
------------
Total states run: 3
接上图
通过执行结果看到了三个ID,它们相当于三个任务,第一个安装httpd,第二个安装httpd-devel,第三个启动。并且显示三个都成功了,失败为零。
5、两台被控端上查看是否已安装Apache并开启
web1:
web2:
实验完成
转载于:https://blog.51cto.com/13641879/2155348
相关文章:

我的面试(四)补充1
突然想起来前天面试时,考官问我out参数和ref参数的区别。我当时答的是out是出的,ref可以来回传参。也就是说out参数是进不来的,而ref是可以进来了。今天写代码试了试。从新整理一下关于out和ref的区别。static void Function1(out int outPar…

(C++)输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
#include<cstdio> //输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。 //编写函数——输入10个数 //编写函数——进…
深入biztalk消息以及消息订阅发布路由机制(二)-消息订阅【转】
一.消息订阅 订阅消息的主体叫订阅服务器,订阅服务器是可以订阅并消费消息的服务,可以作为订阅服务器的服务类型目前有四类,在BizTalkMgmtDb管理数据库中的adm_ServiceClass的Name字段列出了所有可以作为订阅服务器的服务类型,包括…

poj1625Censored!(AC自动机+dp)
链接 第一次做这种题目,参考了下题解,相当于把树扯直了做DP,估计这一类题都是这个套路吧。 状态方程dp[i][next] dp[i][next]dp[i][j] ;dp[i][j]表示长度为i的第J个结点的时候满足题意的num,next为当前j点所能走到的下一个合法的…

图解5G NR帧结构
子载波间隔 与LTE(子载波间隔和符号长度)相比, NR支持多种子载波间隔(在LTE中,只有15 Khz这种子载波间隔)。 在3GPP38.211中,有关于NR子载波间隔类型的总结。 具体的子载波间隔类型如下图所示&a…

(C++) A+B 输入输出练习IV 每行的第一个数N,表示本行后面有N个数。 如果N=0时,表示输入结束,且这一行不要计算。
#include<cstdio>/* 4 1 2 3 4 5 1 2 3 4 5 0 */int main(){int n,a;while(scanf("%d",&n),n){int sum 0;for(int i 0;i<n;i){scanf("%d",&a);sum a;}printf("%d\n",sum); }return 0;}

jQuery与其它库冲突的解决方法(转)
原文出处:http://www.jb51.net/article/24014.htm 在jQuery库中,几乎所有的插件都被限制在它的命名空间里。全局的对象都很好地存储在jQuery命名空间里,因此当把jQuery和其它javascript类库一起使用时,不会引起冲突. (注意&#x…

ASP.NET 下载文件方式
protected void Button1_Click(object sender, EventArgs e){/*微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。代码如下:*/Response.ContentType "a…

ITIL管理思想的执行工具发布
E8.HelpDesk是融入ITIL管理思想,并结合中国企业实施ITIL的实际需求,成功研发ITIL管理思想的执行工具,全面帮助中国企业高效导入ITIL管理体系,提升企业战略执行力。 E8.HelpDesk支持多种服务台管理体系,支持事件管理、问…

(C++)A+B 输入输出练习V 输入的第一行是一个正数N,表示后面有N行。每一行的第一个数是M,表示本行后面还有M个数。
#include<cstdio>/* 2 4 1 2 3 4 5 1 2 3 4 5 */int main(){int n,a;scanf("%d",&n);while(n--){int sum 0,m;scanf("%d",&m);for(int i 0;i<m;i){scanf("%d",&a);sum a;}printf("%d\n",sum); }return 0;}
Linux上重启服务的正确命令
在开发环境下,我们经常需要部署代码,重启服务,所以会把命令写在脚本中,方便使用。 我们可能这么写 #!/bin/bashps -ef | grep backend-api-1.0 | grep -v "\-\-color" |awk {print $2} |xargs kill -9 sleep 1 nohup ja…

Error: Most middleware (like bodyParser) ...
运行NodeJS时出现如下错误: Error: Most middleware (like bodyParser) is no longer bundled with Express and must be installed separately. 意思是 命令行中运行 npm install body-parser 回车,进行安装。 对源代码进行调整,加上 var b…
[导入][转]常用CSS缩写语法总结
使用缩写可以帮助减少你CSS文件的大小,更加容易阅读。css缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如: #000000可以缩写为#000;#336699可以缩写为#369; 盒尺寸 通常有下…

(C++)A+B 输入输出练习VI 每行的第一个数N,表示本行后面有N个数。
#include<cstdio>/* 4 1 2 3 4 5 1 2 3 4 5 */int main(){int n;while(scanf("%d",&n) ! EOF){int sum 0,a;for(int i 0;i<n;i){scanf("%d",&a);sum a;}printf("%d\n",sum); }return 0;}

NDK 提示undefined reference to xxx“的解决办法
在Android.mk文件的 LOCAL_SRC_FILES后面加入包含该类或函数的文件,用\隔开,\后换行继续添加 例如 LOCAL_SRC_FILES : NDKTest.cpp\bncore.c\bn_error.c\bn_fast_mp_invmod.c\bn_fast_mp_montgomery_reduce.c\bn_fast_s_mp_mul_digs.c\bn_fast_s_mp_mul_…

7. Query Expressions(查询表达式)
【返回目录】 查询表达式提供了与SQL这样的关系化和分级的查询语言相类似的语言集成的语法。一个查询表达式是以from子句开头以select或者group子句结束,这个初始的from子句可以在其后跟随任意多个from、let、where或者join子句。 那么查询表达式中的这些子句都是做…

CSS完美兼容IE6/IE7/IE8/IE9/IE10的通用方法
300px!important;width /**/:340px;margin:0 10px 0 10px} ,关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:) 3、ul标…

(C++)A+B 输入输出练习VII 输入包含若干行,每行输入两个整数a和b,由空格分隔。 对于每组输入,输出a和b的和,每行输出后接一个空行。
#include<stdio.h> /* 1 5 10 20 */int main() { int a,b;while(scanf("%d%d",&a,&b) ! EOF){printf("%d\n\n",ab);}return 0;}

Address already in use: JVM_Bind错误的解决
错误原因 tomcat的8005端口号被占用了 解决办法 关闭已有的占用端口 1. cmd—>netstat -an 查看当前开启的端口号 2. netstat -ano 获得端口号的pid码 3. skill -{pid} 杀死端口进程转载于:https://www.cnblogs.com/lxq0309/p/3736899.html

在SQL Server中如何转化长日期形式为短日期格式
convert(nvarchar(10),字段名,121)即可将时间格式转化为yyyy-mm-dd格式 convert中的121是指将datetime类型转换为char类型时获得包括世纪位数的4位年份。转载于:https://www.cnblogs.com/footleg/archive/2007/11/29/976451.html

看看Vector源码Java 9
2019独角兽企业重金招聘Python工程师标准>>> Vector类实现了一个可增长的对象数组。像数组一样,它包含可以使用整数索引随机访问。但是,Vector的大小可以根据需要增大或缩小,以适应在创建Vector之后添加和删除项目。 文档里的内容…

(C++)1016 部分A+B 正整数
#include<cstdio>int main(){ //1.读入a,Da,b,Dblong long a,b,Pa0,Pb0;int Da,Db;scanf("%lld%d%lld%d",&a,&Da,&b,&Db); //2.对于a,遍历每一位,加在Pa上 //2.1取余的方式遍历while(a>0){if(a%10Da){Pa Pa*10 Da;}a a/10;} …

MySQL Innodb日志机制深入分析
1.1. Log & Checkpoint Innodb的事务日志是指Redo log,简称Log,保存在日志文件ib_logfile*里面。Innodb还有另外一个日志Undo log,但Undo log是存放在共享表空间里面的(ibdata*文件)。 由于Log和Checkpoint紧密相关࿰…

单元测试的重要性
一些错误的认识 在实际的单元测试过程中总会有一些错误的认识左右着我们,使之成为单元测试最大的障碍,在此将其一一分析如下: 它太浪费时间了,现在要赶进度,时间上根本不允许,或者随便做做应付领导。 我是一…

浅谈网络协议(四) IP的由来--DHCP与PXE
2019独角兽企业重金招聘Python工程师标准>>> 上一节说过,IP就是一台计算机的通讯地址,要和其他机器通讯,就需要一个通讯地址,就要给网卡配置这么一个地址。 配置 IP 那如何配置呢?可以使用 ifconfig&#x…

(C++)1026 程序运行时间
#include<cstdio> const int CLK_TCK100;int main(){ //1.读入c1,c2int c1,c2;scanf("%d%d",&c1,&c2); //2.定义常量CLK_TCK100 //难点:不足 1 秒的时间四舍五入到秒 --不用round(),避免浮点数运算 int dif c2-c1;if(dif%100&…

Spring中@Autowired注解、@Resource注解的区别
Spring不但支持自己定义的Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是Resource、PostConstruct以及PreDestroy。 Resource的作用相当于Autowired,只不过Autowired按byType自动注入,而Resource默认按 byName自…

(C++)1046 划拳
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮&…

JAVA中重写equals()方法的同时要重写hashcode()方法
object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;注意:当此方法被重写时,通常有必要重写 hashCode 方法,以…

从0到1,苏宁API网关的演进之路
http://www.infoq.com/cn/articles/suning-11-11-api-gateway?utm_campaigninfoq_content&utm_sourceinfoq&utm_mediumfeed&utm_termglobal 2012年,在开放云融推动各产业全面发展的大背景下,苏宁API对外开放。基于苏宁各内部业务系统的资源…