目录

  • 一、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目录

saltstack用什么软件打开 saltstack安装部署_服务器


server1安装salt-master

saltstack用什么软件打开 saltstack安装部署_服务器_02


将server1写好仓库文件传给server2/3

saltstack用什么软件打开 saltstack安装部署_nginx_03


server2及server3安装salt-minion

saltstack用什么软件打开 saltstack安装部署_运维_04


saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_05


server1开启服务,查看端口4505和4506是否开启;

SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口(用来发送消息);

Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听 4506端口(用来接受消息)。

saltstack用什么软件打开 saltstack安装部署_网络_06


server2以及server3编辑配置文件,使得minion指向master

saltstack用什么软件打开 saltstack安装部署_网络_07


saltstack用什么软件打开 saltstack安装部署_网络_08


server2和server3重启服务

saltstack用什么软件打开 saltstack安装部署_nginx_09


saltstack用什么软件打开 saltstack安装部署_nginx_10

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 :接受指定节点的认证信息。

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_11

2.连接测试

master端测试与minion端的连接;

下载lsoff查看端口,lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件

saltstack用什么软件打开 saltstack安装部署_nginx_12


默认4505端口开启并指向minion端,连接方式为established

saltstack用什么软件打开 saltstack安装部署_nginx_13


注意:monion端修改主机名后,需要删除/etc/salt/minion_id ,否则master端会一直显示之前的主机名;

当master能够ping通monion之后,查看配置文件生成的key值,两边是对应一致的(server端给minion端的公钥)

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_14


saltstack用什么软件打开 saltstack安装部署_网络_15


查看minion端给server端的公钥

saltstack用什么软件打开 saltstack安装部署_运维_16


saltstack用什么软件打开 saltstack安装部署_运维_17


saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_18


master端安装python-setproctitle, 通过ps ax查看具体进程信息

saltstack用什么软件打开 saltstack安装部署_网络_19


saltstack用什么软件打开 saltstack安装部署_服务器_20

二、远程执行shell命令

1.salt命令

saltstack用什么软件打开 saltstack安装部署_服务器_21


saltstack用什么软件打开 saltstack安装部署_服务器_22


使用cmd.run模块查看远程主机系统名和系统信息

saltstack用什么软件打开 saltstack安装部署_网络_23


使用pkg模块给server2安装httpd服务

saltstack用什么软件打开 saltstack安装部署_服务器_24


停止server2的httpd服务:stop

saltstack用什么软件打开 saltstack安装部署_nginx_25


查看/etc/salt/master文件,可以看到saltstack的base目录是/srv/salt

saltstack用什么软件打开 saltstack安装部署_运维_26


saltstack用什么软件打开 saltstack安装部署_nginx_27


因此我们手动创建base目录,编写模块文件(查看挂载情况);

salt server2 saltutil.sync_modules:同步模块

saltstack用什么软件打开 saltstack安装部署_运维_28


运行模块

saltstack用什么软件打开 saltstack安装部署_服务器_29


server2安装tree,可以看到出现my_disk.py,已成功同步

saltstack用什么软件打开 saltstack安装部署_网络_30

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”后缀结尾,但在调用时不用写此后缀。

saltstack用什么软件打开 saltstack安装部署_nginx_31


在base下建立目录apache,创建一个.sls文件;

在saltsatack中,base路径就是/srv/salt/,apache.sls在base下可以直接识别,如下放到子目录下无法直接识别,需要写具体路径。

saltstack用什么软件打开 saltstack安装部署_网络_32


但如果把apache.sls改名为init.sls文件,saltsatack会自动查找init文件,无需写多层子目录

saltstack用什么软件打开 saltstack安装部署_nginx_33


/srv/salt/apache.sls 和 /srv/salt/apache/init.sls,执行时优先选择外部sls文件

saltstack用什么软件打开 saltstack安装部署_运维_34


继续修改init.sls文件,赋予更多功能:

模块名称叫httpd,第一部分是安装httpd和php;第二部分是开启httpd服务

saltstack用什么软件打开 saltstack安装部署_nginx_35


运行成功

saltstack用什么软件打开 saltstack安装部署_网络_36


