你的位置:首页 > 操作系统

[操作系统]SaltStack快速了解


1. 介绍

基于Python开发的一套C/S架构配置管理工具,底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理。

2. 环境准备

2.1 安装

本文采用salt-bootstrap方式安装。salt-bootstrap是SaltStack的一个单独项目,主要用于解决多平台一键部署SaltStack环境

下载安装脚本

curl -L https://bootstrap.saltstack.com -o install_salt.sh

安装salt-master

sh install_salt.sh -M #安装最新stable版本的salt-master和salt-minion

安装salt-minion

sh install_salt.sh #安装最新stable版本的salt-minion

2.2 配置

(1) 所有master和minion节点配置hosts文件(生产环境使用DNS)

172.16.37.23 node1

172.16.37.35 node2

172.16.37.41 node3

172.16.37.39 node4

172.16.37.43 node5

 

(2) Master防火墙规则

salt master启动后默认会监听两个端口:

4505/tcp,publish_port,提供远程执行命令发送功能

4506/tcp,ret_port,用于文件服务、认证、结果搜集等功能接口

 

(3) Minion配置

修改/etc/salt/minion

a) 修改minion的master

找到如下行’#master: salt’,取消注释,修改为实际master主机名

master: node1

b) 为minion指定id

找到如下行’#id:’,取消注释,并设置为minion的主机名(不一定要和主机名一样),如

id: node2

 

重启salt master和salt minion

Master

systemctl restart salt-master salt-minion

Minion

systemctl restart salt-minion

 

2.3 证书管理

SaltStack使用SSL签证的方式进行安全认证、通信加密

Minion第一次启动后会在/etc/salt/pki/minion生成公钥秘钥,然后将公钥发送给Master,等待Master接受

Master为其签发证书后才能与该Minion建立通信

 

相关命令

查看证书签发情况

salt-key -L

为node2签发证书

salt-key -a node2

为所有等待接受的Minion签发证书

salt-key -A

3. 远程执行命令

salt ‘目标机器’ 函数 [参数](详细用法见’salt -h’)

在所有Minion远程执行test模块中的ping函数(/usr/lib/python2.7/site-packages/salt/modules/test.py,该函数直接返回True)

salt ‘*’ test.ping

查看函数说明

salt ‘node2’ sys.doc test.ping

 

远程命令执行模块cmd(/usr/lib/python2.7/site-packages/salt/modules/cmdmod.py)

salt ‘*’ cmd.run “hostname”

 

列出cmd模块的函数

salt 'node2' sys.list_functions cmd

 

查看函数说明

salt 'node2' sys.doc cmd.run

 

原理都是在匹配的目标机器执行python模块中的函数,可以编写自己的python模块推送到Minion上按上述方式执行

4. 状态系统

4.1 状态系统说明

通过SLS(SaLt State)文件描述Minion要达到什么状态,底层由SaltStack的状态模块保证Minion处于该状态

以安装httpd服务为例,采用执行远程命令的方式如下:

salt ‘node2’ pkg.install httpd

 

而采用状态文件进行描述如下:

然后通过状态模块确保目标机器中httpd服务处于pkg.installed的状态:

salt ‘node2’ state.apply apache

两者都达到了在目标机器部署httpd服务的目的,但是执行远程命令的方式每次都会执行相同的逻辑和指令,而状态文件则是根据描述让Minion处于指定状态,当前状态和所需状态不同时才执行相关操作

执行远程命令的方式属于执行模块。查看所有执行模块

salt 'node2' sys.list_modules

查看pkg执行模块中的所有函数

salt 'node2' sys.list_functions pkg

状态文件的方式属于状态模块。查看所有状态模块

salt 'node2' sys.list_state_modules

查看pkg状态模块中的所有函数

salt 'node2' sys.list_state_functions pkg

 

4.2 Highstate

highstate通过top.sls文件作为入口对模块和主机进行管理

