一、saltstack是什么?
saltstack是一个开源异构平台基础设置管理工具。
二、saltstack能干什么?
如果你是一个管理成百上千台服务器的管理员,你是否会遇到如下几个场景?
1.需要在每台服务器上部署agent,几百台服务器难道一个一个部署?
2.agent配置需要变更,也需要一个一个配置?
3.0day漏洞爆出,需要检查服务器版本,安装对应补丁,怎么办?
- 配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的包被安装,指定的服务在运行)。
- 分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据。
为什么要使用salt?
- 简单,非常容易设置和维护,不用考虑项目的大小。几乎不改动配置就可以工作。
- 并行执行,命令发送到远程系统是并行的而不是串行的,使用安全的加密协议,使用最小最快的网络载荷,提供简单的编程接口。
- 灵活易扩展,使用python开发,可以从简单的Python API调用,或者从命令行被调用,可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。
三、saltstack运行方式?
saltstack三种运行方式
- Local
- Master/Minion
- Salt SSH
最传统的运行方式还是C/S模式,管理端安装Master,被管理节点上安装Minion客户端。
下面主要介绍Master/Minion运行方式。
四、saltstack基本安装和配置
这里采用repo源,在线安装。请参考官方文档
分别在管理端和被管理节点使用yum命令进行安装。
yum install salt-master
yum install salt-minion
安装完成之后,首先启动master
service salt-master start
#或者
/etc/init.d/salt-master start
打开minion节点,编辑配置文件
vim /etc/salt/minion
#添加下面配置,注意分号后面有空格!
master: 192.168.252.136 #master端ip,有dns解析也可以填写域名。
id: web137 #本节点名称,填好之后尽量不要更改。
启动minion
service salt-minion start
切换到master
#查看minion
salt-key -L
#会列如下信息
[root@localhost ~]# salt-key #省略-L也行。
Accepted Keys:
Denied Keys:
Unaccepted Keys:
web137
Rejected Keys:
#接受minion
salt-key -a web137 -y # -a 后面指定要接受的id名称
或者
salt-key -A # -A表示接受所有,同理,可以使用 -d ,-D拒绝掉。
#再次查看
[root@localhost ~]# salt-key -L
Accepted Keys:
web137
Denied Keys:
Unaccepted Keys:
Rejected Keys:
至此,一个简单的saltstack环境就已经搭建好了。
一些注意事项和说明:
a) master使用两个端口和minion通信,要确保这两个端口通信正常。
- 4505 publish_port 消息发布系统端口
- 4506 ret_port 客户端与服务端通信端口
可以关闭掉防火墙,或者将端口添加至INPUT链表。
#iptables链表规则是自上而下,这里插入在REJECT ALL之前。
iptables -I INPUT 5 -p tcp --dport 4505 -j ACCEPT -m comment --comment "salt_publish_port"
iptables -I INPUT 5 -p tcp --dport 4506 -j ACCEPT -m comment --comment "salt_ret_port"
当然也可以在配置文件自定义端口。
#master配置文件
vim /etc/salt/master
#修改如下配置,注意空格!
publish_port: 1505
ret_port: 1506
#修改成自定义的端口即可,注意,minion节点也需要指定master端口。
#minion配置文件
vim /etc/salt/minion
#配置如下
master_port: 1506 #指定master通信端口即可
b) minion和master认证过程
1.minion在首次启动时,会在/etc/salt/pki/minion/下自动生成公钥和私钥
minion.pub(public key)和minion.pem(private key),并将公钥(minion.pub)发送给master
2.master在接收到minion的公钥后,通过salt-key命令接受minion,并将minion公钥
放在/etc/salt/pki/master/minions下,以minion id命名。这个时候,master就可以对minion发送指令了。
也可以配置为自动接受
#master配置
vim /etc/salt/master
#配置如下
auto_accept: True #修改为自动接受
五、saltstack简单应用
salt命令格式
salt '<操作目标>' <模块.方法> [参数]
引号中的操作目标,可以使用正则和通配符过滤、筛选。
-
salt 'shell正则' 命令
//使用通配符 -
salt -E 'prel正则' 命令
//使用正则表达式 -
salt -N $group 命令
//使用分组名称
可以在配置文件进行分组#编辑master文件 vim /etc/salt/master #配置如下 nodegroups: group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com and bl*.domain.com' group2: 'G@os:Debian and foo.domain.com'
-
salt -L 'server_id1,server_id2,server_id3' 命令
//指定多个目标id -
salt -G 'osrelease:6.9' 命令
//指定os版本为6.9
示例:test.ping、cmd.run
#检测通讯是否正常
salt '*' test.ping
#test.ping
[root@localhost ~]# salt '*' test.ping
web137:
True
mysql138:
True
#执行命令
salt '*' cmd.run 'df -Th'
#cmd.run
[root@localhost ~]# salt '*' cmd.run 'df -Th'
mysql138:
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
ext4 18G 968M 16G 6% /
tmpfs tmpfs 491M 12K 491M 1% /dev/shm
/dev/sda1 ext4 477M 52M 400M 12% /boot
web137:
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
ext4 18G 968M 16G 6% /
tmpfs tmpfs 491M 12K 491M 1% /dev/shm
/dev/sda1 ext4 477M 52M 400M 12% /boot
怎么知道有哪些模块可用?怎么知道模块有哪些方法可以用、怎么用?
#获取所有支持的模块
salt 'web137' sys.list_modules
#
[root@localhost ~]# salt 'web137' sys.list_modules
web137:
- acl
- aliases
- alternatives
- archive
- artifactory
后面部分省略
#获取模块说明文档
salt 'web137' sys.doc test
#
[root@localhost ~]# salt 'web137' sys.doc test
'test.arg:'
Print out the data passed into the function ``*args`` and ```kwargs``, this
is used to both test the publication data and cli argument passing, but
also to display the information available within the publication data.
Returns {"args": args, "kwargs": kwargs}.
CLI Example:
salt '*' test.arg 1 "two" 3.1 txt="hello" wow='{a: 1, b: "hello"}'
'test.arg_repr:'
Print out the data passed into the function ``*args`` and ```kwargs``, this
is used to both test the publication data and cli argument passing, but
also to display the information available within the publication data.
Returns {"args": repr(args), "kwargs": repr(kwargs)}.
CLI Example:
salt '*' test.arg_repr 1 "two" 3.1 txt="hello" wow='{a: 1, b: "hello"}'
后面部分省略
软件包的安装
#pkg.install
salt 'web137' pkg.install tree
#
[root@localhost ~]# salt 'web137' pkg.install tree
web137:
----------
tree:
----------
new:
1.5.3-3.el6
old:
pkg 函数会自动将本地系统包管理器映射到相同的salt函数。这意味着 pkg.install 在基于Red Hat系统上将使用 yum 而在Debian系统上则使用 apt 来安装包。
grains模块说明
grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等。
#列出所有的 grains 项目名字
[root@localhost ~]# salt 'web137' grains.ls
web137:
- SSDs
- cpu_flags
- cpu_model
- cpuarch
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- gpus
#列出所有的 grains 项目名以及值
[root@localhost ~]# salt 'web137' grains.items
web137:
----------
SSDs:
cpu_flags:
- fpu
- vme
- de
- pse
- tsc
#也可以在minion配置自定义信息
#编辑minion配置,注意空格!
vim /etc/salt/minion
grains:
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15
有了这些信息之后,在远程执行命令时就很方便。我们可以按照 grains 的一些指标来操作。如上面提到,salt -G 'osrelease:6.9' 命令。
pillar模块说明
pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
#编辑配置文件
vim /etc/salt/master
#添加
pillar_roots:
base:
- /srv/pillar
#如果pillar文件夹不存在,新建文件夹
mkdir -p /srv/pillar
#修改配置文件后,重启一下master
service salt-master restart
#新建入口文件top.sls
vim /srv/pillar/top.sls
#添加内容
base:
'web137': #指定minion节点
- web137_info
#新建web137_info.sls文件
vim /srv/pillar/web137_info.sls
#添加内容,注意分号后面有空格!
conf: /etc/web137.conf
myname: webserver
#刷新一下pillar状态
salt '*' saltutil.refresh_pillar
#查看一下
salt 'web137' pillar.items
#
[root@localhost pillar]# salt 'web137' pillar.items
web137:
----------
conf:
/etc/web137.conf
myname:
webserver
#可以指定单个
salt 'web137' pillar.item conf
#
[root@localhost pillar]# salt 'web137' pillar.item conf
web137:
----------
conf:
/etc/web137.conf
#通过 -I 也可以作为匹配信息
salt -I 'myname:webserver' test.ping
#
[root@localhost pillar]# salt -I 'myname:webserver' test.ping
web137:
True
其他杂项
#远程传输文件,将本地文件copy到节点
root@localhost:~# salt-cp '' ./abc.txt /opt/
{'ftp138': {'/opt/abc.txt': True}, 'web137': {'/opt/abc.txt': True}}
#磁盘使用
[root@salt-master /]# salt '' disk.usage
#网络接口
[root@salt-master /]# salt '' network.interfaces
#文件压缩
root@localhost:~# salt '' archive.gzip /opt/abc.txt
#文件解压缩
root@localhost:~# salt '' archive.gunzip /opt/abc.txt.gz
#拷贝文件到客户端
salt '' cp.get_file salt://apache.txt /tmp/cp.txt
#拷贝目录到客户端
salt '' cp.get_dir salt://test /tmp
#显示存活的客户端
salt-run manage.up
#执行服务端脚本
salt '' cmd.script salt://test/shell.sh
六、saltstack高级应用
1、配置管理安装apache
#编辑配置文件
vim /etc/salt/master
#添加下面配置
file_roots:
base:
- /srv/salt
#环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。
#新建目录salt
mkdir -p /srv/salt
#新建top.sls文件
vim /srv/salt/top.sls
#添加内容
base:
'web137':
- apache
#新建apache.sls文件
vim /srv/salt/apache.sls
#添加,特别要注意空格!
apache-service: #自定义id名称
pkg.installed: #包安装函数
- names: #如果只有一个服务 - name:httpd
- httpd #包名
- httpd-devel
file.managed:
- name: /etc/httpd/conf/httpd.conf #目标文件位置
- source: salt://httpd.conf #源文件,将配置文件放在/srv/salt/目录下
- user: root #文件所属用户
- group: root #文件所属组
- mode: 644 #文件权限
service.running: #指定服务运行
- name: httpd #服务名称
- enable: True #设置开机自启
#
salt 'web137' state.highstate
#或者直接指定文件
salt 'web137' state.sls apache #不需要.sls
2、目录操作
#编辑top.sls文件
vim /srv/salt/top.sls
base:
'mysql138' :
- diroper
#新建diroper文件
vim /srv/salt/diroper.sls
diroper:
file.recurse:
- name: /tmp/diroper
- source: salt://diroper
- user: root
- file_mode: 644
- dir_mode: 755
- mkdir: True
- clean: True #删除源文件则目标也会跟着删除
#应用
salt 'mysql138' state.highstate
3、远程执行脚本
#添加
cmdexe:
- onlyif: test -f /tmp/123.txt
- names:
- touch /tmp/cmdtest.txt
- mkdir /tmp/cmdtest
- user: root
#添加
shell-test:
cmd.script:
- source: salt://test/1.sh
- user: root
4、管理crontab
#添加
cron-test:
cron.present: #把 cron.present: 改成 cron.absent为删除
- name: /bin/touch /tmp/111.txt
- user: root
- minute: '' #注意星号要使用单引号
- hour: 20
- daymonth: 1-10
- month: '3,5'
- dayweek: ''
七、saltstack开发
import salt.client
client = salt.client.LocalClient()
ret = client.cmd('*','test.ping')
print ret
八、总结和参考
-
配置文件都是键值对的形式,需要特别注意空格。
-
以上演示的是都在linux环境下部署,saltstack是可以支持多环境,但需要注意的是master不支持安装在windows环境。
-
笔记未涉及到部分
- windows配置、云配置
- web界面
- 架构中还有一个类似代理层的syndic
参考网址
网友评论