lunix salt 用法
安装架构是,master /minion
安装salt的依赖模块
python
zeromq 是一个消息队列 ,master和minion通信,需要将master发送的命令,放入一个队列中
rabbitmq
rpc 远程消息调用
pyzmp
pycrypto
msgpack-python
yaml
-是一个新兴的语法格式
salt
ansible
python
k8s
都是遵循yaml语法的配置文件格式
jinja2
模板语言
#服务器环境准备
1.master 讲师机
ip 192.168.12.96 node1 安装salt-master
192.168.12.89 minion1
192.168.12.121 minion2
192.168.12.8 minion3
3.关闭所有节点的防火墙,以免影响实验
通过主机名通信
192.168.12.89 minion1
192.168.12.121 minion2
192.168.12.8 minion3
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all #清空缓存
yum makecache #生成yum缓存
1.node1端安装salt-master
yum install salt-master -y
yum install salt-minion -y
mv /etc/salt/master /etc/salt/master.bak
1.master的配置文件 /etc/salt/master
interface: 0.0.0.0 #绑定到本地的0.0.0.0地址
publish_port: 4505 #管理端口,命令发送
user: root #运行salt进程的用户
worker_threads: 5 #salt运行线程数,线程越多处理速度越快,不要超过cpu个数
ret_port: 4506 #执行结果返回端口
pidfile: /var/run/salt-master.pid #pid文件位置
log_file: /var/log/salt/master #日志文件地址
auto_accept: False
mv /etc/salt/minion /etc/salt/minion.bak
2.三个minion的配置文件/etc/salt/minion
master: node1
master_port: 4506
user: root
id: s14minion1 #表示minion身份信息的,这里要修改,三个节点,为不同的id
acceptance_wait_time: 10
log_file: /var/log/salt/minion
8.启动salt-master和salt-minion
systemctl start salt-master
systemctl start salt-minion
9.在salt软件启动的时候,会进行通信连接,master可以检测到minion的身份地址,此时还未接收key,还未通信,需要认证秘钥才可以通信
salt-key -L #查看所有主机秘钥信息
#salt-key参数解析
-L #查看KEY状态
-A #允许所有
-D #删除所有
-a #认证指定的key
-d #删除指定的key
-r #注销掉指定key(该状态为未被认证)
#在秘钥通信之前,最好进行秘钥检验
master端:
salt-key -f 指明节点id #查看节点的秘钥信息
minion端:
salt-call --local key.finger #查看自己的秘钥信息,与master端的进行对比
salt-key -a minion-id #指明接收一个minion
salt-key -A # 接收所有minion的秘钥
salt "*" test.ping #通过salt主命令 匹配所有的已接收的主机 发送ping命令,会得到True 或false
salt "*" cmd.run #通过执行命令接口,对所有主机,执行命令
salt "*" cmd.run "yum install nginx -y #对所有主机发送安装nginx的命令
10.salt常用命令
1.salt的命令直接输入,叫做执行模块
2.saltstack提供了自己的脚本语言 s14salt.sls ,状态模块
3.salt的命令语法格式
salt --summary '*' cmd.run 'yum remove nginx -y'
--summary是返回salt命令的执行成功状态
"*" 目标匹配字符串
cmd.run 模块函数,对所有匹配到的机器,执行后面的参数
'yum remove nginx -y' #参数如下
--out=json #返回salt执行结果为json格式 #json数据反馈给API
#cmd.run和cdm.run_all是返回结果的详细的差别
salt 's14minion[1,2,3]' pkg.version redis
salt 's14minion[1,2,3]' pkg.download redis#只下载redis的rpm包,不安装这是pkg.download函数的功能
pkg.install
pkg.version
pkg.remove
pkg.version
salt '*' sys.list_functions pkg
#service模块,练习远程安装启动nginx
salt 's14minion[1,2,3]' pkg.install nginx
#通过service模块管理服务
salt --out=yaml "*" service.status nginx
#大字典 s14值是字典,字典中有两个key,一个是男同学key,值是列表,一个是女同学key,值是列表
{
s14:
{
"男同学":['kangchen','xiaoma'],
"女同学":['wengang','xiaoxue','xiaodilei'],
}
}
在线yaml配置文件编写
http://www.bejson.com/validators/yaml_editor/
#yaml的对象,就是python的字典通过冒号指明字典
#yaml的数组,就是python的列表,通过 横杠 表示 -
#作用域通过缩进层级关系区分
#空格数量保持一致即可,不要求是几个,默认是2个空格
男同学:
- kangchen
- xiaoma
- xiaoyu
女同学:
- wengang
- wengang2
- xiaowengang3
#对应的python数据结构
{ s14:
{ '男同学': [ 'kangchen', 'xiaoma', 'xiaoyu' ],
'女同学': [ 'wengang', 'wengang2', 'xiaowengang3' ] } }
在命令行输入的命令都是 执行模块
#state模块可以执行salt的sls文件
1.更改配置文件,添加如下参数,注意yaml的语法(修改了文件要重启salt服务)
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
test:
- /srv/salt/test/
systemctl restart salt-master
systemctl restart salt-mion
#注意重启了服务,秘钥需要再次接受
salt-cp "*" /srv/salt/base/nginx.sls /srv/salt/base/ #将master机器上的nginx.sls,批量分发到所有节点上
#
salt "*" grains.item osfullname #通过item方法,通过key,返回单独的value
salt "*" grains.item ipv4
salt "*" grains.item ipv4 os hostname #支持多key的方式查看信息
salt -G 'osrelease:7*' cmd.run "echo 'i am from master....' > /tmp/salt.txt"
#自定义设置granis数据
salt "*" grains.setval my_class s14
salt "*" grains.delval my_class
设置key value的操作 是调用 __setitems__
del __del__
__str__
__len__
salt介绍
saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。
salt强大吗
系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等。如果主机数量庞大,单靠人工维护实在让人难以忍受。
早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是1、系统配置管理,2、远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行。
salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。
不管是几台、几百台、几千台服务器,都可以使用salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令。
Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。
saltstack的运行方式
- Local 本地运行,交付管理
- Master/Minion <<< 常用方式
- Salt SSH 不需要客户端
salt部署基本架构
在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。
salt架构中的一种就是master > minion。
在远程执行系统中,salt用python通过函数调用完成任务。
运行salt依赖包
python zeromq pyzmp pycrypto msgpack-python yaml jinja2
解决依赖包最简单的办法就是用安装包管理器,yum工具
服务器环境准备
服务器环境 | centos7(master) | centos7(master) |
ip地址 |
192.168.178.131 | 192.168.178.132 |
身份 |
master | slave |
软件包 |
salt-master | salt-minion |
修改虚拟机ip地址为静态地址,并且确保可上网
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="7d4f9ede-810f-4976-a01b-250b845c99cc" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.11.131 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=119.29.29.29
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="f9fc5929-8594-466e-a041-34caee8c1e32" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.11.132 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=119.29.29.29
# Generated by NetworkManager nameserver 119.29.29.29
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.11.132 slave 192.168.11.131 master
关闭服务器安全策略
关闭firewalld systemctl disable firewalld systemctl stop firewalld 关闭iptables iptables -F 关闭selinux
安装saltstack
salt软件包需要epel源的支持,那么下载
EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum clean all #清空缓存yum makecache #生成yum缓存
安装好epel源就可以开始安装salt了
查看salt包yum list salt 安装salt-master yum install salt-master -y
安装salt-minion yum install salt-minion -y
salt端口
安装好salt之后开始配置,salt-master默认监听两个端口:
4505 publish_port 提供远程命令发送功能 4506 ret_port 提供认证,文件服务,结果收集等功能 确保客户端可以通信服务器的此2个端口,保证防火墙允许端口通过。因此在测试环境直接关闭防火墙。
配置文件
salt-master的配置文件是/etc/salt/master salt-minion的配置文件是/etc/salt/minion 配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面
配置salt-master
超哥的salt-master文件
[root@master ~]# grep -v ^# /etc/salt/master|grep -v ^$ interface: 0.0.0.0 #绑定到本地的0.0.0.0地址 publish_port: 4505 #管理端口,命令发送 user: root #运行salt进程的用户 worker_threads: 5 #salt运行线程数,线程越多处理速度越快,不要超过cpu个数 ret_port: 4506 #执行结果返回端口 pidfile: /var/run/salt-master.pid #pid文件位置 log_file: /var/log/salt/master #日志文件地址 #自动接收minion的keyauto_accept: False
超哥的satl-minion文件
[root@slave ~]# grep -v ^# /etc/salt/minion|grep -v ^$ master: master master_port: 4506 user: root id: slave acceptance_wait_time: 10 log_file: /var/log/salt/minion
启动salt-master和salt-minion
systemctl start salt-minion systemctl start salt-master #检查salt状态systemctl status salt-minionsystemctl status salt-master
在master上接收minion秘钥
在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。
在salt-master执行
salt-key命令用于管理mionion秘钥
[root@master ~]# salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: slave #此时已经出现slave Rejected Keys:
此时slave已经出现在unaccepted keys中,说明minion已经和master联系,并且master已经获取了minion的公钥,等待下一步指令。
检查master和minion的秘钥匹配
在master上执行
[root@master ~]# salt-key -f slave Unaccepted Keys: slave: 0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea
然后可以在minion上获取minion的秘钥
[root@slave ~]# salt-call --local key.finger local: 0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea
因此可确认秘钥匹配,在master上接收秘钥
[root@master ~]# salt-key -a slave The following keys are going to be accepted: Unaccepted Keys: slave Proceed? [n/Y] y Key for minion slave accepted.
确认接收秘钥后,检验minion秘钥是否被接收
[root@master ~]# salt-key -L Accepted Keys: slave Denied Keys: Unaccepted Keys: Rejected Keys:
秘钥接收完成后,就可以执行第一条salt啦
salt-key
只有Master
接受了Minion Key
后,才能进行管理。具体的认证命令为salt-key
常用的有如下命令。
[root@linux-node1 ~]# salt-key -L Accepted Keys: #已经接受的key Denied Keys: #拒绝的key Unaccepted Keys:#未加入的key Rejected Keys:#吊销的key #常用参数 -L #查看KEY状态 -A #允许所有 -D #删除所有 -a #认证指定的key -d #删除指定的key -r #注销掉指定key(该状态为未被认证) #在master端/etc/salt/master配置 auto_accept: True #如果对Minion信任,可以配置master自动接受请求
salt-key的使用
#列出当前所有的key [root@salt0-master ~]# salt-key Accepted Keys: salt1-minion.example.com salt2-minion.example.com salt3-minion.example.com salt4-minion.example.com Denied Keys: Unaccepted Keys: Rejected Keys: #添加指定minion的key [root@salt0-master ~]# salt-key -a salt1-minion.example.com -y #添加所有minion的key [root@salt0-master ~]# salt-key -A -y #删除指定的key [root@salt0-master ~]# salt-key -d salt1-minion.example.com -y #删除所有的key [root@salt0-master ~]# salt-key -D -y
日常命令参数
首先知道master和minion都安装了什么文件,然后才知道怎么操作
master端
rpm -ql salt-master
/etc/salt/master # salt master主配置文件 /usr/bin/salt #salt master 核心操作命令 /usr/bin/salt-cp #salt 文件传输命令 /usr/bin/salt-key #salt证书管理 /usr/bin/salt-master #salt master 服务命令 /usr/bin/salt-run #salt master runner命令
slave端
[root@slave ~]$rpm -ql salt-minion
/etc/salt/minion #minion配置文件 /usr/bin/salt-call #拉取命令 /usr/bin/salt-minion #minion服务命令 /usr/lib/systemd/system/salt-minion.service #minion启动脚本
第一条salt命令
[root@master ~]# salt '*' test.ping slave: True # salt 是一个命令 # * 表示目标主机, 在这里代表所有目标主机 # test.ping是salt远程执行的一个模块下面的方法。
这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活。
test模块实际上还有许多其他的函数
[root@master 192.168.199.155 ~]$salt '*' sys.list_functions test slave: - test.arg - test.arg_repr - test.arg_type - test.assertion - test.attr_call - test.collatz - test.conf_test - test.cross_test - test.echo - test.exception - test.fib - test.get_opts - test.kwarg - test.module_report - test.not_loaded - test.opts_pkg - test.outputter - test.ping - test.provider - test.providers - test.rand_sleep - test.rand_str - test.retcode - test.sleep - test.stack - test.try_ - test.tty - test.version - test.versions_information - test.versions_report
测试下test.echo
[root@master 192.168.199.155 ~]$salt '*' test.echo 'chaoge nb666' slave: chaoge nb666
test.fib生成斐波那契数列
菲波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和。
[root@master 192.168.199.155 ~]$salt '*' test.fib 50 slave: |_ - 0 - 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 1.09672546387e-05
小结
此前在机器上安装了salt minion和salt master,进行了最简单的连接,然后master接受了minion的秘钥,运行了第一条test.ping命令
salt命令组成结构
在命令行输入的命令都是 执行模块
等到命令写入到文件中, 就叫做状态模块
salt --help #即可查看salt帮助
[root@master 192.168.199.155 ~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]
salt命令 参数 目标 salt模块的函数 远程执行的参数
完整的五部分命令
#--summary参数显示salt命令的概要[root@master 192.168.199.155 ~]$salt --summary '*' cmd.run 'hostname' slave: slave ------------------------------------------- Summary ------------------------------------------- # of Minions Targeted: 1 # of Minions Returned: 1 # of Minions Did Not Return: 0 -------------------------------------------
列出所有salt的sys模块
#与系统交互的sys模块[root@master 192.168.11.72 ~]$salt 'slave' sys.list_modules
远程执行命令模块
cmd是超级模块,所有shell命令都能执行
[root@master 192.168.11.72 ~]$salt 'slave' cmd.run 'ps -ef|grep python' slave: root 905 1 0 07:31 ? 00:00:02 /usr/bin/python -Es /usr/sbin/tuned -l -P root 3843 1 0 11:05 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion root 3846 3843 0 11:05 ? 00:00:01 /usr/bin/python /usr/bin/salt-minion root 4031 1 0 11:31 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion root 4032 4031 0 11:31 ? 00:00:00 /bin/sh -c ps -ef|grep python root 4034 4032 0 11:31 ? 00:00:00 grep python
远程安装nginx
#在minion上安装nginx [root@master 192.168.11.72 ~]$salt 'slave' pkg.install "nginx" #卸载minion上的nginx [root@master 192.168.11.72 ~]$salt 'slave' pkg.remove "nginx" #检查pkg包的版本 [root@master 192.168.11.72 ~]$salt 'slave' pkg.version "nginx"
远程管理服务模块
管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块
[root@master 192.168.11.72 ~]$salt 'slave' service.start "nginx" slave: True [root@master 192.168.11.72 ~]$salt 'slave' service.status "nginx" slave: True [root@master 192.168.11.72 ~]$salt 'slave' service.stop "nginx" slave: True
与标准的Linux命令一样,salt的命令一样用法
--out控制salt命令结果输出的格式
JSON
[root@master 192.168.199.155 ~]$salt --out=json '*' cmd.run_all 'hostname' { "slave": { "pid": 2268, "retcode": 0, "stderr": "", "stdout": "slave" } }
YAML
[root@master 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname' slave: pid: 2289 retcode: 0 stderr: '' stdout: slave
YAML讲解
在学习saltstack过程中,第一要点就是States编写技巧,简称SLS文件。这个文件遵循YAML语法。初学者看这玩意很容易懵逼,来,超哥拯救你学习YAML语法 json xml yaml 数据序列化格式 yaml容易被解析,应用于配置文件 salt的配置文件是yaml配置文件,不能用tab saltstack,k8s,ansible都用的yaml格式配置文件 语法规则 大小写敏感 使用缩进表示层级关系 缩进时禁止tab键,只能空格 缩进的空格数不重要,相同层级的元素左侧对其即可 # 表示注释行 yaml支持的数据结构 对象: 键值对,也称作映射 mapping 哈希hashes 字典 dict 冒号表示 key: value key冒号后必须有 数组: 一组按次序排列的值,又称为序列sequence 列表list 短横线 - list1 纯量: 单个不可再分的值 对象:键值对 yaml first_key: second_key:second_value python { 'first_key':{ 'second_key':'second_value', } }
YAML是YAML Ain't Markup Language的首字母缩写,YAML的语法简单,结构体通过空格展示项目使用 '-' 代表键值对通过 ':' 分割
YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,禁止用tabs!!!
Python中的字典是简单的键值对,go语言中称作哈希表map字典的key通过冒号分割 key在YAML中表现形式是一个冒号结果的字符串my_key: my_value转化到python语法中,上述命令为{'my_key':'my_value'} value还可以通过缩进和key关联,四个空格!!my_key: my_value 转化为python语法同样的{'my_key':'my_value'} YAML语法中字典是可以嵌套的one_dict_key: two_dict_key:value_dict转化为python语法
{
'one_dict_key':{
'two_dict_key':'value_dict'
}
}
短横杠 YAML语法表示列表,使用一个横杠加一个空格 多个项使用同样的缩进级别作为同一个列表的部分 - list_value_one - list_value_two - list_value_three列表可以作为一个键值对的value,例如一次性要安装多个软件my_dict: - l1 - l2 - l3转化为python代码理解就是
{
'my_dict':['l1','l2',;l3]
}
目标定位字符串
之前的salt命令我们都是使用 salt '*'控制所有minion,并且我们只有一个“slave”,但是生产环境的服务器很可能是成千上百的minion,因此需要灵活地定位所需的服务器并且执行远程命令。
1.全局匹配 [root@master 192.168.11.72 ~]$salt '*' test.ping slave: True
Linux通配符 * 代表任意字符,或空字符串 ? 代表一个字符,不可以为空 [a-z] [0-9] 代表任何一个小写字母 [root@master 192.168.11.72 ~]$salt 'slav?' test.ping slave: True [root@master 192.168.11.72 ~]$salt '[a-z]lave' test.ping slave: True salt海支持python的re正则表达式
state模块定义主机状态
之前执行的远程命令,都是一个过程式的,类似一段shell或者python脚本执行,执行一次触发一次相同的功能。
那么大量的minion上运行远程命令就必须使用salt提供的“状态管理”了,状态是对minion的一种描述和定义,运维不需要关心部署是如何完成的,只需要描述minion需要达到什么状态。
接下来通过state模块部署nginx
master端
vim /etc/salt/master #打开注释,写入以下,必须严格遵循语法,空格 file_roots: base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - / srv/salt/prod
#此步骤在master和minion都需要执行,都需要文件夹,和nginx.sls文件
[root@master ~]$mkdir -p /srv/salt/{base,dev,test,prod}
[root@slave ~]$mkdir -p /srv/salt/{base,dev,test,prod}
#这个nginx.sls状态文件,在master和minion上都得有[root@master /srv/salt/base]$cat nginx.sls nginx-install: pkg.installed: - name: nginx nginx-service: service.running: - name: nginx - enable: True
解释下nginx.sls描述文件sls配置文件都遵循YAML语言描述 第一条命令使用了pkg.install安装命令,相对于运行了yum install,而此时state模块会判断nginx是否安装了,如果没有安装就进行安装,安装了就什么都不做。 状态描述都会遵循这个原则,只有检测到真实状态和所需状态不一就会执行此功能,这种性质叫做幂等性。
此时用state模块部署nginx软件,通过我们编写的nginx.sls描述性配置文件,命令行调用state模块的sls函数。
#启动命令,此时slave已经安装且存活了nginx,进行状态管理 [root@master /srv/salt/base]$salt 'slave' state.sls nginx
可以去slave测试关闭nginx,删除nginx,重新执行命令,一样可以安装启动nginx
通过master检查slave的nginx状态
[root@master 192.168.199.155 /srv/salt/base]$salt 'slave' cmd.run 'ps -ef|grep nginx' slave: root 8543 1 0 Sep14 ? 00:00:00 nginx: master process /usr/sbin/nginx nginx 8544 8543 0 Sep14 ? 00:00:00 nginx: worker process root 8592 8591 0 00:03 ? 00:00:00 /bin/sh -c ps -ef|grep nginx root 8594 8592 0 00:03 ? 00:00:00 /bin/sh -c ps -ef|grep nginx
Salt采集静态信息之Grains
如果你入职了,你的老板让你收集公司300台服务器的相关硬件信息,你是一台台登录呢?还是选择用salt收集呢?又或者用python的salt-api写脚本呢
Grains 是saltstack组件中非常重要之一,在配置部署时候回经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。 Minions的Grains信息是Minion启动时采集汇报给Master的Grains是以 key value形式存储的数据库,可以看做Host的元数据(metadata)Grains保存着收集到的客户端的详细信息如果slave机器数据变化,grains就过期了 在生产环境中需要自定义Grains,可以通过 Minion配置文件 Grains相关模块定义 Python脚本定义 salt 'slave' sys.doc grains#查看grains的命令用法
Grains
Grains人为是描述minion本身固有的静态属性数据,列出主机所有Grains数据
[root@master 192.168.11.72 ~]$salt 'slave' grains.items
slave:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
6.00
信息过长,已经省略
salt 'slave' grains.ls #列出所有grains方法
检索某些数据
[root@master 192.168.11.72 ~]$salt 'slave' grains.item os id host slave: ---------- host: slave id: slave os: CentOS
利用Grains静态信息定位主机
超哥以前公司有100+的redhat操作系统,80+的centos,在不知道salt之前很是懵逼。。
除了系统的不同,还有不同的系统版本,redhat6.x centos6.x..
两种写法:salt '*' grains.item key1 key2 key3salt '*' -G #定位Cenots的机器[root@master 192.168.11.72 ~]$salt -G 'os:CentOS' test.ping slave: True#定位操作系统系统是7系列的机器
[root@master 192.168.11.72 ~]$salt -G 'osrelease:7*' test.ping
slave:
True
#找出ip地址
salt '*' grains.item fqdn_ip4
因此用grains.items列出所有的数据匹配主机,以及根据单一信息定位数据,Grains还可以自定义来满足不同的需求。
自定义设置Grains数据
#设置数据[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_num 8 slave: ---------- cpu_num: 8#查询数据 [root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_num slave: ---------- cpu_num: 8
在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains
[root@slave 192.168.11.71 ~]$cat /etc/salt/grains cpu_num: 8
对于复杂的数据结构,可以添加灵活的JSON语法
[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]' slave: ---------- cpu_info: - Intel - Xeon - 10 [root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_info slave: ---------- cpu_info: - Intel - Xeon - 10
此时可以检查minion服务器上的grains文件
[root@slave 192.168.11.71 ~]$cat /etc/salt/grains cpu_info: - Intel - Xeon - '10' cpu_num: 8
因此Grains数据写入配置文件后,重启salt-minion服务,数据也不会丢失
想要删除可以通过grains.delval命令删除,或者去minion的配置文件删除配置一样完成操作(或者删除文件)
1.方法一,清空值 [root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_info slave: None [root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_num slave: None 2.方法二 删除minion的grains配置文件,重启服务
[root@slave 192.168.11.71 ~]$rm -rf /etc/salt/grains
[root@slave 192.168.11.71 ~]$!sys
systemctl restart salt-minion
检查结果删除成功
数据管理中心之Pillar组件
Pillar也是saltstack组件中非常重要的组件之一,称作数据管理中心,经常配合states在大规模的配置管理中使用。
Pillar是动态的,存储在master端,提供和给minion端
Pillar在SaltStack中主要的作用是存储和定义配置管理中需要的一些数据,比如软件版本号,用户账号密码等,保证敏感数据不被其他minion看到
存储格式与Grains类似,都是YAML格式
在master配置文件中有一段Pillar settings选项专门定义Pillar的参数
cat /etc/salt/master #此配置代表pillar的工作根目录,在/srv/pillar下,然后可以新建sls文件 #pillar_roots: # base: # - /srv/pillar
默认pillar的工作目录在/srv/pillar目录下,执行如下代码
mkdir -p /srv/pillar #指定环境,标记,引用packages.sls和services.sls vim /srv/pillar/top.sls base: '*': - packages - services vim /srv/pillar/packages.sls nginx: packages-name: nginx version: 1.12.2 vim /srv/pillar/packages.sls nginx: port: 80 user: root
检查我们设置的pillar值
[root@master 192.168.199.155 /srv/pillar]$salt '*' pillar.item nginx slave: ---------- nginx: ---------- packages-name: nginx port: 80 user: root version: 1.12.2
Pillar与Grains对比
pillar与Grains对比 类型 数据采集方式 应用场景 定义位置 Grains 静态 minion启动时收集 数据查询 目标选择 配置管理 minion Pillar 动态 master进行自定义 目标选择 配置管理 敏感数据 master
Python API调用SaltStack
SaltStack本身提供salt(usr/bin/salt)来交互管理,但是去服务器上敲命令肯定不是一个长远之计,这时候python就体现了nb的功能。
Python API就是给Python提供的API使用,需要在SaltStack master上运行
实例代码
[root@master ~]$python Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向所有minion发送命令 {'slave': 'slave'}
因此python API就是提供了向saltstack发送命令的入口。
通过API获取saltstack的配置文件
获取master配置文件
>>> import salt.config #导入salt配置模块 >>> m_opts=salt.config.client_config('/etc/salt/master') #读取salt配置文件,得到一个字典数据
获取minion配置文件
Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> salt.config.minion_config('/etc/salt/minion') #读取minion配置文件,得到字典数据,通过字典方法可以查看信息
Python API介绍
/usr/bin/salt默认使用的接口是LocalClient,该接口只能在salt master上使用
[root@master ~]$python Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向所有minion发送命令 {'slave': 'slave'}
逐条返回结果,local.cmd_iter()
>>> ret=local.cmd_iter('*','test.ping') >>> ret <generator object cmd_iter at 0x7f886d455c80> >>> for i in ret: ... print i ... {'slave': {'retcode': 0, 'ret': True}}
菲波那切数列
>>> local.cmd('*','test.fib',[10]) {'slave': [[0, 1, 1, 2, 3, 5, 8], 2.1457672119140625e-06]}
检查minion服务器信息
>>> local.cmd('*','cmd.run',['hostname']) {'slave': 'slave'} >>> local.cmd('*','cmd.run',['ifconfig']) >>> local.cmd('*','cmd.run',['crontab -l']) >>> local.cmd('*','cmd.run',['df -h'])
启停minion的服务,如nginx
>>> local.cmd('*','service.stop',['nginx']) {'slave': True} >>> local.cmd('*','service.status',['nginx']) {'slave': False} >>> local.cmd('*','service.start',['nginx']) {'slave': True}
lunix salt 用法的更多相关文章
- Apache账户密码加密方式介绍
一.apache密码存储格式 apache的用户密码一般会生成保存在.htpasswd文件中,保存路径由用户创建时确定,根据使用加密算法有五种保存格式: [注]:如果用户指定了保存密码的文件名,视用户 ...
- Linux centosVMware 自动化运维认识自动化运维、启动salt相关服务、saltstack配置认证、salt-key命令用法、saltstack远程执行命令、saltstack - grains、saltstack – pillar
一.认识自动化运维 传统运维效率低,大多工作人为完成 传统运维工作繁琐,容易出错 传统运维每日重复做相同的事情 传统运维没有标准化流程 传统运维的脚本繁多,不能方便管理 自动化运维就是要解决上面所有问 ...
- saltstack之salt event事件用法
event是一个本地的ZeroMQ PUB Interface,event是一个开放的系统,用于发送信息通知salt或其他的操作系统.每个event都有一个标签.事件标签允许快速制定过滤事件.除了标签 ...
- lunix cat tail more等用法
cat主要有三大功能: 1.一次显示整个文件. $ cat filename 2.从键盘创建一个文件. $ cat > filename 只能创建新文件,不能编辑已有文件. 3.将几 ...
- openssl用法详解
OpenSSL 是一个开源项目,其组成主要包括一下三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls openssl可以 ...
- saltstack:使用教程之二高级模块用法Grains、Pillar
1.grains用法: 在客户端服务启动的时候收集客户的基础信息,在配置发生变化后也可以通过master重新同步 显示一个客户端的所有项目: [root@node5 ~]# salt "no ...
- Cookie、Session登陆验证相关介绍和用法
一.Cookie和Session 首先.HTTP协议是无状态的:所谓的无状态是指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应直接影响,也不会直接 ...
- salt基本使用之一(1)
1.帮助文档 以cmd函数为例子说下salt中的一些帮助信息 # 查看指定modules用法 salt '*' sys.doc cmd # 查看所有的modules列表 salt '*' sys.li ...
- pandas用法小结
前言 个人感觉网上对pandas的总结感觉不够详尽细致,在这里我对pandas做个相对细致的小结吧,在数据分析与人工智能方面会有所涉及到的东西在这里都说说吧,也是对自己学习的一种小结! pandas用 ...
随机推荐
- 如果指针为空,返回ERROR
if(!p) //是!p而不是p return ERROR;
- Maven项目main和test文件夹说明
需要自己来手动调整项目目录, Maven项目通常划分为 main 和 test 两部分,main 中存放实际项目资源,test 存放测试项目资源,二者内部同时又划分为 source 和 resourc ...
- c166 -div
unsigned short a=10; unsigned short b; unsigned short c;unsigned long d; b = (unsigned short)(d/2400 ...
- NET设计模式 第二部分 结构性模式(14):结构型模式专题总结
——探索设计模式系列之十五 Terrylee,2006年5月 摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能( ...
- SSH框架搭建demo
1.新建Java Web工程 2.添加Struts2.1框架支持 去除冲突包:antlr-2.7.2.jar 一般项目加上这三个包足够,后期可以视项目需求增加支持包: 2.1配置web.xml文件 增 ...
- Eclipse安装插件的“最好方法”:dropins文件夹的妙用
在Eclipse3.4以前安装插件非常繁琐. 在Eclipse3.5以后插件安装的功能做了改进.而且非常方便易用. 我们只需要把需要的插件复制(拖放)到eclipse\dropins,然后插件就安装成 ...
- php代码覆盖率执行
我们做平台项目时,我会为整个项目核心架构拆分成三部分:前段(pc展示.mobile展示).网关.中间层 中间层业务逻辑开发人员怎么保证自己的业务逻辑是严谨的,每个测试用例都run codecover呢 ...
- Device Tree碎碎念
首先推荐elinux.org上一篇关于Device Tree的文章: http://elinux.org/Device_Tree_Usage 这是一篇关于Device Tree的入门文章.对英文犯怵的 ...
- 【AMQ】之安装,启动,访问
1.访问官网下载AMQ 2.解压下载包 windows直接找到系统对应的win32|win64 双击activemq.bat 即可 linux执行 ./activemq start 访问: AMQ默认 ...
- 工具类System,Runtime,Math,Date,Calendar
API--- java.lang.System: 属性和行为都是静态的. long currentTimeMillis(); // 返回当前时间毫秒值 exit(); // 退出虚拟机 Prop ...