设为首页 收藏本站
查看: 878|回复: 0

[经验分享] 简单使用saltstack-zero菌

[复制链接]

尚未签到

发表于 2018-7-31 08:12:07 | 显示全部楼层 |阅读模式
  笔记内容:简单使用saltstack
  笔记日期:2018-01-24


  • 24.5 saltstack远程执行命令
  • 24.6 grains
  • 24.7 pillar
  • 24.8 使用saltstack去安装httpd
  • 24.9 配置管理文件(分发文件)
24.5 saltstack远程执行命令
  saltstack的salt命令可以用于远程在minion端上执行命令,本节介绍一下salt的常用语法。
  1.test.ping用于测试能否ping通minion端,测试已认证的minion端是否存活:
  

[root@server ~]# salt '*' test.ping     # 这里的*表示测试所有已经认证的minion端  
server:
  True
  
client:
  True
  
[root@server ~]# salt 'client' test.ping   # 指定测试某一个minion端
  
client:
  True
  
[root@server ~]#
  

  2.cmd.run可以执行系统的命令,例如我要让所有机器都执行hostname命令:
  

[root@server ~]# salt '*' cmd.run "hostname"  # 但是如果是普通用户的话,只能执行普通用户能够执行的命令  
server:
  server
  
client:
  client
  
[root@server ~]#
  

  说明: 这里的必须是在master上已经被接受过认证的客户端,可以通过salt-key查到,通常是我们已经设定的id值。关于这部分内容,它支持通配、列表以及正则。 比如两台客户端test-01,test-02, 那我们可以写成salt 'test-\', salt 'test-0[12]'  salt -L 'test-01,test-02'   salt -E 'test-(01|02)'等形式,使用列表,即多个机器用逗号分隔,而且需要加-L,使用正则必须要带-E选项。 它还支持grains,加-G选项,pillar 加-I选项。
  支持正则表达式:
  

[root@server ~]# salt 'cli*' test.ping  
client:
  True
  
[root@server ~]# salt 'cli[a-z]*' test.ping
  
client:
  True
  
[root@server ~]#
  

  -L选项指定使用的是列表,需要用逗号进行分割:
  

[root@server ~]# salt -L 'server,client' cmd.run "hostname"  
client:
  client
  
server:
  server
  
[root@server ~]#
  

  有些正则表达式的使用需要加上-E来指定,不然不支持:
  

[root@server ~]# salt -E 'cl(i|e|n|t)*' cmd.run "hostname"  
client:
  client
  
[root@server ~]#
  

24.6 grains
  grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡IP、内核版本、cpu架构等等。
  

[root@server ~]# salt "client" grains.ls   # 列出所有的grains项目名字  
[root@server ~]# salt "client" grains.items   # 列出所有grains项目以及值
  

  注:grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的。我们可以根据grains收集到的一些信息,做配置管理、资产管理等工作。
  grains支持自定义信息,示例:
  1.在minion端上编辑配置文件:
  

[root@client ~]# vim /etc/salt/grains  # 增加自定义信息,格式是 键 : 值 形式的  
role: nginx
  
env: test
  

  2.配置完之后需要重启minion服务:

  systemctl restart salt-minion

  3.配置完成后,就可以回到master上,获取grains:
  

[root@server ~]# salt '*' grains.item role env  
client:
  ----------
  env:
  test
  role:
  nginx
  
server:
  ----------
  env:
  role:
  
[root@server ~]# salt '*' grains.item abc efg  # 如果我们获取不存在的grains信息,就只会返回空信息
  
server:
  ----------
  abc:
  efg:
  
client:
  ----------
  abc:
  efg:
  
[root@server ~]#
  

  可以根据grains获取到的一些属性信息来执行系统命令,可以起到一个匹配的作用:
  

[root@server ~]# salt -G role:nginx cmd.run 'hostname'  
client:
  client
  
[root@server ~]#
  

24.7 pillar
  pillar和grains不一样,pillar是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。
  pillar也支持自定义信息,配置自定义pillar示例:
  

