Saltstack入门与实践之远程执行

一、如何理解Saltstack的执行模块

在远程主机上运行预定义的或任意命令,也称为远程执行,是saltstack的核心功能.
salt执行模块
  salt执行模块是由远程执行系统调用来执行各种各样的任务。这些模块提供的功能,如安装包,重启服务,远程命令运行,传输文件,等等。

官方资料:
https://www.unixhot.com/docs/saltstack/ref/modules/all/index.html#all-salt-modules

我们先看第一个远程执行命令:

[root@linux-node1 ~]# salt '*' test.ping
linux-node1.oldboyedu.com:
    True
linux-node2.oldboyedu.com:
    True

命令解释:

salt '*' test.ping
  salt: 命令
  '*': 目标
       例1:salt "linux-node1.oldboyedu.com" test.ping
       例2:salt "linux-node1.oldboyedu.com" cmd.run 'w'
  test: 模块
  ping: 方法
小结:
命令解释:
  1.目标: target
  2.模块:Module
  3.返回:Return
salt '*' cmd.run 'w'
这条命令的解释为:
命令:目标 模块.方法 参数  

例1和例2 具体执行命令过程:

[root@linux-node1 ~]# salt "linux-node1.oldboyedu.com" test.ping
linux-node1.oldboyedu.com:
    True
[root@linux-node1 ~]# salt "linux-node1.oldboyedu.com" cmd.run 'w'
linux-node1.oldboyedu.com:
     19:05:08 up 14 days, 20:26,  1 user,  load average: 0.18, 0.17, 0.19
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    192.168.56.1     18:30    4.00s  0.82s  0.46s /usr/bin/python /usr/bin/salt linux-node1.oldboyedu.com cmd.run w

#远程创建文件夹

[root@linux-node1 ~]# salt '*' cmd.run 'mkdir -p /tmp/hehe'
linux-node2.oldboyedu.com:
linux-node1.oldboyedu.com:

#远程查看创建的文件夹

[root@linux-node1 ~]# salt '*' cmd.run 'ls -l /tmp/hehe'
linux-node2.oldboyedu.com:
    total 0
linux-node1.oldboyedu.com:
    total 0

#远程删除文件夹

[root@linux-node1 ~]# salt '*' cmd.run 'rm -rf /tmp/hehe'
linux-node1.oldboyedu.com:
linux-node2.oldboyedu.com:

说明:是不是很方便很简单!
注意:saltstack可以直接使用shell命令也也就使用不当会造成很大的安全威胁;不过我们后面可以使用ACL 来管理远处执行命令的权限
细心的同学可能发现了,saltstack远程执行命令和linux一样执行命令正确没有回显的,没有消息提示就是最好的提示,哈哈;


小结:
典型案例:

  1.远程执行 salt '*' cmd.run 'uptime'
  2.State (状态模块)格式:YAML    后缀:.sls结尾

二、saltstack远程执行之目标匹配

  1.通配符(Globbing)
  2.正则表达式(Regular Expressions)
  3.列表(List)
  4.子网、IP地址(Subnet/IP Address Matching)

其他模式还有:Grains Pillar 混合匹配等

官方文档:
https://docs.saltstack.com/en/latest/topics/targeting/globbing.html

1.1.通配符(Globbing)

Match all minions
#匹配所有下属
命令如下:
salt '*' test.ping
Match all minions in the liuliya.com domain or any of the example domains:
#匹配所有下属的liuliya.com域或域的例子
命令如下:

salt '*.liuliya.com' test.ping
salt '*.liuliya.*' test.ping

Match all the webN minions in the liuliya.com domain (web1.liuliya.com, web2.liuliya.com … webN.liuliya.com)
#匹配所有webN在liuliya.com域
命令如下:
salt 'web?.liuliya.com' test.ping
Match the web1 through web5 minions:
#匹配web1到web5
命令如下:
salt 'web[1-5]' test.ping
Match the web1 and web3 minions:
#匹配web1和web3 minions
命令如下:
salt 'web[1,3]' test.ping
Match the web-x, web-y, and web-z minions:
#匹配web-x,web-y,及web-z 的minions
命令如下:
salt 'web-[x-z]' test.ping

1.2.正则表达式(Regular Expressions)

Match both web1-prod and web1-devel minions:
#匹配web1-prod和web1-devel minions
命令如下:
salt -E 'web1-(prod|devel)' test.ping

When using regular expressions in a State’s top file, you must specify the matcher as the first option. The following example executes the contents of webserver.sls on the above-mentioned minions.
命令如下:

base:
 'web1-(prod|devel)':
  - match: pcre
  - webserver

