说明:

     本文档仅写了一些基础的SaltStack操作命令,但这些命令也是工作中经常会用到的,像grainspillarjinja2功能更强大,但如果不是大批量升级改造的话一般不需用到。更高级的操作请参阅书籍。

 

 

1.salt常用命令

salt-key –L salt-key:列出各minion的授权状态

salt 'minion-25.180' sys.doc test.echo sys.doc用来获取模块的用处和示例用法

salt 'minion-25.180' test.ping:测试是否通

salt 'minion-25.180' cmd.run ‘echo “ok”’ :发送操作指令(操作需小心)

 

2.salt常用参数

  • -L 列表匹配

SaltStack远程控制、配置管理与实战介绍_第1张图片

  • -N 列表匹配(将主机列表写入/etc/salt/master中)

SaltStack远程控制、配置管理与实战介绍_第2张图片

 

3.常用模块

3.1 file

3.1.1 file.managed

下发文件,确保文件存在:

/etc/passwd:

  file.managed:

-         source: salt://…/…/passwd

-         user: nginx

-         group: nginx

-         mode: 644

3.1.2 file.directory

建立目录

/srv/stuff/sub:

  file.directory:

-         user: fred

-         group: users

-         mode: 755

-         makedirs: True

“makedirs: True” ”unless:test –d dir”功能一样,只有目录不存在才会创建,而且建立目录相当于加了参数’-p’

 

3.1.3 file.symlink

建立软链接

/etc/grub.conf:

 file.symlink:

-         targe: /boot/grub/grub.conf

3.1.4 file.recurse

下发整个目录

/opt/code/flask:

  file.recurse:

-         source: salt://code/flask

-         include_empty: True

 

3.2 pkg模块

3.2.1 pkg.installed

软件安装,指定软件版本;也可以指定rpm安装、指定最新版安装

mypgks:

 pkg.installed:

-         pkgs:

-         foo

-         bar: ‘>=1.2.3-4’

-         baz

 

3.3 service模块

10.3.1 service.runnning

启动redis服务

redis:

 service.running:

-         enable: True

-         reload: True

-         watch:

-         pkg: redis

 

3.4 cron模块

每五分钟执行一次指定任务:

date > /tmp/crontest:

      cron.present:

-         user: root

minute: ‘*/5’

4Salt端口作用

Salt-master启动时会监听两个端口,默认是45054506

  • 4506的作用:salt-masterret接口,支持认证、文件服务、结果收集等功能;

  • 4505的作用:salt-masterpub接口,提供远程执行命令发送功能。

 

Salt-minion启动时从配置文件中获取master的地址,如果为域名,则进行解析。解析完成,会连接master4506进行key认证。认证通过,会获取到masterpublish_port(默认是4505),然后连接publish_port订阅来自master pub接口的任务。当master下发操作指令时,所有的minion都能接收到,然后minion会检查本机是否匹配。如果匹配,则执行。执行完毕后,把结果发送到master4506master进行处理,命令发送通信完全是异步的,并且命令包很小。此外,这些命令包通过maqpack进行序列化后数据会进一步压缩(maqpack是一种高效的二进制序列化格式),所以salt的网络负载非常低。

 

5. 编写自己的执行模块函数

5.1编写一个简易模块

默认情况下,我们的定制模块存放于/src/salt/_modules目录下,这个目录并不是默认创建的,需要建立对应的目录并添加文件,命令如下:

SaltStack远程控制、配置管理与实战介绍_第3张图片

 

模块添加完毕后,我们需要把模块推送到所有minion上,然后测试,如下,

wKioL1fJNEvCIeg5AAAXL7ipjh4285.png

 

5.2编写一个完整的模块

作为系统管理员我们可能经常需要查出当前系统最占用内存的程序以及当前系统中最占用CPU的程序,当然通过salt的远程执行模块cmd.run用一行命令即可完成任务,但是作为一个会被反复使用的功能,我们把它写成一个模块会更便捷,下面动手写一个统计系统负载的模块,

cd /srv/salt/_modules

vim prank.py内容如下:

[root@localhost _modules]# cat prank.py

#/usr/bin/env python

#coding:utf-8

 