[root@server ~]# vim  /etc/salt/master   # 在文件中搜索pillar_roots,然后去掉这几行的注释,注意保留空格  
pillar_roots:
  base:  # 键
  - /srv/pillar  # 值,这值配置的是一个目录
  

  重启salt-master服务:

  systemctl restart salt-master.service

  接着创建/srv/pillar目录,并且编辑一个子配置文件用于一会的测试:
  

[root@server ~]# mkdir /srv/pillar  
[root@server ~]# ls /srv/pillar
  
[root@server ~]# vim /srv/pillar/test.sls   # 内容如下,同样的是键值形式
  
conf: /etc/test.conf
  

  编写主配置文件:
  

[root@server ~]# vim /srv/pillar/top.sls  # 内容如下  
base:  # 表示根
  'client':  # 主机名,缩进两个空格
  - test   # 加载哪个前缀的配置文件,缩进四个空格
  

  然后重启master:

  systemctl  restart salt-master

  当更改完pillar配置文件后,我们可以通过刷新pillar配置来获取新的pillar状态:
  

[root@server ~]# salt '*' saltutil.refresh_pillar  
server:
  True
  
client:
  True
  
[root@server ~]#
  

  验证一下是能否识别到自定义的的pillar信息:
  

[root@server ~]# salt  '*' pillar.item conf  
server:
  ----------
  conf:
  
client:
  ----------
  conf:
  /etc/test.conf
  
[root@server ~]#
  

  pillar同样可以用来作为salt的匹配对象。例如:
  

[root@server ~]# salt  -I 'conf:/etc/test.conf' cmd.run "hostname"  
client:
  client
  
[root@server ~]#
  

24.8 使用saltstack去安装httpd
  通过saltstack工具,我们可以在指定的或所有的minion端上,安装某个服务或工具,本节演示如何使用saltstack在minion端安装httpd服务。
  1.在master上编辑配置文件:
  

[root@server ~]# vim /etc/salt/master    # 搜索file_roots,去掉以下几行的注释,注意保留空格  
file_roots:
  base:
  - /srv/salt
  

  2.重启服务:

  systemctl restart salt-master.service

  3.创建目录以及配置文件:
  

[root@server ~]# mkdir /srv/salt  
[root@server ~]# vim /srv/salt/top.sls  # 主配置文件
  
base:
  '*':  # *表示所有,前面有两个空格
  - httpd   # 前面有4个空格,表示在所有的客户端上执行httpd模块
  

  4.增加一个子配置文件:
  

[root@server ~]# vim /srv/salt/httpd.sls   # 增加以下内容  
httpd-service:  # 服务的名称
  pkg.installed:   # saltstack内置模块,用于执行安装命令
  - names:  # names的值是需要安装的包的名称
  - httpd  # 安装httpd 包
  - httpd-devel    # 安装httpd-devel 包
  service.running:   # saltstack内置模块,用于启动服务
  - name: httpd  # 启动httpd服务
  - enable: True  # True表示开机启动
  

  说明: httpd-service是id的名字,自定义的。pkg.installed 为包的安装函数或者说模块,下面是要安装的包的名字。service.running也是一个函数,来保证指定的服务启动,enable表示开机启动。
  5.在minion端上进行安装:
  

[root@server ~]# salt 'client' state.highstate    # 执行过程会比较慢,因为minion端上在执行yum安装命令  

  在minion端上可以看到,的确是在执行yum命令:
  

[root@client ~]# ps aux |grep yum  
root       4582 38.5  2.2 459440 87500 ?        D    18:28   0:01 /usr/bin/python /usr/bin/yum -y install httpd-devel
  
root       4599  0.0  0.0 112660   964 pts/0    S+   18:28   0:00 grep --color=auto yum
  
[root@client ~]#
  

  等master上的命令执行完成之后,到minion端上可以看到已经安装成功:
  

[root@client ~]# ps aux |grep httpd  
root       4704  0.1  0.3 384816 15432 ?        Ss   18:28   0:00 /usr/sbin/httpd -DFOREGROUND
  
