目录
- saltstack简介
- 安装saltstack
- grains&pillar
- 管理对象Target
- 配置管理States
- 自定义module
saltstack简介
什么是saltstack?
Saltstack开源项目始于2011年,使用Python开发的一套C/S架构的运维工具,由Master和Minion组成,通过ZeroMQ进行通信。
项目地址: https://github.com/saltstack/salt
官网地址: http://www.saltstack.com
官方文档: http://docs.saltstack.com OR http://docs.saltstack.cn
开发语言: Python
运行模式: C/S
基本术语
说明 | |
---|---|
master | 控制中心,salt命令运行和资源状态管理端 |
minions | 需要管理的客户端机器,会主动连接master端,并从master端得到资源状态信息,同步资源管理信息 |
states | 配置管理的指令集 |
grains | minion端的静态变量 |
pillar | minion端的动态变量 |
highstate | 给minion永久添加状态,从sls配置文件读取 |
salt schedule | 自动保持客户端配置 |
安装saltstack
安装
Installs the latest release. Updating installs the latest release even if it is a new major version.
1.1、Run the following command to import the SaltStack repository key:
wget -O - https://repo.saltstack.com/apt/ubuntu/16.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
1.2、Save the following file to /etc/apt/sources.list.d/saltstack.list:
deb http://repo.saltstack.com/apt/ubuntu/16.04/amd64/latest xenial main
1.3、Install
> sudo apt-get update
> sudo apt-get install salt-master
> sudo apt-get install salt-minion
> sudo apt-get install salt-ssh
> sudo apt-get install salt-syndic
> sudo apt-get install salt-cloud
> sudo apt-get install salt-api
1.4、show version
> salt --version
salt 2016.3.3 (Boron)
基本的配置
文件 /etc/salt/master
interface: 192.168.199.86
文件 /etc/salt/minion
master: 192.168.199.86
id: qianlnk # minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
配置
master:
https://docs.saltstack.com/en/latest/ref/configuration/master.html
http://arlen.blog.51cto.com/7175583/1423997
minion:
https://docs.saltstack.com/en/latest/ref/configuration/minion.html
http://arlen.blog.51cto.com/7175583/1424008
启动
sudo service salt-master start
sudo service salt-minion start
master接受minion的key
> sudo salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
qianlnk
Rejected Keys:
> sudo salt-key -a qianlnk
The following keys are going to be accepted:
Unaccepted Keys:
qianlnk
Proceed? [n/Y] y
Key for minion qianlnk accepted.
> sudo salt-key -L
Accepted Keys:
qianlnk
Denied Keys:
Unaccepted Keys:
Rejected Keys:
测试
> sudo salt "qianlnk" test.ping
qianlnk:
True
> sudo salt "qianlnk" cmd.run 'uptime'
qianlnk:
13:34:25 up 14 days, 2:37, 1 user, load average: 0.04, 0.18, 0.16
使用帮助
sys.doc 类似于linux的man命令,可以显示minion模块的详细使用说明。如:
sudo salt ‘qianlnk’ sys.doc test
查看minion qianlnk上test模块的更多信息。
grains&pillar
什么是grains?
Grains是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息。在执行salt的sls时候可以根据Grains信息的不同对服务器进行匹配分组,例如可以根据系统是centos服务器跟系统是redhat环境的安装不同的软件包。
查看grains的功能
sudo salt ‘qianlnk’ sys.list_functions grains
qianlnk:
- grains.append
- grains.delval
- grains.fetch
- grains.filter_by
- grains.get
- grains.get_or_set_hash
- grains.has_value
- grains.item
- grains.items
- grains.ls
- grains.remove
- grains.set
- grains.setval
- grains.setvals
查看grains信息
sudo salt ‘qianlnk’ grains.items
怎么使用grains?
命令行中使用
对操作系统是Ubuntu的服务器执行test.ping
➜ salt sudo salt -G "os:Ubuntu" test.ping
dk1:
True
dk2:
True
显示cpu架构是x86_64的服务器的cpu个数
➜ salt sudo salt -G 'cpuarch:x86_64' grains.item num_cpus
dk2:
----------
num_cpus:
4
dk1:
----------
num_cpus:
4
sls中使用
#在top.sls中使用
'os:Ubuntu':
- match: grain
- webserver
在top.sls入口中对系统是Ubuntu的服务器执行webserver.sls里定义的状态信息。
自定义grains
存在形式:
1、core grains
2、在/etc/salt/grains 中自定义
3、在/etc/salt/minion 中自定义
4、在_grains目录中自定义grains,同步到minions
- core grains是系统设定的grains,如果自定义的grains的名称跟core grains中的一样则会将之覆盖掉。
- 在minion端的/etc/salt/grains中定义:
root@17ca9e9efc8a:/etc/salt# cat grains
roles:
- zookeeper
- kafka
注意!该目录下不存在grains文件的话自己创建,定义grains后需要重启salt-minion。
测试:
sudo salt -G “roles:kafka” test.ping
cn2:
True
- 在/etc/salt/minion中定义,类似在/etc/salt/grains中定义。
- 在master端,_grains目录中定义:
➜ cd /srv/salt
➜ mkdir _grains
➜ cd _grains
➜ vi my_grain.py
#添加内容
➜ cat my_grain.py
def my_grains():
grains = {'roles' : ['phpserver','webserver']}
return grains
➜ sudo salt -E "dk*" saltutil.sync_grains #刷新minion的grains
dk2:
- grains.my_grain
dk1:
- grains.my_grain
➜ sudo salt -E "dk*" grains.item roles
dk2:
----------
roles:
- phpserver
- webserver
dk1:
----------
roles:
- phpserver
- webserver
➜ sudo salt -G "roles:webserver" test.ping
dk2:
True
dk1:
True
什么是pillar?
跟grains的结构是一样的,也是字典格式,数据通过key/value的格式进行存储。使用独立的session加密。Pillar是数据中心, 其在Saltstack中主要的作用就是存储和定义配置管理中需要的一些数据,比如软件版本号、用户名密码等信息。
查看grains的功能
➜ ~ sudo salt "cn1" sys.list_functions pillar
cn1:
- pillar.data
- pillar.ext
- pillar.fetch
- pillar.file_exists
- pillar.get
- pillar.item
- pillar.items
- pillar.keys
- pillar.ls
- pillar.obfuscate
- pillar.raw
Pillar数据跟特定的Minion关联,可以用来传递Minion自己的信息。管理员也可以自定义自己的pillar来管理minion。
自定义pillar
在master的sls文件中定义,master配置需要指定pillar的目录。
pillar_roots:
base:
- /srv/pillar
➜ pillar git:(master) ✗ pwd
/srv/pillar
➜ pillar git:(master) ✗ cat top.sls
base:
'*':
- data
- git
➜ pillar git:(master) ✗ cat data/init.sls
roles: webserver
➜ pillar git:(master) ✗ cat git.sls
{% if grains[‘os’] == ‘CentOs’ %}
git: git
{% elif grains[‘os’] == ‘Debian’ %}
git: git-core
{% endif %}
默认情况下,master配置文件中的所有数据都会添加到pillar中,且对所有的minion可用。如果要禁止这一个默认值,可以设置master文件中的选项:
pillar_opts: False
pillar跟sls一样有自己的top.sls文件作为入口来组织其他的pillar。base中 “×”制定所有minion拥有pillar:mongodb、zookeeper、kafka、supervisor, 然后是各个minion组有自己的init.sls。kafka.sls中定义kafka对应的一些信息。
修改完pillar文件后需要用以下的命令刷新以下minion的信息:
➜ pillar git:(master) ✗ sudo salt 'cn1' saltutil.refresh_pillar
cn1:
True
使用pillar
Target:
#salt使用 -l 选项来使用pillar
➜ pillar git:(master) ✗ sudo salt -l ”roles:webserver” test.ping
sls文件中使用:
#如根据系统环境安装git
➜ salt git:(master) ✗ cat git_env.sls
git:
pkg.installed:
- name: {{pillar[‘git’]}}
#或者:
git:
pkg.installed:
- name: {{ salt[‘pillar.get’](‘git’, ‘git’) }}
管理对象Target
在saltstack系统中,我们的管理对象叫作Target。在Master上我们可以采用不同的Target去管理不同的Minion。这些Target可以是主机名、系统信息、定义的分组、甚至是自定义绑定的对象。
有哪些匹配?
所有操作目标参数:
Target Options:
-E, --pcre 正则匹配
-L, --list 列表匹配
-G, --grain grains 匹配
--grain-pcre grains 加正则匹配
-N, --nodegroup 组匹配
-R, --range 范围匹配
-C, --compound 综合匹配( 指定多个匹配)
-I, --pillar pillar 值匹配
-S, --ipcidr minions网段地址匹配
各种匹配的详细说明
- minion ID
sudo salt ‘cn1’ test.ping
- 通配符(*)
sudo salt ‘cn1’ test.ping
# 匹配所有的minion
sudo salt '*' test.ping
# 匹配ID开头为cn的minion
sudo salt 'cn*' test.ping
# 匹配cn1、cn2、cn3、cn4、cn5
sudo salt 'cn[1-5]' test.ping
# 匹配web-x, web-y, web-z
sudo salt 'web-[x-z]' test.ping
- 正则表达式
# 如: 匹配ID为assassin-production,assassin-sandbox
sudo salt -E 'assassin-[production|sandbox]' test.ping
# 在state中也可以这么用
base:
'assassin-[production|sandbox]'
- match: pcre
- webserver
- 列表匹配
# 对一些有特殊要求的minion可以手动指定ID作为Target
sudo salt -L 'cn1, cn2, cn23' test.ping
- grains匹配
# 如 测试所有操作系统为ubuntu的为minion
sudo salt -G 'os:Ubuntu' test.ping
# 查看CPU架构是x86_64的minion的cpu个数
sudo salt -G 'cpuarch:x86_64' grains.item numcpus
# 在top.sls中使用
'node_type:web'
- match: grain
- webserver
'node_type:mysql'
- match: grain
- database
- pillar匹配
# pillar匹配跟grains差不多, 不过将grains对象换成pillar
sudo salt -I 'somekey:specialvalue' test.ping
- 组匹配
# 节点分组需要先在top.sls或者master配置文件中定义好。
nodegroups:
group1: '[email protected],bar.domain.com,baz.domain.com or bl*.domain.com'
group2: 'G@os:Debian and foo.domain.com'
group3: 'G@os:Debian and N@group1'
group4:
- 'G@foo:bar'
- 'or'
- 'G@foo:baz'
sudo salt -N group1 test.ping
# 在top.sls中:
base:
group1:
- match: nodegroup
- webserver
- CIDR匹配
# 指定192.168.1.0/24网段内的minion
sudo salt -S '192.168.1.0/24' test.ping
- 复合匹配
salt -C 'G@os:Ubuntu or L@cn1,cn2' test.ping
最后,有时候匹配到的minion会很多,如果直接全部执行master可能会挂机。
所以我们可以分批执行:
# 一次10个minion执行
sudo salt '*' -b 10 test.ping
# 一次25%执行
sudo salt -G 'os:Ubuntu' --batch-size 25% test.ping
针对管理对象Target的操作,Module
- 查看所有的module列表
sudo salt "cn1" sys.list_modules
cn1:
- aliases
- alternatives
- archive
- artifactory
...
- 查看指定module的所有function
➜ pillar git:(master) ✗ sudo salt "cn1" sys.list_functions cmd
cn1:
- cmd.exec_code
- cmd.exec_code_all
- cmd.has_exec
- cmd.powershell
- cmd.retcode
- cmd.run
- cmd.run_all
- cmd.run_bg
- cmd.run_chroot
- cmd.run_stderr
- cmd.run_stdout
- cmd.script
…
- 查看指定module用法
➜ pillar git:(master) ✗ sudo salt "cn1" sys.doc cmd
cmd.exec_code:
Pass in two strings, the first naming the executable language, aka -
python2, python3, ruby, perl, lua, etc. the second string containing
the code you wish to execute. The stdout will be returned.
CLI Example:
salt '*' cmd.exec_code ruby 'puts "cheese"'
配置管理States
salt states是salt模块的扩展。主系统使用的状态系统叫SLS系统,SLS代表Saltstack State。States是Saltstack中的配置语言,在日常进行配置管理时需要编写大量的States文件。比如我们需要安装一个包,然后管理一个配置文件,最后保证某个服务正常运行。这里就需要我们编写一些states sls文件去描述和实现我们想要的功能。
查看state modules的详细使用
# 1、查看所有states列表
sudo salt ‘cn1’ sys.list_state_modules
# 2、 查看指定state的所有function
sudo salt ‘cn1’ sys.list_state_functions cmd
# 3、查看指定states的用法
sudo salt ‘cn1’ sys.state_doc cmd
# 4、查看指定state指定function的用法
sudo salt ‘cn1’ sys.state_doc cmd.run
Salt state树
# 在/etc/salt/master中配置file_roots
file_roots:
base:
- /srv/salt
Salt state的top文件
top.sls是state系统的入口文件,它在大规模配置管理工作中负责指定哪些设备调用哪些states.sls文件。top.sls是salt state默认的sls文件,在未做特别制定的时候salt state会默认调用top.sls来执行。如:
sudo salt ‘cn1’ state.hightate
top.sls需要手动创建,位置则是salt state树定义的目录/srv/salt下。
调试Salt
# 开启debug日志
salt-minion -l debug
# 设置超时
salt ‘*’ state.highstate -t 60
简单的例子
cat top.sls
base: # 匹配状态树的base目录配置
‘*’: # 匹配minion
- webserver # 表示执行base目录下的webserver.sls状态文件或者webserver/init.sls文件
cat webserver.sls
apache: # ID声明,跟yum install apache指定的名称一样
pkg: # 状态声明,说明要做什么状态操作,pkg使用系统本地的软件包管理工具
- installed # 函数声明,说明该sls文件指定的执行操作函数
service: #管理系统守护进程
- running
- require:
- pkg: apache
# 更新所有minion的状态
sudo salt “*” state.highstate
注:这样就可以在所有的minion中安装apache了。
当然也可以不要top.sls,直接指定sls文件来执行
sudo salt ‘cn1’ state.sls webserver
或者使用apply function,apply会根据后面的参数来决定调用state.highstate还是state.sls
sudo salt ‘cn1’ state.apply webserver
简单的扩展
添加配置文件和用户
部署apache这样的服务还需要添加其他的内容,比如apache的配置文件,运行apache服务的用户和组。
# 目录结构:
ls /srv/salt/apache
init.sls
http.conf
cat init.sls
apache:
pkg:
- installed
service:
- running
- watch:
- pkg: apache
- file: /etc/httpd/conf/httpd.conf
- user: apache
user.present:
- did: 87
- gid: 87
- home: /var/www/html
- shell: /bin/nologin
- require:
- group: apache
group.present:
- gid: 87
- require:
- pkg: apache
/etc/httpd/conf/httpd.conf
file.managed:
- source: salt://apache/httpd.conf
- user: root
- group: root
- mode: 644
自定义module
根据官网的说法,自定义module应该存放在/srv/salt/_modules/目录下。同步到minion的方法有三种:
state.apply
saltutil.sync_modules
saltutil.sync_all
例子:
#encoding = utf8
def test():
return 'this is a test'
def get_target():
return __grains__['target']
def get_domain(service):
dom = __pillar__[service]['domain']
return dom
def deploy(service,version):
target = get_target()
domain = get_domain(service)
cmd = "gover -s "+service+" -t "+target+" -v "+str(version)+" -d "+ domain
return __salt__['cmd.run'](cmd)