目录
- 一、Saltstack安装部署
-
- 1.安装配置
- 2.连接测试
- 二、远程执行shell命令
-
- 1.salt命令
- 2.sls文件
- 三、saltstack源码编译安装nginx
- 四、grains详解
- 五、pillar结合jinja模板使用
-
- 1.pillar简介
- 2.Jinja模板
- 3.为httpd服务添加并修改端口
一、Saltstack安装部署
简介:
1、saltstack是一个配置管理系统,能够维护预定义状态的远程节点,它也是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
2、SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
3、saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
Salt的核心功能 :
使命令发送到远程系统是并行的而不是串行的 ;使用安全加密的协议;使用最小最快的网络载荷 ;提供简单的编程接口 。
saltstack基本原理:
1、Saltstack由master和minion构成,master是服务器端,表示一台服务器;minion是客户端,表示有多台服务器。在master上发送命令给符合条件的minion,minion就会执行相应的命令,master和minion之间是通过Zero(消息队列)进行通信的。
2、SaltStack的master端监听4505和4506端口,4505为master和minion认证通信端口,4506为master用来发送命令或接收minion的命令执行返回信息。
3、当客户端启动后,会主动连接master端注册,然后一直保持该TCP连接,而master通过这条TCP连接对客户端进行控制。如果断开连接,master对客户端将不能进行控制。但是,当客户端检查到连接断开后,会定期向master端请求注册连接
Master:控制中心,salt命令运行和资源状态管理端
Minions:需要管理的客户端机器,会主动去连接master端,并从master端得到资源状态,同步资源管理信息
具体步骤如下
- Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc
- salt命令,将cmd.run ls命令从salt.client.LocalClient.cmd_cli发布到master,获取一个Jodid,根据jobid获取命令执行结果。
- master接收到命令后,将要执行的命令发送给客户端minion。
- minion从消息总线上接收到要处理的命令,交给minion._handle_aes处理
- minion._handle_aes发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub方法,将执行结果通过消息总线返回给master
- master接收到客户端返回的结果,调用master._handle_aes方法,将结果写的文件中
- salt.client.LocalClient.cmd_cli通过轮询获取Job执行结果,将结果输出到终端。
实验环境:
server1为saltstack-master端,server2以及server3为saltstack-minion端。
注意:实验之前需要将火墙关闭,否则在做连接的时候master识别不到minion
1.安装配置
在server1上编辑仓库文件,saltstack部署所需要的安装包都在真机共享目录下的3000目录
server1安装salt-master
将server1写好仓库文件传给server2/3
server2及server3安装salt-minion
server1开启服务,查看端口4505和4506是否开启;
SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口(用来发送消息);
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听 4506端口(用来接受消息)。
server2以及server3编辑配置文件,使得minion指向master
server2和server3重启服务
minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信
master端执行命令允许minion连接;
salt-key -L:显示所有minion的认证信息;
salt-key -A :接受所有 Unaccepted Keys 状态的minion的认证信息;
salt-key -a server2/server3 :接受指定节点的认证信息。
2.连接测试
master端测试与minion端的连接;
下载lsoff查看端口,lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件
默认4505端口开启并指向minion端,连接方式为established
注意:monion端修改主机名后,需要删除/etc/salt/minion_id ,否则master端会一直显示之前的主机名;
当master能够ping通monion之后,查看配置文件生成的key值,两边是对应一致的(server端给minion端的公钥)
查看minion端给server端的公钥
master端安装python-setproctitle, 通过ps ax查看具体进程信息
二、远程执行shell命令
1.salt命令
使用cmd.run模块查看远程主机系统名和系统信息
使用pkg模块给server2安装httpd服务
停止server2的httpd服务:stop
查看/etc/salt/master文件,可以看到saltstack的base目录是/srv/salt
因此我们手动创建base目录,编写模块文件(查看挂载情况);
salt server2 saltutil.sync_modules:同步模块
运行模块
server2安装tree,可以看到出现my_disk.py,已成功同步
2.sls文件
YAML语法:
Salt 状态统的核心是SLS,或者叫SaLt State 文件。SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。sls文件使用的是YAML语法,注意以下规则:
(1)缩进:Salt需要每个缩进级别由两个空格组成,不要使用tabs;
(2)冒号:字典的keys在YAML中的表现形式是一个以冒号结尾的字符串;
(3)短横杠:想要表示列表项,使用一个短横杠加一个空格。
在/srv/salt目录中创建一个sls文件,httpd: ID声明;pkg: 状态声明 ;installed :函数声明
指定server2执行.sls文件,sls文件以”.sls”后缀结尾,但在调用时不用写此后缀。
在base下建立目录apache,创建一个.sls文件;
在saltsatack中,base路径就是/srv/salt/,apache.sls在base下可以直接识别,如下放到子目录下无法直接识别,需要写具体路径。
但如果把apache.sls改名为init.sls文件,saltsatack会自动查找init文件,无需写多层子目录
/srv/salt/apache.sls 和 /srv/salt/apache/init.sls,执行时优先选择外部sls文件
继续修改init.sls文件,赋予更多功能:
模块名称叫httpd,第一部分是安装httpd和php;第二部分是开启httpd服务
运行成功
缓存位置:var/cache/master/jobs/
master端的数据已经同步到了minion端;
minion端会把master端/srv/salt目录下的所有配置管理文件同步到本地的
/var/cache/salt/minion/files/base目录
将server2的httpd服务的配置文件传给server1
继续编辑init.sls文件,第二个部分是把source位置的配置文件发到目的地,这样便于后续对minion端的服务的配置进行修改;
指定server3执行文件,安装httpd服务
watch表示:监控apache模块下的file(即第二部分)两个文件是否一致,如果不一致,重启httpd;
此时修改apache目录下httpd配置文件中的httpd端口为8080
执行完毕,发现成功把server3的httpd端口修改为8080
加入reload参数,重新加载配置文件(如果不加reload: True,默认为restart);
此时把端口又改为80
成功执行
server3的httpd端口被修改成功
三、saltstack源码编译安装nginx
将真机的nginx安装包传给server1
server1创建一个目录专门存放创建nginx的文件
创建init.sls文件,配置文件内容如下;
file.managed:
- name: /mnt/nginx-1.20.1.tar.gz : 指定server2解压nginx包的地址;
- source: salt://nginx/nginx-1.20.1.tar.gz :需要本机nginx目录下有安装包;
- creates: /usr/local/nginx :检测是否已经安装,如果安装了,则不重复执行、
执行成功
server2上查看进程
将真机的nginx.service传给server1,用来修改配置
接下来开启nginx服务,创建service.sls文件来修改配置(编写nginx启动模块);
首先调用ngnix模块,把init.sls文件调用来安装;
建立ngnix用户,设定无法登陆,把配置文件和service推到minion端;
执行开启动作,监控/usr/local/nginx/conf/nginx.conf和master端的文件,如果不一致,重启服务。
此时也需要把server2上的nginx配置文件放在 server1的nginx目录下
把传过来的nginx配置文件修改一下
worker_processes:设定为auto时,nginx会自动检测当前主机的cpu核心数,并启动对应数量的worker进程;
worker_connections:单个工作进程可以允许同时建立外部连接的数量,此时限制用户的最大线程数和文件数为65535
执行推送,启动server2的nginx服务
推送成功
执行curl server2 进行测试,成功出现nginx测试页
四、grains详解
简介 :
Grains是SaltStack的一个组件,存放在SaltStack的minion端。 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当 minion重启时才会进行数据的更新。由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作CMDB; 在target中使用,匹配minion; 在state系统中使用,配置管理模块。
信息查询 :执行salt server2 grains.ls ,可以看到server2的静态数据列表,包括ip,主机名等等
查看每一项的值
指定查看ipv4这一项静态数据
自定义grains项:三种添加角色的方式。两种在minion端,一种在master端
方法一:minion端,修改主配;
给server3添加了角色apache,修改完毕要重启salt-minion,否则数据不会更新
查看角色
方法二:在server2上添加文件,在/etc/salt/grains中定义
salt server3 saltutil.sync_grains:同步数据
salt server3 grains.item roles:查询自定义项
查看,minion端的所有角色
方法三:编写grains模块,在salt-master端创建_grains目录:
同步grains到minion端 ,执行hello可以看到world
在server2,server3上查看到同步过来的文件,目录
编辑top.sls文件,不同节点执行不同角色策略;
执行salt ‘*’ state.highstate,可以看到成功给不同server安装了不同服务
继续编辑top.sls文件,表示当角色为apache时,去grain中匹配相应的主机,然后安装apache;
当角色为nginx时,去grain中匹配相应的主机,然后安装nginx并开启;
可以直接用大写G定位角色,在target中匹配minion;
五、pillar结合jinja模板使用
1.pillar简介
pillar和grains一样也是一个数据系统,但是应用场景不同。 pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用 户名密码等),而且可以指定某一个minion才可以看到对应的信息。 pillar更加适合在配置管理中运用。
在srv目录下建立pillar目录,编辑pkgs.sls和top.sls文件,自定义pillar项
salt ‘’ pillar.items salt:查询pillar数据;当主机名是server2时,package是httpd,当主机名是server3时,package是nginx
查具体pillar变量时,必须先刷新pillar数据,再执行salt '’ pillar.item roles;
也可以命令行中用参数匹配,显示package是nginx的主机名
2.Jinja模板
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。通过jinja模板可以为不同服务器定义各自的变量。两种分隔符: {% … %} 和 {
{ … }},前者用于执行诸如 for 循环 或 赋值的语句,后者把表达式的结果打印到模板上。
由于之前定义的pillar目录中的pkgs.sls文件,server2的package是nginx,因此server2不能推送成功(httpd和nginx端口冲突)
Jinja模板最基本的用法是使用控制结构包装条件,编写test文件进行测试
推送完毕,查看server2和server3的/mnt目录下文件的内容
3.为httpd服务添加并修改端口
修改pkgs.sls文件,设定server2的port为80,server3的port为8080(package都为httpd)
方法一:Jinja在普通文件的使用:
修改http的配置文件,此时对于server2来说,http_port就是8080;对于server3来说,http_port就是80;
修改init.sls文件,主要是针对/etc/httpd/conf/httpd.conf时,加入jinja模板,并把port这个变量赋予http_port
查询pillar数据
进行推送(指定所有minion主机执行)
执行成功
查看minion的httpd端口,可以看到修改成功
如果我们还想加入对应的ip,继续修改相关文件
进行推送
查看推送过程
真机访问,进行测试,可以看到minion主机的http发布页面
方法二:import方式,可在state文件之间共享
将http_host注释
修改server1apache目录下的httpd配置文件的端口
文件最上方内容如下(导入模板文件:lib.sls)
设定http_port表示:8080
进行推送
此时server2/3的httpd服务端口又被改为8080
访问成功