企业 Saltstack安装配置及远程推送

Saltstack

概述

Salt 是:
一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行);
一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据;
开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单;
salt在几乎不改动配置的情况下就可以工作,也可以调整从而满足特定的需求。

Salt的核心功能:

  • 使命令发送到远程系统是并行的而不是串行的
  • 使用安全加密的协议
  • 使用最小最快的网络载荷
  • 提供简单的编程接口

Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。

通信机制

SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口。

安装与配置

安装

可以通过访问saltstack官网去访问和学习使用:https://www.saltstack.com/
saltstack是拥有中文文档的可以访问:http://docs.saltstack.cn/

安装分为两部分,测试使用三台一台为master节点,其它两台为minion节点。

设置官方YUM仓库安装进行

master节点操作:

[root@server1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm

[root@server1 ~]# yum install -y salt-master		#安装master节点
[root@server1 ~]# systemctl enable --now salt-master.service 	#启动并设为开机自启

minion节点操作:
server2

[root@server2 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
[root@server2 ~]# yum install -y salt-minion
[root@server2 ~]# vim /etc/salt/minion	#编辑minion 的配置文件
master: 172.25.254.1	#更改master后面的地址为master节点的ip
#注意这是python写的程序所以写配置时:后有空格,否则会报错
[root@server2 ~]# systemctl enable --now salt-minion.service 	#启动并开机自启

server3进行同样操作配置开启minion

如果访问官方的仓库很慢的话,也可以去使用阿里云的仓库安装就会快得多

# yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
配置

安装完成后,因为刚才开启了minion节点,并且设置master指向server1,所以在server1上我们就可以看到两个minion上看到的信号,注意设置地址解析
这里看到的server2和server3是还未被允许的

[root@server1 ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server2
server3
Rejected Keys:

可以查看一下4506端口,展示的信息显示是从server2和server3上给server1在发送信息,但是4505端口暂时是没有任何信息的

[root@server1 ~]# lsof -i :4506
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 3550 root   23u  IPv4  32689      0t0  TCP *:4506 (LISTEN)
[Bqsalt-mast 3550 root   30u  IPv4  36712      0t0  TCP server1:4506->172.25.254.2:37596 (ESTABLISHED)
salt-mast 3550 root   31u  IPv4  37053      0t0  TCP server1:4506->172.25.254.3:38790 (ESTABLISHED)

[root@server1 ~]# lsof -i :4505
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 3543 root   15u  IPv4  32640      0t0  TCP *:4505 (LISTEN)

然后来操作允许连接这两台minion节点

[root@server1 ~]# salt-key -a server2	#可以用参数-a指定允许指定节点
[root@server1 ~]# salt-key -A	#也可以-A指定允许所有要连接的节点,删除也是一样,-d或-D,删除指定或全部
[root@server1 ~]# salt-key -L
Accepted Keys:
server2
server3
Denied Keys:
Unaccepted Keys:
Rejected Keys:

测试连接的效果

[root@server1 ~]# salt '*' test.ping		#'*'表示匹配所有节点
server3:
    True	#表示连接正常
server2:
    True
[root@server1 ~]# lsof -i :4505	#4505的连接信息也有了
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 3543 root   15u  IPv4  32640      0t0  TCP *:4505 (LISTEN)
salt-mast 3543 root   17u  IPv4  39059      0t0  TCP server1:4505->172.25.254.2:60548 (ESTABLISHED)
salt-mast 3543 root   18u  IPv4  39131      0t0  TCP server1:4505->172.25.254.3:42180 (ESTABLISHED)

注意:当minion节点连接master节点后,在minion节点会生成/etc/salt/minion_id文件,里面记录的了你当前的主机名,如果自行更改了主机名,就需要先在master节点删除之前的连接,再删除/etc/salt/minion_id,然后重启服务再去连接。


Saltstack远程执行操作

远程指令操作

Salt命令由三个主要部分构成:

salt '<target>' <function> [arguments]
target:用来指定哪些minion, 默认的规则是使用glob匹配minion id。
-也可以使用正则表达式批量匹配主机:salt -E ‘server[1-3]’ test.ping
-也可以指定列表: salt -L ‘server2,server3’ test.ping
funcation是module提供的功能,Salt内置了大量有效的functions. 如cmd、pkg、service等模块
-模块的详细内容和用法可以查看http://docs.saltstack.cn/ref/modules/all/index.html
arguments空格来界定参数,如salt ‘server2’ sys.doc pkg

测试:
使用master节点直接去操作minion节点

[root@server1 ~]# salt server2 cmd.run df	#再server2上执行df命令
server2:
    Filesystem            1K-blocks    Used Available Use% Mounted on
    /dev/mapper/rhel-root   8910848 1251164   7659684  15% /
    devtmpfs                 495380       0    495380   0% /dev
    tmpfs                    507448      40    507408   1% /dev/shm
    tmpfs                    507448   13280    494168   3% /run
    tmpfs                    507448       0    507448   0% /sys/fs/cgroup
    /dev/vda1                508580  128004    380576  26% /boot
    tmpfs                    101492       0    101492   0% /run/user/0
编写远程执行模块文件来控制minion

编写前需要开启master配置里的默认基础目录路径

[root@server1 ~]# vim /etc/salt/master
file_roots:   
  base:
    - /srv/salt/	#开启后基础路径就在/srv/salt/
[root@server1 ~]# systemctl restart salt-master.service 

[root@server1 ~]# mkdir /srv/salt	#创建这个目录

然后就可以测试编辑执行文件
根据官方文档我们也可以编写自定义的模块来操作
在这里插入图片描述
首先在/srv/salt/创建目录 _modules ,在此目录里写一个py执行文件

[root@server1 salt]# mkdir /srv/salt/_modules

[root@server1 salt]# vim /srv/salt/_modules/disk.py 
def df():
    return __salt__['cmd.run']('df -h')

编写完成后需要将自定义的模块同步给其他的nimion节点

[root@server1 salt]# salt server2 saltutil.sync_modules
server2:	#同步给server2
    - modules.disk

可以在server2的salt数据储存目录里看到master节点同步的模块就储存在这里,内容都是一样的,所以当在master调用这个模块时相当于就是在执行nimion节点里的这个文件内容
[root@server2 ~]# cat /var/cache/salt/minion/files/base/_modules/disk.py 
def df():
    return __salt__['cmd.run']('df -h')

调用模块测试

[root@server1 salt]# salt server2 disk.df
server2:
    Filesystem             Size  Used Avail Use% Mounted on
    /dev/mapper/rhel-root  8.5G  1.2G  7.4G  15% /
    devtmpfs               484M     0  484M   0% /dev
    tmpfs                  496M   80K  496M   1% /dev/shm
    tmpfs                  496M   13M  483M   3% /run
    tmpfs                  496M     0  496M   0% /sys/fs/cgroup
    /dev/vda1              497M  126M  372M  26% /boot
    tmpfs                  100M     0  100M   0% /run/user/0

对于系统自带的模块使用,直接编写 .sls结尾的文件就可以,这里需要注意的就是编辑的语法规则

  • 规则一: 缩进
    Salt需要每个缩进级别由两个空格组成,不要使用tabs。
  • 规则二: 冒号
    字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
    my_key: my_value
  • 规则三: 短横杠
    想要表示列表项,使用一个短横杠加一个空格。
    - list_value_one
    - list_value_two

编写sls文件执行模块

[root@server1 salt]# vim apache.sls
httpd:		#ID声明
  pkg:		#状态声明
    - installed	#函数声明

也可以写成:
httpd:
  pkg.installed

推送执行文件给server2

[root@server1 salt]# salt server2 state.sls apache	#这里的apache就是apache.sls,不需要特殊指定路径,默认就是从/srv/salt/开始

[root@server2 ~]# ls /var/cache/salt/minion/files/base/	#在server1上执行推送时,是将编写的sls文件推送给server2上然后再去执行这个文件内容
apache.sls  _modules

执行成功后会有显示成功或失败
在这里插入图片描述

还有一种方式可以将所有关于某个执行目的的文件都放在一个目录里,然后直接去这个目录下的文件来执行.
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身,所以我们将apache.sls放在apache目录下改名为apache/init.sls

[root@server1 salt]# mkdir apache
[root@server1 salt]# mv apache.sls apache/init.sls 

[root@server1 salt]# salt server2 state.sls apache	#推送时执行apache就会自动指定到apache/init.sls执行

注意: 如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.

模块使用

给server2推送安装httpd和php,并且设置启动httpd和开机自启

[root@server1 salt]# vim apache/init.sls 
web:
  pkg.installed:
    - pkgs:
      - httpd
      - php

  service.running:
    - name: httpd
    - enable: True

[root@server1 salt]# salt server2 state.sls apache

除了推送安装服务,还可以去推送文件,入推送更改httpd的配置文件内容

从server2里取来http的配置文件
[root@server1 salt]# scp server2:/etc/httpd/conf/httpd.conf /srv/salt/apache/
[root@server1 salt]# vim apache/httpd.conf #编辑配置文件
Listen 8888	#更改端口为8888,原本是80

然后更改推送文件

[root@server1 salt]# vim apache/init.sls 
web:
  pkg.installed:
    - pkgs:
      - httpd
      - php

  file.managed:
    - source: salt://apache/httpd.conf	#文件来源就是从salt基础路径下找apache/httpd.conf	
    - name: /etc/httpd/conf/httpd.conf	#m目标路径是http的配置文件路径

  service.running:
    - name: httpd
    - enable: True
    - watch:		#监控
      - file: web	#监控的内容是在web声明下的文件,每个声明下只能存在一个状态声明,不能出现两次

推送执行

[root@server1 salt]# salt server2 state.sls apache

[root@server2 ~]# netstat -ntlp	#server2里的端口改为了8888
tcp6       0      0 :::8888                 :::*                    LISTEN      4463/httpd          
远程执行源码安装操作

给server2上配置了apache,在server3上来编译安装nginx

[root@server1 salt]# mkdir -p /srv/salt/nginx/files	#建立目录将nginx源码包放在里面

[root@server1 salt]# vim /srv/salt/nginx/install.sls
nginx:
  pkg.installed:	#安装编译时的依赖性
    - pkgs:
      - openssl-devel
      - gcc
      - pcre-devel

  file.managed:	#传送源码包
    - source: salt://nginx/files/nginx-1.18.0.tar.gz
    - name: /mnt/nginx-1.18.0.tar.gz

  cmd.run:	#执行解压编译等工作
    - name: cd /mnt && tar xfz nginx-1.18.0.tar.gz && cd nginx-1.18.0 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
    - creates: /usr/local/nginx	#确认文件是否存在,存在的话就不会在创建编译

nginx-service:	
  file.managed:	#添加nginx启动脚本
    - source: salt://nginx/files/nginx.service
    - name: /usr/lib/systemd/system/nginx.service

  service.running:	#运行nginx
    - name: nginx
    - enable: True
    - reload: True

启动脚本是在:https://www.nginx.com/resources/wiki/start/topics/examples/systemd/ 网址里的模板使用就可以

[root@server1 salt]# vim /srv/salt/nginx/files/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid	
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

如果需要推送更改配置文件就和apache的方式一样,推送配置文件,在启动项里添加watch监控变化

执行推送,没有问题就可以在server3上看到启动了

[root@server1 salt]# salt server3 state.sls nginx.install
高级推送

可以在一个sls文件里指定多个minion节点的任务进行批量推送

[root@server1 salt]# vim /srv/salt/top.sls	#在salt基础目录下创建top文件
base:
  'server2':		#一台节点下可以并列指定多个任务模块
    - apache	#让server2执行apache目录里的默认文件任务
  'server3':
    - nginx.install	#让server3执行nginx里的install.sls文件
 
[root@server1 salt]# salt '*' state.highstate 	#高级推送

这样操作会在server2和server3里分别执行指定的模块任务,互不干扰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Howei__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值