saltstack安装及使用笔记(史上最全,不全不要钱)

版权声明: https://blog.csdn.net/JENREY/article/details/83303593

说明:本文使用的是两个节点的集群,分别为node1和node2

配合如下帖子进行学习:

centos下按安装python3和2共存

使用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的参数

猜你喜欢

转载自blog.csdn.net/JENREY/article/details/83303593