apache     4714  0.0  0.2 387036  8084 ?        S    18:28   0:00 /usr/sbin/httpd -DFOREGROUND
  
apache     4715  0.0  0.2 387036  8084 ?        S    18:28   0:00 /usr/sbin/httpd -DFOREGROUND
  
apache     4716  0.0  0.2 387036  8084 ?        S    18:28   0:00 /usr/sbin/httpd -DFOREGROUND
  
apache     4717  0.0  0.2 387036  8084 ?        S    18:28   0:00 /usr/sbin/httpd -DFOREGROUND
  
apache     4718  0.0  0.2 387036  8084 ?        S    18:28   0:00 /usr/sbin/httpd -DFOREGROUND
  
root       4752  0.0  0.0 112660   964 pts/0    S+   18:30   0:00 grep --color=auto httpd
  
[root@client ~]# netstat -lntp |grep httpd
  
tcp6       0      0 :::80                   :::*                    LISTEN      4704/httpd
  
[root@client ~]#
  

24.9 配置管理文件(分发文件)
  saltstack有一个分发文件的功能,可以使用这个功能来批量分发一些文件到minion端上。我们需要在master端准备一个模板文件,并且进行相应的配置后,才能够进行分发。分发功能的好处在于,我们不需要自己一个个的将文件发送到master端上,只需要在master端执行一条命令就完成将文件发送到master端上的任务,减少了很多重复且无谓的工作。
  1.在master上编辑配置文件:
  

[root@server ~]# vim /srv/salt/test.sls  
file_test:
  file.managed:
  - name: /tmp/example.com
  - source: salt://test/example/example.txt
  - user: root
  - group: root
  - mode: 600
  

  说明:


  • 第一行的file_test为自定的名字,表示该配置段的名字,可以在别的配置段中引用它,
  • name指定分发到minion端上的哪个路径以及文件名称
  • source指定文件从哪里拷贝,这里的salt://test/example/example.txt相当于是/srv/salt/test/example/example.txt,
  • user和group指定文件的属主以及属组
  • mode则是指定文件的的权限。
  2.创建目录以及模板文件:
  

[root@server ~]# mkdir -p /srv/salt/test/example  
[root@server ~]# vim /srv/salt/test/example/example.txt  # 编辑模板文件,内容如下
  
This is a template file
  

  3.编辑主配置文件:
  

[root@server ~]# vim /srv/salt/top.sls  # 修改为如下内容  
base:
  '*':
  - test
  

  4.执行以下命令,将模板文件分发到minion端上:
  

[root@server ~]# salt 'client' state.highstate  
client:
  
----------
  ID: file_test
  Function: file.managed
  Name: /tmp/example.com
  Result: True
  Comment: File /tmp/example.com updated
  Started: 18:48:48.652179
  Duration: 61.133 ms
  Changes:
  ----------
  diff:
  New file
  

  
Summary for client
  
------------
  
Succeeded: 1 (changed=1)
  
Failed:    0
  
------------
  
Total states run:     1
  
Total run time:  61.133 ms
  
[root@server ~]#
  

  到minion端上,查看分发过去的文件:
  

[root@client ~]# ls -l /tmp/example.com  
-rw------- 1 root root 511 1月  24 18:48 /tmp/example.com
  
[root@client ~]# cat /tmp/example.com
  
This is a template file
  
[root@client ~]#
  

  如上,代表分发成功,当我们需要改动或者分发某个文件到一组机器时,使用这种分发模板文件的方式将省去很多重复的操作。

24.10 配置管理目录(分发目录)
  除了分发文件外,很多情况下我们还需要分发目录,所以 saltstack 也支持配置目录的分发。
  1.在master上编辑子配置文件:
  

[root@server ~]# vim /srv/salt/test_dir.sls  # 加入以下内容  
file_dir:
  file.recurse:
  - name: /tmp/testdir
  - source: salt://test/example
  - user: root
  - file_mode: 640  # 文件权限
  - dir_mode: 750  # 目录权限
  - mkdir: True  # 如果没有目录就创建
  - clean: True   # 加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除
  

  2.修改主配置文件:
  

