SaltStack快速了解

1. 介绍

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

2. 环境准备

2.1 安装

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

下载安装脚本python

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

 

安装salt-masternginx

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

 

安装salt-minionapache

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

 

2.2 配置

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

主机名 IP 说明
node1 172.16.37.23 Master
node2 172.16.37.35 Minion
node3 172.16.37.41 Minion
node4 172.16.37.39 Minion
node5 172.16.37.43 Minion

 

 

 

 

 

 

 

(2) Master防火墙规则安全

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

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

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

 

(3) Minion配置

修改/etc/salt/minion

    a) 修改minion的master

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

        master: node1

    b) 为minion指定id

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

        id: node2

 

重启salt master和salt minion

systemctl restart salt-master salt-minion # Master
systemctl restart salt-minion             # 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

相关文章
相关标签/搜索