ITPub博客

首页 > 数据库 > 数据库开发技术 > 干货篇 | 自动化运维工具-saltstack(下)

干货篇 | 自动化运维工具-saltstack(下)

原创 数据库开发技术 作者:咸鱼运维杂谈 时间:2022-07-27 21:31:00 3 删除 编辑

在上一篇文章《干货篇 |  自动化运维工具-saltstack(上)》和《干货篇 | 自动化运维工具-saltstack(中)》中,向大家介绍了saltstack是什么,它与ansible的区别以及部署了一台master和两台minion


还介绍了salt的基础命令和分组管理,以及教大家如何编写SLS(Salt State)文件


那么今天我将继续为大家介绍saltstack


话不多说,开始进入正题



Grains


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:    - nginx  env:    - test  myname:    - 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



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_pillar



3.Pillar配置


先在master端修改配置文件,打开pillar组件目录


[root@master ~]# vim /etc/salt/master //找到如下内容,去掉注释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-devel  service.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


[root@master ~]# salt 'slaver.test.com' state.sls editdir


成功在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与之相反


  • 执行命令


[root@master ~]# salt 'slaver.test.com' state.sls cmdtest



案例四:任务计划cron


  • 编写pillar文件


[root@master ~]# vim /srv/salt/crontest.slscron-test:  cron.present: #cron.absent是删除cron    - name: /bin/touch /tmp/111.txt #创建111.txt    - user: root    - minute: '*'    - hour: 20    - daymonth: 1-10    - month: '3,5'    - dayweek: '*'# *需要用单引号引起来。当然我们还可以使用 file.managed 模块来管理 cron,因为系统的 cron都是以配置文件的形式存在的


  • 执行


[root@master ~]# salt "slaver.test.com" state.sls crontest




扫码
关注

原文作者:咸鱼运维杂谈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
最新的技术文章首先发布在微信公众号:咸鱼运维杂谈 擅长Linux系统维护、开源软件维护、自动化运维等领域,博客主要偏向于学习笔记及经历分享

注册时间:2021-05-29

  • 博文量
    193
  • 访问量
    84243