缓存位置:var/cache/master/jobs/

saltstack用什么软件打开 saltstack安装部署_运维_37


saltstack用什么软件打开 saltstack安装部署_网络_38


master端的数据已经同步到了minion端;

minion端会把master端/srv/salt目录下的所有配置管理文件同步到本地的

/var/cache/salt/minion/files/base目录

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_39


saltstack用什么软件打开 saltstack安装部署_服务器_40


将server2的httpd服务的配置文件传给server1

saltstack用什么软件打开 saltstack安装部署_nginx_41


继续编辑init.sls文件,第二个部分是把source位置的配置文件发到目的地,这样便于后续对minion端的服务的配置进行修改;

指定server3执行文件,安装httpd服务

saltstack用什么软件打开 saltstack安装部署_服务器_42


watch表示:监控apache模块下的file(即第二部分)两个文件是否一致,如果不一致,重启httpd;

此时修改apache目录下httpd配置文件中的httpd端口为8080

saltstack用什么软件打开 saltstack安装部署_网络_43


执行完毕,发现成功把server3的httpd端口修改为8080

saltstack用什么软件打开 saltstack安装部署_网络_44


加入reload参数,重新加载配置文件(如果不加reload: True,默认为restart);

此时把端口又改为80

saltstack用什么软件打开 saltstack安装部署_服务器_45


成功执行

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_46


server3的httpd端口被修改成功

saltstack用什么软件打开 saltstack安装部署_服务器_47

三、saltstack源码编译安装nginx

将真机的nginx安装包传给server1

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_48


server1创建一个目录专门存放创建nginx的文件

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_49


创建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目录下

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_50


把传过来的nginx配置文件修改一下

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_51


worker_processes:设定为auto时,nginx会自动检测当前主机的cpu核心数,并启动对应数量的worker进程;

worker_connections:单个工作进程可以允许同时建立外部连接的数量,此时限制用户的最大线程数和文件数为65535

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_52


执行推送,启动server2的nginx服务

saltstack用什么软件打开 saltstack安装部署_网络_53


推送成功

saltstack用什么软件打开 saltstack安装部署_nginx_54


执行curl server2 进行测试,成功出现nginx测试页

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_55

四、grains详解

简介 :

Grains是SaltStack的一个组件,存放在SaltStack的minion端。 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当 minion重启时才会进行数据的更新。由于grains是静态数据,因此不推荐经常去修改它。

应用场景:

信息查询,可用作CMDB; 在target中使用,匹配minion; 在state系统中使用,配置管理模块。

信息查询 :执行salt server2 grains.ls ,可以看到server2的静态数据列表,包括ip,主机名等等

saltstack用什么软件打开 saltstack安装部署_服务器_56


查看每一项的值

saltstack用什么软件打开 saltstack安装部署_nginx_57


指定查看ipv4这一项静态数据

saltstack用什么软件打开 saltstack安装部署_运维_58


自定义grains项:三种添加角色的方式。两种在minion端,一种在master端

方法一:minion端,修改主配;

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_59


saltstack用什么软件打开 saltstack安装部署_nginx_60


给server3添加了角色apache,修改完毕要重启salt-minion,否则数据不会更新

saltstack用什么软件打开 saltstack安装部署_网络_61


查看角色

saltstack用什么软件打开 saltstack安装部署_运维_62


方法二:在server2上添加文件,在/etc/salt/grains中定义

saltstack用什么软件打开 saltstack安装部署_服务器_63


salt server3 saltutil.sync_grains:同步数据

salt server3 grains.item roles:查询自定义项

saltstack用什么软件打开 saltstack安装部署_运维_64


查看,minion端的所有角色

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_65


方法三:编写grains模块,在salt-master端创建_grains目录:

saltstack用什么软件打开 saltstack安装部署_nginx_66

同步grains到minion端 ,执行hello可以看到world

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_67


在server2,server3上查看到同步过来的文件,目录

saltstack用什么软件打开 saltstack安装部署_服务器_68


saltstack用什么软件打开 saltstack安装部署_网络_69


编辑top.sls文件,不同节点执行不同角色策略;

