saltstack
saltstack是基于Python开发的一套C/S架构配置管理工具
底层使用ZeroMQ消息队列pub/sub方式通信
saltstack
两个主要功能:配置管理与远程执行
Saltstack基于C/S架构
服务端称 master
客户端称 minion
Saltstack工作机制
Master和Minion都以守护进程的方式运行
Master监听配置文件里定义的ret_port(接收minion请求),和publish_port(发布消息)的端口
当Minion运行时,他会自动连接到配置文件里定义的Master地址ret_port端口进行连接认证
本地yum
createrepo ./ //在提供yum源的文件目录执行
安装Master
一、服务端装包salt-master
yum -y install salt-master
二、配置文件不需要修改任何
/etc/salt/master
vim /etc/hosts 域名解析
192.168.4.10 ms
192.168.4.20 web1
192.168.4.22 web2
192.168.4.25 db1
三、启动服务:
systemctl start salt-master
systemctl enable salt-master
netstat -lantpu |grep ":4505|:4506"
一、客户端装包salt-minion
yum -y install salt-minion
二、修改配文件
vim /etc/salt/minion
master: sm 指定master域名
id: web1 指定自己的域名
vim /etc/hosts
192.168.4.10 ms
192.168.4.20 web1
192.168.4.22 web2
192.168.4.25 db1
三、起服务
systemctl start salt-minion
systemctl enable salt-minion
Master与Minion互信
Minion上线后先与Master端联系,把自己的pubkey发过去
Master接收Minion的公钥后,互信建立完成
秘钥选项
salt-key -h
-L: 列出密钥
-a: 接受某个密钥
-A: 接受全部密钥
-D: 删除全部密钥
-d: 删除某个密钥
接受所有密钥,完成互信
salt-key -A -y
salt命令使用方法:
格式:salt [options] ‘<target>‘ <function> [arguments]
[options] //选项(修饰目标)
‘<target>‘ //目标(所有minion主机集合)
<function> //函数 (模块.方法)
[arguments] //传递给对方的参数(修饰函数)
function一般采用python的 模块.方法 样式
Minion上运行,可以采用通配符 ‘*’
模块
cp.get_file == scp
file.copy == cp
cmd.run ‘命令‘ //执行命令的模块
test.ping ping命令
选项:
-L 列表
-E 正则
-N 匹配组
-S CIDR
-G 调用grains
-I 调用pillar
salt -L ‘web1‘ cmd.run ‘uptime‘
salt -E "web[0-9]" test.ping
分组
vim /etc/salt/master
nodegroups:
abc: ‘[email protected],web2‘ 可以写多台minion主机
other: ‘[email protected][0-9] and [email protected]‘ and是交集
#other: ‘[email protected][0-9] or [email protected]‘ or是并集
!!!! 前面必须是四个空格
salt -N abc test.ping
/srv/salt 是Master默认的根目录
mkdir -p /srv/salt/oh
向abc组传输文件
salt -N abc cp.get_file salt://oh/ /tmp/co
模块及功能
salt ‘minion域名‘ sys.list_modules 列出所有可用的模块
salt ‘web1‘ sys.list_modules
salt ‘web2‘ sys.list_functions <模块名> 查看模块所有功能
salt ‘db1‘ sys.doc <模块名> 查看模块的用法
例:
salt -N abc file.cop /etc/selinux /tmp/selinux 拷贝任意文件和目录
salt -N abc user.add zhangsna 2000 创建用户
Grains(收集客户端信息)
1、打标签的模块
2、命令用法
3、自带收集客户端信息
4、信息存在客户端
5、是在现有的配置文件修改
YAML规则(Master和Minion的配置文件采用YAML语法)
项目使用"-"来表示
键值对使用":"来表示
YAML使用一个固定的缩进风格表示数据层级结构关系
一般每个缩进级别由两个空格组成
注意不能用tab键
YAML的键值对采用冒号分隔
YAML的键值对对应python的字典
YAML表示形式
name: web
或
name:
web
字典可以嵌套
hosts:
name: web
列表项使用一个短横杠加一个空格
- web
- dba
列表可以作为一个键值对的value(值)
pkg-http:
- httpd
- php
Grains是saltstack最重要的组件之一
可以获取minion端的基本信息,这些信息一般都是静态的,如CUP、内存、操作系统等
Grains存储在minion本地
管理员可以在minion端进行grains值的修改,如增加、删除等
salt ‘target‘ grains.items 查看grains提供的信息
salt ‘web1‘ grains.itmes
salt ‘target‘ grains.items [key] 查看grains指定的key信息
salt ‘*‘ saltutil.sync_grains 刷新所有配置
salt -G ‘os:RedHat‘ cmd.run ‘uptime‘ 匹配minion端os为RedHat的执行uptime命令
在minion上定义grains
vim /etc/salt/minion
grains:
role: nginx
重启:systemctl restart salt-minion
或在minion上单独定义grains
vim /etc/salt/minion.d/grains.conf 创建grains配置文件
grains:
role: nginx
重启:systemctl restart salt-minion
在master上查看角色信息
salt ‘web1‘ saltutil.sync_grains 刷新所有配置
salt ‘web1‘ grains.item role
salt ‘web1‘ grains.item |grep -i nginx
Pillar组件
pillar也是saltstack最重要的组件之一
作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用
存储在master端,存放需要提供给minion的信息
常用于敏感信息,每个minion只能访问master分配给自己的pillar信息
用于经常动态变化的信息
pillar需要一个pillar_roots来维护pillar的配置
默认pillar_roots为/srv/pillar
pillar_roots在Master配置文件中定义
例:vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
mkdir /srv/pillar
pillar执行时需要一个名为top.sls的入口文件
通过top.sls文件作为入口,组织其它的pillar文件
sls文件采用YAML格式
例:
cd /srv/pillar
vim top.sls
base: #与pillar_roots定义一致
‘[email protected],web2‘: #过滤目标
- appweb #用于包含appweb.sls
‘[email protected]\d‘: #过滤目标
- appdb #用于包含appdb.sls
- user #用于包含user.sls
vim appdb.sls
dbname: mysql
vim appweb.sls
appname: web
software:
- apache
- nginx
vim user.sls
users:
zhangsan: 1000
lisi: 1001
同步Pillar数据
salt ‘*‘ saltutil.refresh_pillar 刷新所有配置
salt ‘*‘ pillar.items 获取pillar全部数据
salt ‘web‘ pillar.items 获取pillar提供的信息
salt ‘web‘ pillar.items appweb 获取pillar指定的key信息
salt -I ‘appename:web‘ test.ping 使用grains信息分类匹配主机
salt -I ‘appename:web‘ cmd.run ‘uptime‘ 匹配minion端appename为web的执行uptime命令
jinja模板
jinja是基于python的模板引擎
在saltstack中我们使用yaml_jinja渲染器来根据模板生产对应的配置文件
对于不同的操作系统或者不同的情况,通过Jinja可以让配置文件或者操作形成一种模板的编写方法
jinja使用步骤
在state文件中使用"- template: jinja"声明
在模板文件中使用变量"{{name}}"声明,name为变量,自己定义
在state文件中使用"- defautls: name: value"声明
使用变量
变量的基本格式为:{{变量}}
一级字典变量格式为:{{pillar[‘appname‘]}}
二级字典变量格式为:{{pillar[‘flow‘][‘maxconn‘]}}
判断语句
对grains的os值进行判断,根据不同的系统对apache的值进行不同的设定,这样apache就相当于是可以随机应变的值
例:{% if grains[‘os‘] == ‘CentOS‘ %}
apache: httpd
{% elif grains[‘os‘] == ‘Debian‘ %}
apache: apache2
{% endif %}
循环语句
在state中使用pillar数据,值通过jinja来访问pillar即可,多个值通过循环逐个获取
{% for user, uid in pillar,get(‘users‘,{}).items() %}
{{user}}:
user.present:
- uid:{{uid}}
{% endfor %}
states基础
states是satlstack中的配置语言
安装软件包、管理配置文件都需要编写一些states sls文件
states sls使用YAML语法
salt ‘web1‘ sys.list_state_modules 查看所有States的模块
salt ‘web1‘ sys.list_state_functions sysctl 查看该模块功能
salt ‘web1‘ sys.state_doc sysctl.present 查看该模块的用法
file模块
file.managed: 文件同步模块
file.append: 文件追加模块
file.directory: 创建文件模块
例1:
vim /etc/salt/master
file_roots:
base:
- /srv/base
dev:
- /srv/dev
prod:
- /srv/prod
cd /srv/
mkdir base dev prod
重启服务:systemctl restart salt-master.service
cd base/
vim top.sls
base: #名称和配置文件相对应
‘*‘: #minion域名*代表所有
- dns #和下面文件相对应
vim dns.sls
abc: #名称
file.managed: 文件同步模块
- name: /etc/resolv.conf 同步被参考文件的内容的路径
- source: salt://files/dns.conf 被参考文件路径
- user: root
- group: root
- mode: 644
- template: jinja
- defaules:
DNS: 192.168.4.100
mkdir /srv/base/files
cd /srv/base/files
touch dns.conf
cat dns.conf
nameserver {{ DNS }}
检测:
salt ‘*‘ state.highstate saltenv=base test=true
执行:
salt ‘*‘ state.highstate saltenv=base test=false
例2:
cd /srv/base/
vim top.sls
base: #名称和配置文件相对应
‘[email protected],wen2‘: #minion域名列表
- tex #和下面文件相对应
vim tex.sls
abc: #名称
file.append: #文件追加模块
- name: /etc/resolv.conf #追加到的文件路径
- text:
- DNS1:9.9.9.9 #(比上一级多两个空格),追加的内容
检测:
salt ‘*‘ state.highstate saltenv=base test=true
执行:
salt ‘*‘ state.highstate saltenv=base test=false
例3:
cd /srv/base/
vim top.sls
base: #名称和配置文件相对应
‘*‘: #minion域名*代表所有
- set #和下面文件相对应
vim ste.sls
directory: #名称
file.directory: 创建文件模块
- name: /opt/rpm_pkgs 创建的文件名
- user: root
- group: root
- dri_mode: 755 文件目录的权限
- file_mode: 644 文件的权限
检测:
salt ‘*‘ state.highstate saltenv=base test=true
执行:
salt ‘*‘ state.highstate saltenv=base test=false
cmd模块
cmd模块强制给minion执行命令
可以限制当某个条件满足时才执行命令
也可以限制当某个条件不满足时才执行命令
cmd.run: 命令模块
unless: 当unless条件不满足时,需要执行令
onlyif: 当onlyid条件满足时,需要执行令
例:
cd /srv/base/
vim top.sls
base: #名称和配置文件相对应
‘*‘: #minion域名*代表所有
- est #和下面文件相对应
vim est.sls
useradd zhangsan: #创建用户
cmd.run:
- unless: idd zhangsan #判断用户不存在
echo 123456 |passwd --stdin zhangsan: #给用户改密码
cmd.run:
- onlyif: id zhangsan #判断用户存在
检测:
salt ‘*‘ state.highstate saltenv=base test=true
执行:
salt ‘*‘ state.highstate saltenv=base test=false
系统初始化
可以在base环境下创建一个init目录,将系统初始化配置的sls文件均存放在init目录下,称其为“初始化模块”
1.配置DNS
vim /srv/salt/base/init/dns.sls
resolv_file:
file.managed:
- source: salt://init/files/resolv.conf
- user: root
- group: root
- mode: 644
2.配置History记录时间
vim /srv/salt/base/init/history.sls
profile_file: #名称
file.append: #追加模块
- name: /etc/profile #追加的文件路径
- text:
- export HISTTIMEFORMAT="%F %T" #追加的内容
3.配置内核参数优化
saltstack提供了sysctl状态模块用来进行内核参数的配置
vim /srv/salt/base/init/sysctl.sls
net.ipv4.ip_forward: #为值1开启路由
sysctl.present:
- value: 1 #值
4.创建用户
vim /srv/salt/base/init/user.sls
usreadd bob:
cmd.run:
- unless: id bob
echo 123456 |passwd --stdin bob:
cmd.run:
- onlyif: id bob
pkg模块
pkg模块可以实现软件包管理
管理的软件包包括红帽RPM包和Ubuntu的deb包等
主要方法有:
pkg.installed: 安装软件包
pkg.latest: 保持软件包最新版本
pkg.remove: 卸载软件包
pkg.purge: 下载软件包,删除配置文件
require条件:只有满足条件才执行令
service模块
软件部署完毕后,需要确保服务处于运行状态,并且能够实现开机自启。
service.running: 确保服务处于运行状态
service.enabled: 开机自启
service.disabled: 开机不自启
service.dead: 确保服务处于未运行状态
watch:服务如果能够正常启动,需要确保存在配置文件,设置如果配置文件存在,才启动服务。
例:在minion上域名为web1,web2的主机上安装httpd软件包,并修改侦听端口为8080.
cd /srv/salt/prod
mkdir files
vim top.sls
prod: #名称和配置文件相对应
‘[email protected],web2‘ #minion域名
- install #和下面文件相对应
- etc #和下面文件相对应
- service #和下面文件相对应
vim install.sls
insta: #名称
pkg.installed: #安装软件包模块
- name: httpd #软件包名
vim etc.sls
etchttp: #名称
file.managed: #同步模块
- name: /etc/httpd/conf/httpd.conf #同步被参考文件的内容的路径
- source: salt://files/httpd.conf #被参考文件路径
- template: jinja #使用jinja模块
- defaults:
PORT: 8080
- require: #require条件
- pkg: insta #pkg模块定义的函数名称
cp /etc/httpd/conf/httpd.conf /srv/salt/prod/files/
vim /srv/salt/prod/files/httpd.conf
............
Listen {{ PORT }} #使用jinja变量
..........
vim service.sls
servi: #名称
service.running: #运行模块
- name: httpd #运行的服务名
- enable: true
- restart: true
- watch: #watch条件
- file: etchttp #file模块定义的函数名称
检测:
salt ‘*‘ state.highstate saltenv=prod test=true
执行:
salt ‘*‘ state.highstate saltenv=prod
原文地址:http://blog.51cto.com/13399294/2161036