[root@server ~]# vim /srv/salt/top.sls  
base:
  '*':
  - test_dir
  

  3.执行以下命令测试能否正常分发目录:
  

[root@server ~]# salt 'client' state.highstate  

  4.到minion端上查看目录是否已分发成功:
  

[root@client ~]# ls /tmp/testdir/  
example.txt
  
[root@client ~]# cat /tmp/testdir/example.txt
  
This is a template file
  
[root@client ~]# ll !$
  
ll /tmp/testdir/example.txt
  
-rw-r----- 1 root root 24 1月  25 14:35 /tmp/testdir/example.txt
  
[root@client ~]#
  

  saltstack 有一个特性,如果你要分发的目录下的子目录为空的话,是不会进行分发的:
  

[root@server ~]# mkdir /srv/salt/test/example/123  # 创建一个空目录  
[root@server ~]# salt 'client' state.highstate
  

  client上依旧只有一个文件:
  

[root@client ~]# ls /tmp/testdir/  
example.txt
  
[root@client ~]#
  

  所以空目录是不会被同步的,这一点需要注意一下。

24.11 配置管理远程命令
  虽然我们可以使用cmd.run去远程执行命令,但是这样的效率太低,每次只能执行一条命令。所以我们需要批量远程执行命令来提高效率,实现批量远程执行命令我们需要使用到脚本,将这个脚本分发到各个minion端上执行,要执行这个脚本我们还得进行一些相应的配置。
  1.在master上编辑一个子配置文件:
  

[root@server ~]# vim /srv/salt/shell_test.sls  # 增加以下内容  
shell_test:
  cmd.script:
  - source: salt://test/example.sh  # 脚本文件的路径
  - user: root
  

  2.创建模板脚本文件:
  

[root@server ~]# vim /srv/salt/test/example.sh  
#!/bin/bash
  
touch /tmp/test.txt
  
if [ ! -d /tmp/test ]
  
then
  mkdir /tmp/test
  
fi
  

  3.更改top.sls内容:
  

[root@server ~]# vim /srv/salt/top.sls  
base:
  '*':
  - shell_test
  

  3.执行以下命令测试一下能否在client上执行该脚本:
  

[root@server ~]# salt 'client' state.highstate  

  4.到client上检查是否有test.txt文件和test目录,有则代表测试成功:
  

[root@client ~]# ls -l /tmp/test.txt  
-rw-r--r-- 1 root root 0 1月  25 15:15 /tmp/test.txt
  
[root@client ~]# ll /tmp/test
  
总用量 0
  
[root@client ~]#
  

24.12 配置管理计划任务
  既然能够远程执行命令了,当然还得配置一下任务计划,毕竟很多场景下,都需要定时地重复去执行脚本或命令。
  1.在master上编辑一个子配置文件:
  

[root@server ~]# vim /srv/salt/cron_test.sls  
cron_test:
  cron.present:
  - name: /bin/touch /tmp/test_cron.txt  # 需要执行的命令,也可以执行一个脚本
  - user: root
  - minute: '*'   # 分
  - hour: 20   # 时
  - daymonth: '*'  # 日
  - month: '*'  # 月
  - dayweek: '*'  # 周
  

  用法和crontab是一样的。
  **注意:*** 需要用单引号引起来。当然我们还可以使用file.managed模块来管理cron,因为系统的cron都是以配置文件的形式存在的。想要删除该cron,需要增加:
  

cron.absent:  - name: /bin/touch /tmp/test_cron.txt
  

  两者不能共存,要想删除一个cron,那之前的present就得去掉,末尾会演示一下如何删除cron。
  2.更改top.sls文件的内容:
  

[root@server ~]# vim /srv/salt/top.sls  
base:
  '*':
  - cron_test
  

  3.执行以下命令测试一下能否在client上增加相应的任务计划:
  

