saltstack

目录

  • 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: 'L@foo.domain.com,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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容