自动化运维——利用Saltstack 远程执行命令

1. 命令方式

Salt命令由三个主要部分构成:

salt '<target>' <function> [arguments]

target: 指定哪些minion, 默认的规则是使用globe匹配minion id.

salt内置的执行模块列表见:http://docs.saltstack.cn/ref/modules/all/index.html

[root@server1 minions]# salt '*' test.ping
server2:
    True
server3:
    True

Targets也可以使用正则表达式:

[root@server1 ~]# salt -E 'server[1-4]' cmd.run hostname
server3:
    server3
server2:
    server2
[root@server1 ~]# 

funcation是module提供的功能,Salt内置了大量有效的functions.

注意当执行的函数有参数时,需要引号(单双都可以)引起来:

[root@server1 ~]# salt -E 'server[1-4]' cmd.run 'df -h'
server2:
    Filesystem             Size  Used Avail Use% Mounted on
    /dev/mapper/rhel-root   17G  1.3G   16G   8% /
    devtmpfs               484M     0  484M   0% /dev
    tmpfs                  496M  100K  496M   1% /dev/shm
    tmpfs                  496M   13M  483M   3% /run
    tmpfs                  496M     0  496M   0% /sys/fs/cgroup
    /dev/sda1             1014M  133M  882M  14% /boot
    tmpfs                  100M     0  100M   0% /run/user/0
server3:
    Filesystem             Size  Used Avail Use% Mounted on
    /dev/mapper/rhel-root   17G  1.3G   16G   8% /
    devtmpfs               484M     0  484M   0% /dev
    tmpfs                  496M  100K  496M   1% /dev/shm
    tmpfs                  496M   13M  483M   3% /run
    tmpfs                  496M     0  496M   0% /sys/fs/cgroup
    /dev/sda1             1014M  133M  882M  14% /boot
    tmpfs                  100M     0  100M   0% /run/user/0
[root@server1 ~]# 

Targets也可以指定列表:

[root@server1 ~]# salt -L 'server2,server3' test.ping
server2:
    True
server3:
    True
[root@server1 ~]# 

arguments通过空格来界定参数:

[root@server1 ~]# salt server2 sys.doc pkg   	#查看模块文档
[root@server1 ~]# salt '*' pkg.install wget		#所有minion安装wget
[root@server1 ~]# salt '*' pkg.remove wget		#所有minion卸载wget

2. 文件方式

查看配置文件可以看出slatstack默认的base文件目录为/srv/salt,其中salt目录需要我们自己新建

[root@server1 ~]# mkdir /srv/salt
[root@server1 ~]# cd /srv/salt/

Salt 状态系统的核心是SLS,或者叫SaLt State 文件。

SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
sls文件命名:

  • sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
  • 使用子目录来做组织是个很好的选择。
  • init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls就是表示apache.
  • 如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls
    被忽略,apache.sls将被用来表示 apache.

接下来我们就可以编辑文件了,编辑的文件使用yaml语法:

规则一: 缩进 Salt需要每个缩进级别由两个空格组成,不要使用tabs。
规则二: 冒号 字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。 my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。

    list_value_one
    list_value_two

示例,编辑文件:

[root@server1 salt]# vim install.sls
[root@server1 salt]# cat install.sls 
httpd:								## ID声明
  pkg.installed						##状态声明.函数声明

指定server2执行以上文件

[root@server1 salt]# salt server2 state.sls install

注意,指定文件时不需要加后缀sls。

查看server2的日志可以看出已经安装:

在这里插入图片描述
可以看出还安装了很多依赖性的包。

也可以安装多个包:

[root@server1 salt]# vim install.sls 
[root@server1 salt]# cat install.sls 
httpd:
  pkg.installed

wget:
  pkg.installed
[root@server1 salt]# salt server3 state.sls install

查看server3日志可以看出已经安装成功:

在这里插入图片描述

再执行一次salt server3 state.sls install命令时状态将不会改变,这里与ansible类似:

在这里插入图片描述
也可以使用以下这种写法:

[root@server1 salt]# vim install.sls 
[root@server1 salt]# cat install.sls 
apache:
  pkg.installed:
    - pkgs:
      - httpd
      - wget
      - php

卸载应用可以使用pkg.removed:

[root@server1 salt]# vim install.sls 
[root@server1 salt]# cat install.sls 
apache:
  pkg.removed:
    - pkgs:
      - httpd
      - wget
      - php

[root@server1 salt]# salt '*' state.sls install

以上表示再所有节点卸载httpd,wget,php。
查看日志可以看出已经卸载:

在这里插入图片描述

3. 编写远程执行模块

我们也可以自定义saltstack模块,自定义的模块需要在/srv/salt/_modules目录中:

创建模块目录:

[root@server1 salt]# mkdir /srv/salt/_modules
[root@server1 salt]# ls
install.sls  _modules

编写模块文件:

[root@server1 salt]# cd _modules/
[root@server1 _modules]# vim mydisk.py
[root@server1 _modules]# cat mydisk.py 
def df():
    return __salt__['cmd.run']('df -h')

以上文件表示定义了一个名为mydisk的模块,且模块内有一个函数df,函数的作用是运行df -h命令。

同步模块:

[root@server1 _modules]# salt '*' saltutil.sync_modules
server2:
    - modules.mydisk
server3:
    - modules.mydisk

同步后salt-master会将模块信息发送到指定的salt-minion,salt-minion将信息保存到/var/cache/salt/minion/目录下:

在这里插入图片描述
调用模块:

[root@server1 _modules]#  salt '*' mydisk.df
server3:
    Filesystem             Size  Used Avail Use% Mounted on
    /dev/mapper/rhel-root   17G  1.3G   16G   8% /
    devtmpfs               484M     0  484M   0% /dev
    tmpfs                  496M   60K  496M   1% /dev/shm
    tmpfs                  496M   13M  483M   3% /run
    tmpfs                  496M     0  496M   0% /sys/fs/cgroup
    /dev/sda1             1014M  133M  882M  14% /boot
    tmpfs                  100M     0  100M   0% /run/user/0
server2:
    Filesystem             Size  Used Avail Use% Mounted on
    /dev/mapper/rhel-root   17G  1.3G   16G   8% /
    devtmpfs               484M     0  484M   0% /dev
    tmpfs                  496M   60K  496M   1% /dev/shm
    tmpfs                  496M   13M  483M   3% /run
    tmpfs                  496M     0  496M   0% /sys/fs/cgroup
    /dev/sda1             1014M  133M  882M  14% /boot
    tmpfs                  100M     0  100M   0% /run/user/0
[root@server1 _modules]# 

4. 使用top文件

如果我们想要在不同的节点安装不一样的包,可以用以下这种方式实现:

[root@server1 salt]# vim apache.sls 
[root@server1 salt]# cat apache.sls 
apache:
  pkg.installed:
    - pkgs:
      - httpd 
[root@server1 salt]# vim nfs.sls 
[root@server1 salt]# cat nfs.sls 
nfs:
  pkg.installed:
    - pkgs:
      - nfs-utils
[root@server1 salt]# ls
apache.sls  _modules  nfs.sls

现在我们要求在server2安装apache文件,在server3安装nfs文件,原来的方法是分两次指定节点执行指定文件,也可以使用top文件的方式:

[root@server1 salt]# vim top.sls
[root@server1 salt]# cat top.sls 
base:
  'server2':
    - apache
  'server3':
    - nfs

执行top文件:

[root@server1 salt]# salt '*' state.highstate

在这里插入图片描述
在日常使用中,我们最好使用子目录来做组织:

[root@server1 salt]# ls
apache.sls  _modules  nfs.sls  top.sls
[root@server1 salt]# mkdir apache
[root@server1 salt]# mkdir nfs
[root@server1 salt]# mv apache.sls apache
[root@server1 salt]# mv nfs.sls nfs
[root@server1 salt]# ls
apache  _modules  nfs  top.sls

这时目录已经发生变化,我们现在需要调用apahce目录下的apache.sls文件时需要使用以下方式:

[root@server1 salt]# salt server2 state.sls apache.apache

同样sls后缀不需要加。

那么此时上面的nfs文件就需要这么写:

[root@server1 salt]# vim top.sls 
[root@server1 salt]# cat top.sls 
base:
  'server2':
    - apache.apache
  'server3':
    - nfs.nfs
[root@server1 salt]# salt '*' state.highstate

使用入口文件init.sls

[root@server1 salt]# cd apache/
[root@server1 apache]# mv install.sls init.sls

当有入口文件时,我们不需要再指定文件,只需指定目录名称即可:

[root@server1 salt]# vim top.sls 
[root@server1 salt]# cat top.sls 
base:
  'server2':
    - apache
  'server3':
    - nfs.nfs
[root@server1 salt]# salt '*' state.highstate

5. 使用saltstack安装配置httpd

(1)安装httpd并准备配置文件

[root@server1 apache]# vim init.sls 
[root@server1 apache]# cat init.sls 
apache:
  pkg.installed:
    - pkgs:
      - httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf

其中file.managed中的name表示的是minion端的文件路径,source表示master端的文件路径,salt://表示saltstack的base路径(即/srv/salt/)

(2)之后我们需要准备配置文件httpd.conf:

[root@server1 apache]# scp server3:/etc/httpd/conf/httpd.conf .
[root@server1 apache]# ls
httpd.conf  init.sls
[root@server1 apache]# pwd
/srv/salt/apache

现在可以直接进行推送:

[root@server1 apache]# salt server2 state.sls apache

(3)启动服务

[root@server1 apache]# vim init.sls 
[root@server1 apache]# cat init.sls 
apache:
  pkg.installed:
    - pkgs:
      - httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf
  service.running:
    - httpd

启动服务使用了service模块中的running函数。

[root@server1 apache]# salt server2 state.sls apache

在这里插入图片描述

(4)在修改配置文件后的操作:在更改文件后并没有重启应用,需要进行以下设置

[root@server1 apache]# vim init.sls 
[root@server1 apache]# cat init.sls 
apache:
  pkg.installed:
    - pkgs:
      - httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/httpd.conf
  service.running:
    - name: httpd
    - watch:
      - file: apache

watch表示监控唯一性声明apache下的文件(即salt://apache/httpd.conf),当文件有更改时即重启服务。

推送测试

[root@server1 apache]# vim httpd.conf 
[root@server1 apache]# cat httpd.conf | grep 8000
Listen 8000
[root@server1 apache]# salt server2 state.sls apache

可以看出服务已经重启,在server2查看

[root@server2 salt]# netstat -antlp
......         
tcp6       0      0 :::8000                 :::*                    LISTEN      14944/httpd 

(5)也可以加入设置重载配置文件或者开机自启动

 - reload: true
 - enable: true

(6)其他的写法

[root@server1 apache]# vim init.sls 
[root@server1 apache]# cat init.sls 
apache:
  pkg.installed:
    - pkgs:
      - httpd
  service.running:
    - name: httpd
    - reload: true
    - enable: true
    - watch:
      - file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://apache/httpd.conf

作用完全一样,多种写法而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值