使用highstate,可以用top.sls组织多个状态文件,对模块进行拆分和复用,实现多环境的配置和管理等

 

如下举例对highstate进行说明

file_roots默认只有一个base环境,位于/srv/salt,top.sls就在base环境的根目录下。目录结构如下:

 

在top.sls中指定状态文件或状态文件子目录

 

top.sls中引用了myapp,它会按如下顺序引用:如果存在myapp.sls则引用myapp.sls,如果不存在,则引用myapp目录下的init.sls。我们采用子目录的方式对目录进行规划

 

在myapp/init.sls中include与myapp相关的各个状态文件(可以把状态文件拆分成多个,在此处include)

 

.myconf对应与init.sls同目录的myconf.sls状态文件,在该文件中对Minion的/tmp/myconf.txt状态进行描述

 

在files/myconf.txt中写入任意内容,执行如下命令让Minion处于描述的状态

salt 'node2' state.apply

 

参考:

(1) https://docs.saltstack.com/en/latest/topics/tutorials/states_pt1.html

(2) https://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html

5. Grains

SaltStack中记录Minion静态信息的组件(OS类型、CPU核数、内存大小、IP地址等),在Minion启动时采集汇报给Master,因此Grains通常存储的是静态、不常变化的数据,存储在Minion本地

Minion可以操作自己的Grains数据(增删改)

 

可通过如下命令查看每项Grains数据:

salt 'node2' grains.items

6. Pillar

与Grains类似,但Pillar存储的是相对经常变化的数据,存储在Master本地

Minion只能查看自己的Pillar数据

 

可通过如下命令查看每项Pillar数据:

salt 'node2' pillar.items

7. Jinja

Python模板引擎,通过与Grains和Pillar的结合定义动态的配置

比如,不同的Minion通过fqdn可以获取各自不同的主机名

 

接下来我们可以通过Grains创建动态配置,让每个目标机器中的/tmp/myconf.txt显示自己的主机名

修改状态文件中的file描述,指定template为jinja

#cat dev/myapp/myconf.sls

conf1:

  file.managed:

    - name: /tmp/myconf.txt

    - source: salt://nginx/files/myconf.txt

    - user: root

    - group: root

    - mode: 644

    - template: jinja

 

在source对应的文件中通过 {{ grains[‘ITEM’] }} 的方式引用Grains数据

#cat dev/myapp/files/myconf.txt

[BASE] /srv/salt/dev

My hostname is {{ grains['fqdn'] }}

 

让所有Minion处于描述的状态

salt '*' state.apply

 

参考:

(1)    https://docs.saltstack.com/en/latest/topics/tutorials/states_pt3.html

 

8. 多环境的配置和管理

如下以在不同环境的主机中放置不同内容的/tmp/myconf.txt文件为例进行说明

为了便于区分不同环境,先修改各Minion的id加入环境标识

 

修改master的file_root配置

/etc/salt/master

file_roots:

  base:

   - /srv/salt/base

  dev:

    - /srv/salt/dev

  prod:

    - /srv/salt/prod

 

在多环境下,每个环境的根目录下维护各自的top.sls

 

top.sls中指明自己的环境,匹配的目标机器,包含的状态文件/子目录等

 

top.sls中引用了myapp,它会按如下顺序引用:如果存在myapp.sls则引用myapp.sls,如果不存在,则引用myapp目录下的init.sls。我们采用子目录的方式对目录进行规划。在init.sls中指定该子目录中的状态文件

 

.myconf对应与init.sls同目录的myconf.sls状态文件,在该文件中对Minion的/tmp/myconf.txt状态进行描述

 

分别在base、dev、prod环境的myconf.txt中写入不同内容,执行如下命令让不同环境的Minion处于对应的描述状态

salt '*' state.apply  # 默认base环境

salt '*' state.apply saltenv=dev # dev环境

salt '*' state.apply saltenv=prod # prod环境

 

参考:

(1)    https://docs.saltstack.com/en/latest/topics/tutorials/states_pt4.html