执行salt ‘*’ state.highstate,可以看到成功给不同server安装了不同服务

saltstack用什么软件打开 saltstack安装部署_运维_70


继续编辑top.sls文件,表示当角色为apache时,去grain中匹配相应的主机,然后安装apache;

当角色为nginx时,去grain中匹配相应的主机,然后安装nginx并开启;

可以直接用大写G定位角色,在target中匹配minion;

saltstack用什么软件打开 saltstack安装部署_运维_71

五、pillar结合jinja模板使用

1.pillar简介

pillar和grains一样也是一个数据系统,但是应用场景不同。 pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用 户名密码等),而且可以指定某一个minion才可以看到对应的信息。 pillar更加适合在配置管理中运用。

在srv目录下建立pillar目录,编辑pkgs.sls和top.sls文件,自定义pillar项

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_72


salt ‘’ pillar.items salt:查询pillar数据;当主机名是server2时,package是httpd,当主机名是server3时,package是nginx

saltstack用什么软件打开 saltstack安装部署_nginx_73


查具体pillar变量时,必须先刷新pillar数据,再执行salt '
’ pillar.item roles;

也可以命令行中用参数匹配,显示package是nginx的主机名

saltstack用什么软件打开 saltstack安装部署_网络_74


saltstack用什么软件打开 saltstack安装部署_运维_75

2.Jinja模板

Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。通过jinja模板可以为不同服务器定义各自的变量。两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或 赋值的语句,后者把表达式的结果打印到模板上。

由于之前定义的pillar目录中的pkgs.sls文件,server2的package是nginx,因此server2不能推送成功(httpd和nginx端口冲突)

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_76


saltstack用什么软件打开 saltstack安装部署_运维_77


Jinja模板最基本的用法是使用控制结构包装条件,编写test文件进行测试

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_78


推送完毕,查看server2和server3的/mnt目录下文件的内容

saltstack用什么软件打开 saltstack安装部署_nginx_79


saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_80

3.为httpd服务添加并修改端口

修改pkgs.sls文件,设定server2的port为80,server3的port为8080(package都为httpd)

saltstack用什么软件打开 saltstack安装部署_运维_81


方法一:Jinja在普通文件的使用:

修改http的配置文件,此时对于server2来说,http_port就是8080;对于server3来说,http_port就是80;

修改init.sls文件,主要是针对/etc/httpd/conf/httpd.conf时,加入jinja模板,并把port这个变量赋予http_port

saltstack用什么软件打开 saltstack安装部署_nginx_82


查询pillar数据

saltstack用什么软件打开 saltstack安装部署_网络_83


进行推送(指定所有minion主机执行)

saltstack用什么软件打开 saltstack安装部署_运维_84


执行成功

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_85


查看minion的httpd端口,可以看到修改成功

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_86


saltstack用什么软件打开 saltstack安装部署_nginx_87


如果我们还想加入对应的ip,继续修改相关文件

saltstack用什么软件打开 saltstack安装部署_服务器_88


进行推送

saltstack用什么软件打开 saltstack安装部署_nginx_89


查看推送过程

saltstack用什么软件打开 saltstack安装部署_运维_90


saltstack用什么软件打开 saltstack安装部署_nginx_91


真机访问,进行测试,可以看到minion主机的http发布页面

saltstack用什么软件打开 saltstack安装部署_运维_92


方法二:import方式,可在state文件之间共享

将http_host注释

saltstack用什么软件打开 saltstack安装部署_服务器_93


修改server1apache目录下的httpd配置文件的端口

saltstack用什么软件打开 saltstack安装部署_服务器_94


文件最上方内容如下(导入模板文件:lib.sls)

saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_95


设定http_port表示:8080

saltstack用什么软件打开 saltstack安装部署_服务器_96


进行推送

saltstack用什么软件打开 saltstack安装部署_nginx_97


此时server2/3的httpd服务端口又被改为8080

saltstack用什么软件打开 saltstack安装部署_运维_98


saltstack用什么软件打开 saltstack安装部署_saltstack用什么软件打开_99


访问成功

saltstack用什么软件打开 saltstack安装部署_nginx_100