在上一篇文章《干货篇 | 自动化运维工具-saltstack(上)》和《干货篇 | 自动化运维工具-saltstack(中)》中,向大家介绍了saltstack是什么,它与ansible的区别以及部署了一台master和两台minion
还介绍了salt的基础命令和分组管理,以及教大家如何编写SLS(Salt State)文件
那么今天我将继续为大家介绍saltstack
话不多说,开始进入正题
Grains是saltstack的一个组件,存放在minion端
当minion启动时会把收集到的数据静态存放在Grains中,只有minion重启时才会进行数据的更新
1.应用场景
信息查询,用于查询minion的IP、OS等静态信息
在target中使用,匹配minion
在SLS中使用,配置管理模块
2.常用命令
列出minion1所有的静态数据key
salt 'minion1' grains.list列出node1所有的静态数据key与value
salt 'minion1' grains.items 列出所有minion的OS
salt '*' grains.item os对匹配到的minion执行操作
salt -G 'os:CentOS' cmd.run ‘echo haha’ 3.Grains配置
我们可以在/etc/salt/grains中定义
[root@minion1 ~]#vim /etc/salt/grainsrole: nginxenv: testmyname: edison
也可以在/etc/salt/minion中定义,但是要满足YAML格式
[root@minion1 ~]#vim /etc/salt/miniongrains:role:- nginxenv:- testmyname:- edison
4.自定义Grains
我们可以定制Grains来用于分组管理
写一个python脚本,在/srv/salt/下创建一个_grains的目录,然后在这个目录中创建.py文件
[root@minion1 ~]# mkdir /srv/salt/_grains[root@minion1 ~]# vim /srv/salt/_grains/test.py#!/usr/bin/env pythondef my_grains():grains = {}grains['os'] = 'Redhat'grains['name'] = 'Python'return grains
然后在master端获取Grains
#列出多个[root@master ~]# salt '192.168.244.129' grains.item role env myname#列出一个[root@master ~]# salt '192.168.244.129' grains.get myname
Grains在远程执行命令时很方便,我们可以按照Grains的一些指标来操作 比如把所有的web服务器的grains的role设置为nginx,这样我们就可以批量对nginx服务器进行操作
[root@minion1 ~]# vim /srv/salt/_grains/test.py#!/usr/bin/env pythondef my_grains():grains = {}grains['os'] = 'Redhat'grains['role'] = 'nginx'return grains
[root@master ~]# salt -G role:nginx cmd.run 'hostname'[root@master ~]# salt -G os:Redhat cmd.run 'hostname'
5.优先级
系统自带——>grains文件写的——>minion配置文件写的——>自己写的
##每次修改数据都需要重启服务或刷新grains操作才会生效,这也印证了是静态数据[root@master ~]# salt '*' saltutil.sync_grains ##用于刷新grains的数据
Pillar和Grains不同,Pillar是在master上定义的,并且是针对minion而去定义的信息,不需要到minion上进行操作
像一些重要的数据密码都可以存储在pillar上,pillar存储的是动态信息
pillar是存储在master端,缓存在minion端,存储的是minion的一些配置信息
1.应用场景
比较敏感的数据,比如密码,key等
特殊数据到特定Minion上
动态的内容
2.常用命令
查看minion的pillar信息
salt '*' pillar.items查看某个pillar值
salt '*' pillar.item <key> #只能看到顶级的salt '*' pillar.get <key>:<key> #可以取到更小粒度的
刷新pillar
salt '*' saltutil.refresh_pillar3.Pillar配置
先在master端修改配置文件,打开pillar组件目录
[]//找到如下内容,去掉注释pillar_roots:base:- /srv/pillar
自定义配置文件
[root@master ~]# vim /srv/pillar/test.slsconf: /etc/test.conf | myname: tpp
入口文件
[root@master ~]# vim /srv/pillar/top.slsbase:'slaver.test.com':- test
配置好后重启
[root@master ~]# systemctl restart salt-master更改完配置文件后,我们可以通过·刷新pillar配置来获取新的动态
[root@master ~]# salt '*' saltutil.refresh_pillar验证
[root@master ~]# salt 'slaver.test.com' pillar.items[root@master ~]# salt 'slaver.test.com' pillar.item conf[root@master ~]# salt 'slaver.test.com' pillar.item mynam
pillar同样可以用来作为salt的匹配对象
[root@master ~]# salt -I 'conf:/etc/123.conf' test.ping[root@master ~]# salt -I 'conf:/etc/123.conf' cmd.run 'w'
4.Pillar案例
案例一:通过yum方式安装apache
配置文件
[root@master ~]# vim /etc/salt/master //打开如下内容的注释,添加主目录file_roots:base:- /srv/saltpillar_roots:base:- /srv/pillar
创建目录以及编写入口文件
[root@master ~]# mkdir /srv/salt[root@master ~]# vim /srv/salt/top.slsbase:'slaver.test.com': #如果换成*,表示在所有minion执行apache模块- apache
编写pillar文件
[root@master ~]# vim /srv/salt/apache.slsapache-service: #自定义标签名pkg.installed: #函数以及方法- name: #如果只有一个服务,写成-name: httpd 一行即可- httpd- httpd-develservice.running:- name: httpd- enable: True
执行命令
[root@master ~]# salt 'slaver.test.com' state.highstate案例二:目录管理
编辑pillar文件
[root@master ~]# vim /srv/salt/editdir.slsedit-dir:file.recurse:- name: /tmp/testdir- source: salt://test1- user: root- file_mode: 644- dir_mode: 755- mkdir: True- clean: True#clean: True master处删除文件或目录,目标也会跟着删除,否则不会删除。可以默认设置为 False
新建测试目录
[root@master ~]# mkdir -p /srv/salt/test1[root@master ~]# vim /srv/salt/test1/1.txthello world
验证
[root@master ~]# salt 'slaver.test.com' state.sls editdir在master新建 my_dir 目录以及 test_dir.add 文件,删除 1.txt 文件
[root@master ~]# mkdir /srv/salt/test1/my_dir[root@master ~]# touch /srv/salt/test1/my_dir/2.txt[root@master ~]# touch /srv/salt/test1/testdir.add[root@master ~]# rm -rf /srv/salt/test1/1.txt
[]成功在minion /tmp/testdir/ 目录下创建了my_dir目录和test_dir.add文件,并删除了1.txt文件
值得注意的是要成功创建 my_dir 目录,前提是 master端的my_dir 目录下要有文件,比如这里的2.txt 文件,如若没有,客户端是不会创建 my_dir 目录的
案例三:远程执行
前面提到的远程执行命令 test.ping、cmd.run,直接敲在命令行不太规范和优雅,我们可以通过pillar实现远程执行命令
编写pillar文件
[root@master ~]# vim /srv/salt/cmdtest.slscmd-test:cmd.run:- onlyif: test -f /tmp/123.txt- names:- touch /tmp/cmdtest.txt- mkdir /tmp/cmdtest- user: root#onlyif条件:如果/tmp/123.txt存在,执行后面的命令;unless与之相反
执行命令
[]案例四:任务计划cron
编写pillar文件
[]cron-test:cron.present:- name: /bin/touch /tmp/111.txt- user: root- minute: '*'- hour: 20- daymonth: 1-10- month: '3,5'- dayweek: '*'
执行
[root@master ~]# salt "slaver.test.com" state.sls crontest
原文作者:咸鱼运维杂谈;如有侵权,请联系管理员删除。