[root@server ~]# salt 'client' state.highstate  

  4.到client上检查一下有没有增加相应的任务计划,如下,则是测试成功:
  

[root@client ~]# crontab -l  
# Lines below here are managed by Salt, do not edit
  
# SALT_CRON_IDENTIFIER:/bin/touch /tmp/test_cron.txt
  
* 20 * * * /bin/touch /tmp/test_cron.txt
  
[root@client ~]#
  

  注:生成的那两行注释不能删除或改动,如果删除或改动了就无法被master端管理了,注释上也写明了do not edit。
  删除cron,修改/srv/salt/cron_test.sls文件内容如下:
  

[root@server ~]# vim /srv/salt/cron_test.sls  
cron_test:
  cron.absent:
  - name: /bin/touch /tmp/test_cron.txt
  

  执行以下命令:
  

[root@server ~]# salt 'client' state.highstate  

  到client上检查一下是否已删除:
  

[root@client ~]# crontab -l  
# Lines below here are managed by Salt, do not edit
  
[root@client ~]#
  

  可以看到,client上的cron已经删除。

24.13 其他命令
  1.cp.get_file,拷贝master上的文件到客户端:
  

[root@server ~]# echo "This is test copy file" > /srv/salt/test/cp.txt  
[root@server ~]# salt 'client' cp.get_file salt://test/cp.txt  /tmp/cp.txt
  
client:
  /tmp/cp.txt
  
[root@server ~]#
  

  到client上检查一下是否拷贝成功:
  

[root@client ~]# ls /tmp/cp.txt  
/tmp/cp.txt
  
[root@client ~]# cat !$
  
cat /tmp/cp.txt
  
This is test copy file
  
[root@client ~]#
  

  2.cp.get_dir 拷贝目录:
  

[root@server ~]# salt 'client' cp.get_dir salt://test/  /tmp/   # 会自动在客户端创建test目录,所以后面不要加test,如果写成 /tmp/test/  则会在/tmp/test/目录下又创建test  
client:
  - /tmp//test/cp.txt
  - /tmp//test/example.sh
  - /tmp//test/example/example.txt
  
[root@server ~]#
  

  到client上检查一下是否拷贝成功:
  

[root@client ~]# ls /tmp/test  
cp.txt  example  example.sh
  
[root@client ~]#
  

  3.显示存活的minion:
  

[root@server ~]# salt-run manage.up  
- client
  
- server
  
[root@server ~]#
  

  4.命令行下执行master上的shell脚本:
  

[root@server ~]# salt 'client' cmd.script salt://test/example.sh  
client:
  ----------
  pid:
  10600
  retcode:
  0
  stderr:
  stdout:
  
[root@server ~]#
  

24.14 salt-ssh使用
  salt-ssh不需要对客户端做认证,客户端也不用安装salt-minion或者启动什么服务,它类似ssh/expect。
  1.安装salt-ssh:
  

[root@server ~]# yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm  
[root@server ~]# yum install -y salt-ssh
  

  2.编辑配置文件:
  

[root@server ~]# vim /etc/salt/roster  # 文件末尾加上以下内容  
client:  # 主机名
  host: 192.168.77.128  # 需要登录的ip
  user: root  # 需要登录的用户
  passwd: 123456.   # 该用户的密码
  

  3.执行以下命令测试一下能否远程执行命令:
  

[root@server ~]# salt-ssh --key-deploy '*' -r 'w'  
client:
  ----------
  retcode:
  0
  stderr:
  stdout:
  root@192.168.77.128's password:
  16:05:59 up  4:31,  1 user,  load average: 0.00, 0.01, 0.05

  USER     TTY      FROM             LOGIN@  >  root     pts/0    192.168.77.1     11:35    9:35   0.30s  0.30s -bash
  
[root@server ~]#
  

  注:第一次执行的时候会自动把本机的公钥放到对方机器上,在这之后就可以把roster文件里面的密码给去掉了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543843-1-1.html 上篇帖子: saltstack 报错 Minion did not return. [No response] 下篇帖子: saltstack源码安装nginx-llliii的博客
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表