#注意此处的空格,因为YAML特性。
1.3.列表(List)

At the most basic level, you can specify a flat list of minion IDs:
命令如下:
salt -L 'web1,web2,web3' test.ping

1.3.4 Grains

Grains是系统启动时,收集到的系统信息,当然也可以用来做资产管理
例如:
salt 'mha01' grains.items
详细用法见:https://docs.saltstack.com/en/latest/topics/targeting/grains.html
#如果用grains来匹配的话,记得 命令后加 参数 -G

1.3.4 Pillar

#如果用Pillar来匹配的话,记得 命令后加 参数 -I

1.3.4 网段、iP地址匹配

#如果用Pillar来匹配的话,记得 命令后加 参数 -S
例:

salt -S 192.168.20.20 test.ping
salt -S 10.0.0.0/24 test.ping

#如果用Pillar来匹配的话,记得 命令后加 参数 -C (混合匹配)
例:
salt -C 'S@10.0.0.0/24 and G@os.Debian' test.ping

补充说明:
  YAML: YAML是YAML “Ain’t Markup Language(YAML不是一种标记语言)”的递归缩写;
  在开发的这种语言是,YAML的意思是 “Yet Another Markup Language”(扔是一种标记语言)

YAML 三板斧:

   1.缩进(表示层级关系)
            2个空格,不能使用tab键
   2.冒号(键值对)
           键值对my_key: my_value
           In Python, the above maps to:
                                        {'my_key': 'my_value'}
           冒号后面有一个空格
              1)不以冒号为结尾的冒号后面要有一个空格
              2)表示路径的没有空格
              3)表示协议的
   3.短横线(表示列表)
            列表 - list_value_one
           短横线后面有一个空格
说明:saltstack的配置文件就是遵循 YAML语法:

接下来我们来看salt-master的配置位置:
[root@linux-node1 ~]# vim /etc/salt/master
搜索file_roots
找到了:

Example:
# file_roots:
472 #   base:
473 #     - /srv/salt/
474 #   dev:
475 #     - /srv/salt/dev/services
476 #     - /srv/salt/dev/states
477 #   prod:
478 #     - /srv/salt/prod/services
479 #     - /srv/salt/prod/states

上面是配置文件的写法:

我们先来从481行去掉注释:
file_roots:
 base:
  - /srv/salt
说明:
file_roots:  #配置项
base:     #base环境(必须的,不能更改)
- /srv/salt    #配置的路径

更改salt配置要重启saltstack
接下来我们创建一个apache 配置文件

[root@linux-node1 ~]# mkdir /srv/salt/web
[root@linux-node1 ~]# cd /srv/salt/web
[root@linux-node1 ~]#  apache.sls
apache-install:
 pkg.installed:
  - names:
   - httpd
   - httpd-devel
apache-service:
 service.running:
  - name: httpd
  - enable: True

写好保存,并退出;
然后我们来执行:
[root@linux-node1 ~]# salt '*' state.sls web.apache
上面命令的原理:
发送/src/salt/web/apache.sls到minion 端的/var/cache/salt/minion/extmods/files/base/web/apache.sls

[root@linux-node2 ~]# cat /var/cache/salt/minion/files/base/web/apache.sls
apache-install:
 pkg.installed:
  - names:
   - httpd
   - httpd-devel
apache-servive:
 service.running:
  - name:
   - httpd
   - httpd-devel
[root@linux-node2 ~]#

上面apache.sls配置文件说明:

apache-install:    #ID(唯一标识符)
 pkg.installed:  #pkg为模块   installed为方法
  - names:  # names为installed的参数 后面可以是要安装包的列表
   - httpd  #安装程序包
   - httpd-devel  #安装程序包
apache-service:  #ID唯一标识
 service.running:  #service为模块  running为方法
  - name: httpd  #运行服务名称
  - enable: True  #服务开机自动启动

我们打开master配置文件:
vim /etc/salt/master

搜索top
376行
state_top: top.sls
(top.sls告诉我们那个机器执行什么)
注意:必须设置在base环境下
base 环境在哪,file_root设置的base环境下设置的路径下;

top.sls文件写法—具体过程:

[root@linux-node1 ~]# cd /srv/salt/
[root@linux-node1 ~]# ls
web
[root@linux-node1 ~]# vim top.sls
base:
 'linux-node1.oldboyedu.com':
  - web.apache
 'linux-node2.oldboyedu.com':
  - web.apache

接下来我们来执行高级状态:
[root@linux-node1 ~]# salt '*' state.highstate

发表评论

发表评论

*

沙发空缺中,还不快抢~