'''

The top nth processes which take up CPU andmemory space usage are available through this module,additionaly;

the module can get the system loadinformation.

'''

 

import os

import salt.utils

 

def cpu(n):

   '''

   Return the top nth processes which take up the cpu usage for this minion

   CLI Example:

     salt '*' prank.cpu

   '''

   cmd = "ps aux | sort -k3 -nr | head -n %s" % str(n)

   output = __salt__['cmd.run_stdout'](cmd)

   res = []

   for line in output.splitlines():

       res.append(line)

   return res

 

def mem(n):

   '''

   Return the top nth processes which take up the memory usage for thisminion

   CLI Example:

     salt '*' prank.mem

   '''

   cmd = "ps aux | sort -k4 -nr | head -n %s" % str(n)

    output = __salt__['cmd.run_stdout'](cmd)

   res = []

   for line in output.splitlines():

       res.append(line)

   return res

 

def load():

   '''

   Return the load averages for this minion

   CLI Example:

   ..code-block:bash

     salt '*' prank.load

   '''

   load_avg = os.getloadavg()

   return {'1-min':load_avg[0],

           '5-min':load_avg[1],

           '15-min':load_avg[2],

           

           }

 

同步模块:salt ‘*’ saltutil.sync_modules

查看模块帮助:salt ‘minion-one’ sys.doc prank

实战使用:salt ‘minion-one’ prank.mem 4

                     salt ‘minion-one’ prank.cpu 4

                     salt ‘minion-one’ prank.load

 

6.执行模块和状态模块之间的主要区别

执行模块是过程式的,而状态模块则是描述性的。连续调用同一个执行模块时,执行模块会执行相同的命令和指令。而状态模块则恰恰相反,状态模块设计为描述性的,它们只是执行必要的工作,在目标minion上创建根据描述文件指定的状态。

 

运行了pkg.install命令,实际上pkg.install只是运行了yum install 命令,而用state模块时会首先判断httpd软件是否安装了,如果没有安装就进行安装,如果已经安装过了就什么都不做。实际上不只是安装软件这一项任务如此,所有的状态描述都会遵循这个原则,只在检测到真实状态和所需状态不同的情况下才执行功能。你可以一次又一次地运行状态,只要没有不符,就不会有任何变化,这种性质叫做幂等性,可以通过判断来让minion以最小的代价进入指定的状态。

 

7.YAML语法

SLS配置文件使用YAML语言描述。

7.1规则一:缩进

Salt需要每个缩进级别由两个空格组成。

7.2规则二:冒号

Key: value,这样的表示,在状态文件被调用时会将被翻译成python里的字典。

My_key:

  My_value

Python中上面的将映射为{‘My_key’:’My_value’}

7.3规则三:短横杠

用一个短横杠加一个空格来表示列表项,多个项使用同样的缩进级别作为同一列表的一部分。

My_d:

-         Listone

-         Listtwo

-         Listthree

Python中,上面的将映射为{‘My_d’:[‘Listone’,’Listtwo’,’ Listthree’]}

 

8.实战部署听云探针

8.1首先批量拷贝听云文件,建立拷贝的salt状态文件,如下,

SaltStack远程控制、配置管理与实战介绍_第4张图片

这里的/srv/salt目录对应/etc/salt/master里的“file_roots”设置,如下,

wKiom1fJNHDxE_1UAAAXfg6s_PU783.png

执行状态文件:salt –L ‘minion…’ state.sls tingyun.sls。执行完毕后,文件就拷贝到各minion端了。

 

8.2批量解压并修改目录属主、属组

wKioL1fJNKPRRbANAAAivQcl5Mc494.png

cd /usr/local/src && tingyun-agent-java.zip&& chown –R nginx.nginx /usr/local/src/tingyun && sed -i ‘s#nbs.app_name=JavaApplication# nbs.app_name= MessageServiceProvider#g’ /usr/local/src/tingyun/tingyun.properties

8.3批量修改tingyun配置

wKioL1fJNLLDez0LAAAZXRHIgqg410.png

8.4 svn up同步java配置

Svn up命令

 

然后继续使用cmd.run方法重启Java服务和查看日志输出。

 

以上步骤都可以写入状态文件,实现一键执行,如下例。

 

9.实战部署CMSjdkmaventomcat

