说明:本文使用的是两个节点的集群,分别为node1和node2
配合如下帖子进行学习:
使用centos6.7
1.安装saltstack
在node1和node2分别执行下面的命令(下面是先配置镜像源为阿里云,作用是提高下载速度)
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/repo/epel-7.repo
yum install salt-master (仅在node1执行,安装salt-master)
yum install salt-minion (分别在node1和node2执行,安装salt-minion)
2.启动
启动salt-master:
centos6用下面命令启动
[root@node1 bin]# service salt-master start
centos7用下面命令启动(因为7开始用systemctl 替换了service)
[root@node1 yum.repos.d]# systemctl start salt-master
说明:salt-master,salt-minion都在/etc/init.d/目录下
salt的配置文件在 cd /etc/salt/下,salt-master或者salt-minion启动之后会发现多了一个pki的文件夹
启动salt-minion
[root@node1 ~]# service salt-minion start
salt-minion启动之后会发现多了一个minion.d的文件夹
为了更方便的查看树形文件结构我们安装tree命令
yum install tree
启动之后下次关机在启动默认就是启动的了。而且需要使用root用户进行操作。否则会报个错误
提示没有权限写/var/log/salt/master的日志文件
3.修改配置文件
设置master的地址
[root@node1 salt]# cd /etc/salt/
[root@node1 salt]# vim minion
为了方便我们可以把行数调整出来:set nu
修改为master的主机ip这里是node1
需要注意的是上面的:后面是有空格的。
关于minion的id参数说明
下图说的意思是这个id是定义minion,这个id如果不设置,默认会回去你的fqdn名(全称域名),
hostname, 查看主机名
hostname -f 查看FQDN
由于我们两台minion的fqdn名不同(因为我们修改了主机名分别为node1和node2,如果不修改都是localhost,这样就必须要该id了),所以这里的id我们可以不设置
4.使用
master和minion之间的通信:跟ssh是一样的,需要公钥和私钥
这样就建立了一个可信任的通信
master和minion的公钥交互过程(非常重要!)
minion_id:
所以说对于主机名来说,主机名是不能变的。所以说:标准化是自动化运维的起始。
salt第一次启动的时候会创建一个pki的文件夹
minion很聪明,当启动的时候就会把自己的公钥发给master
上图就是minion启动的时候先把公钥发给master暂时放在这里。
同样的master在第一次启动的时候也会在/etc/salt下创建一个master的目录,里面有他自己的公钥和私钥
这个时候master需要验证一下minion发过来的公钥,如果直接使用salt-key命令,出现如下图所示:
这个时候我们想管理这个key,使用salt-key --help
salt-key -a node* 是支持通配符的
在进入到minion的节点(本文是node2),发现多了一个master的公钥
再来看master的目录变化:从pre目录到minions目录了。表示已经同意成功。
这样master可以对minion发送指令了。而minion可以执行指令了。
master和minion之间是通过AES加密算法进行传输的。而且公钥和私钥是非常安全的。
如果要修改id:
1.把minion停了
2.从master把minion删了
3.到minion机器上把pki目录删了
4.把minion_id文件删了
5.改minion的id在启动
检测minion和master之间的通信是不是ok的,如果ok返回true
[root@node1 salt]# salt '*' test.ping
*用单引号引起来,因为*在shell是有特殊含义的,是通配符需要转义,下面三种都行,只要转义就行
salt是命令
*代表匹配所有的目标
test.ping代表是test模块的一个ping方法,就是有一个test.py这个文件里面有ping这个函数
远程执行的功能:
超级命令
[root@node1 salt]# salt '*' cmd.run 'uptime'
cmd是一个模块,run是一个方法
这是一个超级命令,因为他可以执行所有的命令
[root@node1 salt]# salt '*' cmd.run 'w'
[root@node1 salt]# salt '*' cmd.run 'df -h'
在所有节点创建一个目录
[root@node1 salt]# salt '*' cmd.run 'mkdir /tmp/hehe'
查看所有机器的内存
[root@node1 tmp]# salt '*' cmd.run 'free -m'
[root@node1 tmp]# salt '*' cmd.run 'yum install -y httpd'
在安装的过程中可以使用
[root@node1 tmp]# ps aux | grep yum查看安装
minino和master之间是怎么通信的?
网络之间肯定是有端口的。
现在minion上执行查看端口的命令netstat -ntlp
结论:发现minion没有端口,需要能连到master上就可以了,master就能管了
再来看master:
发现有下面两个端口
saltmaster如何和minion进行通信呢?
默认使用zeromq的消息队列,不是一个传统意义上的消息队列,他是一个比较底层的----传输层
saltstack用到zeromq的第一个功能就是发布与订阅,就是一种消息通信的一种模型,好处就是只要是订阅的人,我一说话全能收到。这就是master和minion之间通信快的原因。并行通信。
那么到底是哪个端口呢?
就是4505
[root@node1 tmp]# lsof -ni:4505
这就是消息与订阅,master会建立一个4505的端口,所有的minion都连到4505上。
图片上的39398和47451是随机端口
最后一行和倒数第三行是对应的
如何验证是不是并发是不是串行,可以执行
[root@node1 tmp]# salt '*' cmd.run 'date'
那么返回是如何返回的?4506
用4505发,用4506收。
4506用到了zeromq另一个系统(请求与相应系统)
以前只能用zeromq,现在支持了其他的通信方式,其中有一种就是TCP的
我们可以执行命令然后不管他,原因在于每一个人物salt都会给他产生一个任务的id叫saltid,然后输出的返回结果会默认缓存起来,后面我们拿saltid就能找到返回的内容。这就是异步的。
5.配置管理
语法格式是YAML,和XML类似
YAML也是一种标记语言,格式是多行缩进(跟python类似)
:后面要有空格。除非是以:结尾不需要后面跟空格,否则少空格报错
三个规则:
1.缩进(YAML使用缩进表示层级关系),默认缩进是两个空格,尤其不能使用tab键,用了一定不行
2.:区分类似这种key-value的形式,两种特殊情况冒号后面没有空格,以冒号结尾和表示路径。key:空格value映射为python就是一个字典{'key':'value'}
3.-用来表示列表,比如要装软件包需要装多个就需要列表给列出来。后面要有空格的。
写配置文件
那么配置文件放在哪?放配置文件让他放的地方。
修改master的配置文件
[root@node1 salt]# vim /etc/salt/master
搜索/file_roots
base,dev,prod这三个说明支持环境的,开发,测试,生产,可以放在不同的目录下,你也可以放在一个目录下。
默认是base环境,下面去掉base的注释,因为salt必须要有一个环境,你可以不搞多种环境。
注意:如果file_roots:只有一个,那么base环境是必备的,而且必须叫做base!!!
也可以自定义多个环境,例如下图
下面我们创建这几个目录
[root@node1 ~]# mkdir -p /srv/salt/{base,dev,test,prod}
然后我们重启master,记住所有的只要是改配置文件都需要重启
[root@node1 salt]# service salt-master restart
现在进入/srv/salt/base/目录下
[root@node1 salt]# cd /srv/salt/base/
新建一个web的目录
[root@node1 base]# mkdir web
现在我们要去写一个状态,这个状态必须以.sls结尾,虽然linux里面后缀没什么用,但是在这里必须要以.sls结尾,因为你可以放不是.sls结尾的文件,这样就告诉系统这是一个状态的描述文件。
[root@node1 base]# vim apache.sls
写如下内容
pkg是一个状态模块,这里的模块和上面的远程执行的模块是不一样的。
salt有两种模块,1是远程执行的模块。2是状态管理的模块。看起来完全一样本质上是不同的。
解释:
最顶级的,就是上图的apache-什么的。没有空格就是最顶级的,叫做id,以后统称为id,是唯一标识符,这个id要唯一,在salt所有的状态文件里id要唯一,不能重复!
service是一个状态模块,里面有一个方法叫做running,下面的- name就是你管理的服务名称叫啥 ,上面的- name 是你要装的包的名字叫啥,enable的意思是设置他开机自动启动
这样这个文件写完。salt的会这样进行读取。从上往下依次执行(现在的版本是,以前的不是)。所以比如我要先安装在往指定目录放文件,所以就要先安装在前。
当读取到要安装httpd了。salt会在不同的操作系统下调用不同的安装工具进行安装
centos下默认会调用yum来装
debian下默认会调用apt-get
Fresbsd下会调用他自己的叫什么来着忘记了。
所以说明了pkg.installed是一个通用的方法,这个方法会去匹配操作系统,调用不同的包管理工具进行安装,所以说源码安装是不行的,以为不是包管理工具,所以我们也认为pkg是一个虚拟的模块,因为在不同的系统执行不同的东西。
service.running,保证一个服务正在运行,如果服务没在运行,就要启动起来,所以service也是虚拟的模块。在不同的系统使用不同的命令。例如centos就是servicer xxxxxx
所以用了salt就不用关心底层的操作系统是什么,只要是在他支持的操作系统就行,
现在我们可以理解为-name,-enable相当于running的参数