saltstack
介绍:
1.是一个基础平台管理工具
2.是一个配置配置管理系统,能够维护预定义状态的远程节点
3.是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据
三大功能:
- 远程执行
- 配置管理(状态)
- 云管理
文章目录
安装
1.先安装指定epel源
baseurl=http://repo.saltstack.com/yum/redhat/6.7/x86_64/
2.安装master
yum install -y salt-master
3.安装minion
yum install -y salt-minion
配置
1.修改minion的配置文件/etc/salt/minion
在master后面加上master的IP地址或域名
2.修改master的配置文件/etc/salt/master
修改为 log_level: debug
在 file_roots后面加上state.sls所在的文件夹
3.启动服务
systemctl start salt-master
systemctl start salt-minion
认证
salt-key 查看目前已认证与未认证的minion
minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key)和minion.pub(public key),然后将minion.pub发送给master。
master在第一次启动时,会在/etc/salt/pki/master下自动生成master.pem
用salt-key -a hostname进行认证
认证成功后master与minion都会有对方的公钥,就可以进行通信了
远程执行
1.测试连通
salt '*' test.ping
'*'表示所有目标机器 test.ping 只是模块里的一个功能,用来测试连通性
2.常用命令结构
salt [options] ‘<目标机>’ <功能> [arguments]
例如:
#对机器node1使用w命令
test 'node1' cmd.run 'w'
3.常用命令
salt-run
该命令执行runner(salt带的或者自定义的,runner以后会讲),通常在master端执行,比如经常用到的manage
salt-run [options] [runner.func]
salt-run manage.status ##查看所有minion状态
salt-run manage.down ##查看所有没在线minion
salt-run manged.up ##查看所有在线minion
salt-key
密钥管理,通常在master端执行
salt-key [options]
salt-key -L ##查看所有minion-key
salt-key -a <key-name> ##接受某个minion-key
salt-key -d <key-name> ##删除某个minion-key
salt-key -A ##接受所有的minion-key
salt-key -D ##删除所有的minion-key
salt-call
该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job
salt-call [options] <function> [arguments]
salt-call test.ping ##自己执行test.ping命令
salt-call cmd.run 'ifconfig' ##自己执行cmd.run函数
salt-cp
分发文件到minion上,不支持目录分发,通常在master运行
salt-cp [options] '<target>' SOURCE DEST
salt-cp '*' testfile.html /tmp
salt-cp 'test*' index.html /tmp/a.html
state.sls
SLS(代表SaLt State文件)是Salt State系统的核心。SLS描述了系统的目标状态,由格式简单的数据构成。这经常被称作配置管理。首先,在master上面定义salt的主目录,默认是在/srv/salt/下面。
1.YAML
sls采用YAML的格式编写
1.空格和Tabs
在YAML中不要使用Tab
2.缩进
YAML推荐缩进为2个空格,**’ : ’ , ’ - ’**后面缩进1个空格再写
3.数字会解析成数字
如mode: 0644会解析成mode: 644,可用’括住防止mode: ’0644′此情况
4.YAML不允许双简写
5.下划线将会被删除
有出现下划线要用 " " 括起来
2.基本格式
1| httpd:
2| pkg:
3| - installed
第一行被称为标签定义,在这里被定义为安装包的名
第二行被称为状态定义,在这里定义使用module
第三行被称为函数定义,在这里定义使用调用函数
3.常用模块
(1)用户管理
创建用户
user.present: - shell: /bin/bash - home: /home/admin - uid: 888
删除用户
user.absent: - purge: True - force: True
#purge类似userdel -r force为用户在线也强制删除
(2)文件管理
上传文件
file.managed:
- source:salt://nginx/nginx-xxx.xxx.tar.gz
- user: root
- group:root
- mode: 755
- backup:minion
- template:jinja
追加文件
file.append:
- text:
- "exportJAVA_HOME=/usr/local/jdk1.6.0_13"
- "exportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH"
- "exportCLASSPATH=$JAVA_HOME/lib/:$JAVA_HOME/jre/lib:$CLASSPATH"
(3)包管理
yum安装
pkg.latest:
- pkgs:
- aspell
- ncurses
- ncurses-devel
- pcre-devel
- telnet
- libcurl
- libcurl-devel
(4)目录管理
目录覆盖
file.recurse:
-source: salt://nginx/conf
-user: root
-group: root
-file_mode: 644
-dir_mode: 755
-template: jinja
- backup: minion
- makedirs: True
- include_empty: True
- recurse:
- user
- group
- mode
目录创建
file.directory:
- user: web
- group: web
- file_mode:644
- dir_mode:755
- makedirs:True
- include_empty: True
- template:jinja
- backup:minion
(5)逻辑关系
继承(include)
include:
- web.apache
...
依赖(require)
依赖某个state,在运行此state前,先运行依赖的state,依赖可以有多个
require:
- pkg: nginx
...
监控(watch)
在某个state变化时运行此模块,文中的配置,相关文件变化后,立即执行相应操作
- watch:
- file: /etc/nginx/nginx.conf
- file: /etc/nginx/fastcgi.conf
- pkg: nginx
顺序(order)
优先级比require和watch低,有order指定的state比没有order指定的优先级高,假如一个state模块内安装多个服务,或者其他依赖关系,可以使用。如果想让某个state最后执行,可以使用last。
nginx:
pkg.installed:
- order:1
举例:批量安装tengine
make.sls
1| pkg-init:
2| pkg.installed:
3| - pkgs:
4| - automake
5| - gcc-c++
6| - zlib-devel
7| - openssl-devel
8| - pcre-devel
install.sls
include:
- tengine.make
tengine_source:
file.managed:
- name: /tmp/tengine-2.3.1.tar.gz
- unless: test -e /tmp/tengine-2.3.1.tar.gz
- source: salt://tengine/files/tengine-2.3.1.tar.gz
extract_tengine:
cmd.run:
- cwd: /tmp
- names:
- tar zxf tengine-2.3.1.tar.gz
- unless:
- test -d tengine-2.3.1
- require:
- file: tengine_source
tengine_compile:
cmd.run:
- cwd: /tmp/tengine-2.3.1
- names:
- ./configure --prefix=/usr/local/tengine && make && make install
- require:
- cmd: extract_tengine
- unless: test -d /usr/local/tengine
init.sls
include:
- tengine.make
- tengine.install
top.sls(放置在salt工作根目录)
base:
'*':
- tengine
执行命令salt ‘’ state.sls tengine 或者 salt '’ state.highstate 便可以在所有minion上自动编译安装tengine
数据系统
Grains
服务器的一些静态信息,这里强调的是静态,就是不会变的东西。比如说os是centos不会变化,除非重新安装系统。
salt 'node1' grains.list 列出node1所有的静态数据键
salt 'node1' grains.items 列出node1所有的静态数据键与值
salt '*' grains.item os 列出所有机器的os
-G 用于对匹配到的进行操作 (目标选择)
salt -G ‘os:CentOS’ cmd.run ‘echo haha’
自定义grains的3种手段
直接在/etc/salt/minion中定义
grains:
roles:
- webserver
- memcache
创建/etc/salt/grains
vim /etc/salt/grains
hehe:321
haha:654
开发grains
用python 写一个python脚本,返回一个字典就可以了
在 /srv/salt/ 下创建一个 _grains 的目录,然后在目录中创建一个.py文件
#!/usr/bin/env python
def my_grains():
grains = {}
grains['iaas'] = 'openstack'
grains['edu'] = 'aron'
return grains
grains的优先级
1.系统自带
2.grains文件写的
3.minion配置文件写的
4.自己写的
每次修改数据都需要重启服务或刷新grains操作才会生效,这也印证了是静态数据
命令 salt ‘*’ saltutil.sync_grains 用于刷新grains的数据
Pillar
Pillar在salt中是非常重要的组成部分,利用它可以完成很强大的功能,它可以指定一些信息到指定的minion上。不像grains一样是分发到所有Minion上的,它保存的数据可以是动态的。Pillar以sls来写的,格式是键值对。
适用情景:
1.比较敏感的数据,比如密码,key等
2.特殊数据到特定Minion上
3.动态的内容
4.其他数据类型
查看Minion的Pillar信息
salt '*' pillar.items
####查看某个Pillar值
salt '*' pillar.item <key> #只能看到顶级的
salt '*' pillar.get <key>:<key> #可以取到更小粒度的
编写pillar数据
指定pillar_roots,默认是/srv/pillar(可通过修改master配置文件修改),建立目录
mkdir /srv/pillar
cd /srv/pillar
编辑一个pillar数据文件
vim test1.sls
name: 'salt'
users:
hadoop: 1000
redhat: 2000
ubuntu: 2001
建立top file指定minion到pillar数据文件
vim top.sls
base:
'*':
- test1
刷新pillar数据
salt '*' saltutil.refresh_pillar
测试是否生效
salt '*' pillar.get name
salt '*' pillar.item name
在state中通过jinja使用pillar数据
vim /srv/salt/user.sls
{% for user, uid in pillar.get(’users’, {}).items() %}
{{user}}:
user.present:
- uid: {{uid}}
{% endfor %}
通过jinja模板配合grains指定pillar数据
/srv/pillar/pkg.sls
pkgs:
{% if grains[’os_family’] == ’RedHat’ %}
apache: httpd
vim: vim-enhanced
{% elif grains[’os_family’] == ’Debian’ %}
apache: apache2
vim: vim
{% elif grains[’os’] == ’Arch’ %}
apache: apache
vim: vim
{% endif %}
salt schedule
schedule是salt中的crontab,就是周期性执行一些函数,需要注意的是在minion上执行的函数是salt的可执行模块里的函数,在master上执行的是runner模块的函数。下面看看如何设置: master是修改master配置文件/etc/salt/master:
#每隔3小时30分35秒,master就会运行一个state.over这个runner
schedule:
overstate: ##这个是ID,可以随意起,全文件唯一
function: state.over ##对于master,function就是runner
seconds: 35 ##间隔秒数
minutes: 30 ##间隔分数
hours: 3 ##间隔小时数
minion的两种schedule定义方式
1.通过修改minion的配置文件,这种方式需要修改所有Minion的配置文件
schedule:
highstate:
function: state.highstate
seconds: 30
minutes: 5
hours: 1
2.为Minion指定pillar
schedule:
highstate:
function: state.highstate
seconds: 30
minutes: 5
hours: 1
自定义可执行模块
所有可执行module可见:
https://github.com/saltstack/salt/tree/develop/salt/modules
http://docs.saltstack.com/ref/modules/all/index.html?highlight=full list builtin
1.建立自定义模块目录,通常所有自定义模块放在该目录下
mkdir /srv/salt/_modules
2.编写模块(示例)
vim test.py
-*- coding: utf-8 -*-
def __virtual__():
if __grains__.get('os_family', 'unkown') == 'RedHat':
return 'yum'
else:
return False
def install(rpm):
cmd = 'yum -y install {0}'.format(rpm)
re = __salt__['cmd.run'](cmd)
return re
说明:__virtual__函数通常用来匹配是否满足该模块的环境,满足return出来的字符串作为该模块的名字而不是文件名,但return的是False代表的此模块无效,不能使用。在自定义模块中可以中__grains__是一个包含了minion 所有grains的字典,__pillar__是包含了所有Pillar的grains字典,__salt__是所有可执行函数对象的字典,通常最常使用的就是这三个变量了。再往下面是定义了函数install,在salt中一般不用’%s’ % var这种格式化形式,而是使用字符串的format方法。下面就是通过__salt__执行了cmd.run这个函数来运行yum命令。