9.1创建状态文件,如下

home-www-cms-conf:

 cmd.run:

    -name: mkdir -p /home/www/cms/conf

    -unless: test -d /home/www/cms/conf

    -order: 1

home-www-cms-log-logs:

 cmd.run:

    -name: mkdir -p /home/www/cms/log/logs

    -unless: test -d /home/www/cms/log/logs

    -order: 2

home-web-apache-tomcat-7.0.64-conf-Catalina-localhost:

 cmd.run:

    -name: mkdir -p /home/web/apache-tomcat-7.0.64/conf/Catalina/localhost

    -unless: test -d /home/web/apache-tomcat-7.0.64/conf/Catalina/localhost

    -order: 3

 

/home/www/cms/conf/dubbo.properties:

 file.managed:

    -source: salt://jdk_mav_tom/cmsfile/dubbo.properties

    -user: root

    -group: root

    -mode: 644

    -require:

     - cmd: home-www-cms-conf

 

/home/www/cms/conf/hessian.properties:

 file.managed:

    -source: salt://jdk_mav_tom/cmsfile/hessian.properties

    -user: root

    -group: root

    -mode: 644

    -require:

     - cmd: home-www-cms-conf

 

/home/www/cms/conf/jdbc.properties:

 file.managed:

    -source: salt://jdk_mav_tom/cmsfile/jdbc.properties

    -user: root

    -group: root

    -mode: 644

    -require:

     - cmd: home-www-cms-conf

 

/home/www/cms/cmsRun.sh:

 file.managed:

    -source: salt://jdk_mav_tom/cmsfile/cmsRun.sh

    -user: root

    -group: root

    -mode: 644

    -require:

     - cmd: home-www-cms-conf

/home/web/apache-tomcat-7.0.64/conf/Catalina/localhost/ROOT.xml:

 file.managed:

    -source: salt://jdk_mav_tom/cmsfile/ROOT.xml

    -user: root

    -group: root

    -mode: 644

    -require:

     - cmd: home-www-cms-conf

 

 

svn-cms:

 cmd.run:

    -name: cd /home/www/cms && svn cohttp://10.103.16.3:18080/svn/web_project/java/service_project/cms_service_center/online/CmsServiceProject--username=832868 --password=12345Qwert --no-auth-cache && chown -Rnginx.nginx /home/www

- order: last

 

配置内容:没有/home/web目录就创建;拷贝javatomcatmaven;拷贝完毕的前提下解压目录;解压成功的前提下修改目录属主属组;/etc/profile中没有配置jdkmaven环境变量的前提下,将环境变量配置好。

:有order的状态比没有order的状态优先级高;order:last表示最后执行。

9.2执行状态文件

没有报错就表示部署完毕,可以通过cmd.run命令查看确认各minion部署是否正确。

 

 

10.实战修改tomcat配置文件

server.xml放到/srv/salt/shangxian/server.xml

10.1    sls状态文件内容如下

/home/wap/wap1/conf/server.xml:

 file.managed:

    -source: salt://shangxian/server.xml

    -user: nginx

    -group: nginx

    -mode: 644

 

/home/wap/wap2/conf/server.xml:

 file.managed:

    -source: salt://shangxian/server.xml

    -user: nginx

    -group: nginx

    -mode: 644

 

/home/wap/wap3/conf/server.xml:

 file.managed:

    -source: salt://shangxian/server.xml

    -user: nginx

    -group: nginx

    -mode: 644

 

/home/wap/wap4/conf/server.xml:

 file.managed:

    -source: salt://shangxian/server.xml

    -user: nginx

    -group: nginx

    -mode: 644

 

/home/wap/wap5/conf/server.xml:

 file.managed:

    -source: salt://shangxian/server.xml

    -user: nginx

    -group: nginx

    -mode: 644

 

/home/wap/wap6/conf/server.xml:

 file.managed:

    -source: salt://shangxian/server.xml

    -user: nginx

    -group: nginx

    -mode: 644

 

10.2执行命令

salt -L'minion-38.179,minion-34.96,minion-34.97,minion-37.12,minion-37.77' state.slsxinyuan

 

这样,五台机器,共30tomcat的配置文件就替换完成了。