meimei10251314 发表于 2018-8-1 06:15:31

Saltstack简单汇总,快速入门

  前言:在很久以前,只有几台主机的时候当然不需要什么自动糊工具,但是随着硬件成本越来越低廉的今天,随随便便就好几十台服务器,靠手工不是搞不定,但是反复的重复着没有太多技术的操作一定会让人抓狂的的,所以有必要选择一个可以批量操作部署的自动化工具,诸如Pupet,ansible,rundeck,faric之类的工具不少少,碍于水平有限,暂时就saltstack稍微溜一点,简单汇总一下基本的概念,操作等。
  参考环境centos6.5
  安装:
  rpm -Uvh http://mirror.pnl.gov/epel/6/x86_64/epel-release-6-8.noarch.rpm
  最新的似乎是2015.8.1,如果用pip安装的话
  master安装
  yum install salt-master -y
  chkconfig salt-master on
  sed -i "s/# interface: 0.0.0.0/interface: MasterIP地址/" /etc/salt/master###绑定master端IP地址
  service salt-master start   ###启动salt-master
  Minion安装
  yum install salt-minion –y
  chkconfig salt-minion on
  sed -i "s/#master: salt/master: MasterIP地址/" /etc/salt/minion                   ###传入Master端IP地址
  service salt-minion start###启动salt-minion
  如果开启防火墙的话,需要配置防火墙,参考https://docs.saltstack.com/en/latest/topics/tutorials/firewall.html#iptables
# Allow Minions from these networks  
-I INPUT -s 10.1.2.0/24 -p tcp -m multiport --dports 4505,4506 -j ACCEPT
  
-I INPUT -s 10.1.3.0/24 -p tcp -m multiport --dports 4505,4506 -j ACCEPT
  
# Allow Salt to communicate with Master on the loopback interface
  
-A INPUT -i lo -p tcp -m multiport --dports 4505,4506 -j ACCEPT
  
# Reject everything else
  
-A INPUT -p tcp -m multiport --dports 4505,4506 -j REJECT
  在master,minion分别启动后会minion端会到master这里申请认证
  master执行:
  salt-key –L   ##列出所有认证的客户端
  Accepted Keys:(已经接受的)
  minion-id-1
  Denied Keys:(未被允许的)
  Unaccepted Keys:(未接受的)
  minion-id-2
  Rejected Keys:(拒绝的)
  # salt-key –A   ##接受所有
  每个minion客户端的都有一个minion_id即上面的minion-id-1minion-id-2 就是客户端的minion_id 默认是取得客户端的主机名,而minion-id是不能重复的!!!
  注:如需更改需要在客户端修改/etc/salt/minion_id配置文件,此文件只有在salt-minion启动后才会生成
  Salt-key常用命令
  salt-key –a   接受某个客户端请求
  salt-key –A   接受所有客户端请求
  salt-key –d   删除单个客户端
  salt-key –D   删除所有客户端
  注:删除之后,如需重新认证,重启客户端即可
  Salt配置文件
  两个重要的配置参数是file_roots(定义环境的目录),nodegroups(定义组)
  主要配置文件在/etc/salt/master(master端)
  /etc/salt/minion(minion端)
  注:master端配置文件默认是会加载所有/etc/salt/master.d/(此目录默认不存在,需自己创建)目录下的所有以.conf结尾的配置文件,为了更易阅读,我将所有的自定义参数每个单一的创建一个配置文件,如环境变量,可以分别设置生产,测试,开发环境,在往下分就是主机的应用级别分类,根据具体环境,具体设置。
/etc/salt/master.d/env.conf  
file_roots:
  
base:
  
    - /data/salt/base
  
    - /data/salt/base/sls
  
apache:
  
    - /data/salt/apache
  
    - /data/salt/apache/confsls
  
nginx:
  
    - /data/salt/tomcat
  
    - /data/salt/nginx/confsls
  
mysql:
  
    - /data/salt/mysql
  如上述配置所述,一共定义了四个个环境,分别是base,apache,nginx,mysql等,环境变量的作用在下面会说到,主要是配合sls文件使用
  不同环境的sls配置文件的目录分别放在对应的目录,比如base环境的sls文件,既可以放在/data/salt/base 也可以放在/data/salt/base/sls,其中sls文件是什么会在后面说到
  接下来配置所有minion的分组信息,按照用途或者不同ip等分类信息分别定义组名
/etc/salt/master.d/groups.conf  
nodegroups:
  
redis: 'redis*'
  
mysql: 'mysql*'
  
apache: 'tomcat* not apache-'
  
nottom: '* not tomcat*'
  如上所述上面一共定义了四个组
  注:注意上面的格式,salt几乎所有的配置文件遵循两个空格为一个递进的方式(即file_root下面空两个的都是它的参数,二它参数下面空两格的又是它参数的参数,后面写配置文件会更全面的介绍),而且不能用tab键补全!!!
  
  Salt常用命令:
  Salt语法
  salt[客户端id,即目标][模块名,如state,cmd。其实都是salt的模块][动作]
  接触saltstack的第一个salt命令一定是test.ping,主要用于探测客户端的存活状态
  
  注:常用的两个模块主要是state,cmd两个模块,分别对应的功能就是state(状态,在后面会详细叙述,什么是状态),以及cmd(远程执行,而用到此模块的方法一般就是cmd.run)
  首先介绍target,目标,或者说客户端id的匹配方式
  # salt \* test.ping
  minion-1:
  True
  minion-2:
  True
  minion-3:
  True
  minion-4:
  True
  True代表正常,没有响应当然代表客户端没有启动或者没有认证成功之类的。
  指定目标主要有五种方式
  一: Global,即salt默认的匹配方式,能识别终端常用的通配符,如*代表所有
  如,salt '*' test.ping
  二: List,列表,需-L指定。
  如,salt-L 'foo,bar' test.ping 其中foo,bar是完整的minion_id
  三:正则表达式,需-E指定。
  如,salt-E 'pre' test.ping 会匹配pre1,pre2..pre7,并且匹配到左右minion_id里面含有1-7的,如pre-11,pre7也会匹配到,如果只匹配1-7可使用参照下面
  如,salt-E ^pre$ test.ping或者 saltpre test.ping
  四:混合模式,需-C指定。里面可以既有正则表达式也有列表等
  salt -C "apache* or E@ngin*" test.ping 匹配所有tomcat开头,或者mon开头的
  五:分组,需要-N指定,其中组名就是上面/etc/salt/master.d/groups.conf文件里面配置的配置信息。
  如,salt -N apache test.ping
  然后是模块,主要介绍state,cmd,cp模块
  注:想了解某个模块的功能或者具体参数可以
  salt \* sys.doc [模块名,如cmd]
  即salt \* sys.doc cmd就会列出相关操作及示例了
  远程命令执行
  远程命令执行大概是最常用的操作的,比如获取所有minion端的ip地址,查看同一个目录下的文件,全部增加一条环境变量到/etc/profile文件里并刷新环境变量等等操作
  cmd模块
  主要用此模块的run方法,即cmd.run
  使用方式如下,
  salt \* cmd.run 'ls /root'
  如上所示,选择了所有的客户端,master端用cmd.run模块,把''里面的'ls /root'命令全部分发下去,其中单引号''也可以用双引号""代替,引号的作用就是把被引号的命令传给salt-master,然后master分发给所有的minion执行,上述命令就会列出所有minion端/root目录下的文件
  
  注:引号里面的命令跟在任何一台机器上的命令没有任何区别,唯一的区别就是salt执行的命令默认用的是sh,而我们常用的shell是bash,比如bash中ll是ls –l的别名,而sh里面是没有做ll的别名的,所以引号里面的命令如果用ll命令会提示找不到此命令的
  cmd有几个有用的参数,在可以着重介绍一下
  cwd 定义命令所在的目录,即工作目录,在哪个目录执行操作
  如:
  Salt \* cmd.run cwd=/opt ‘pwd’
  minion-id-1:
  /opt
  runas,定义执行此条命令的用户,使用哪个用户执行这条命令
  如:
  Salt \* cmd.run runas=nobody ‘touch /tmp/file’
  然后去客户端就会发现,在/tmp/目录下有一个file文件,拥有者是nobody
  然后就state模块了
  主要用到的几个方法是sls,highstate,show_sls
  在讲state模块的时候首先得了解sls文件。
  Sls文件用.sls结尾,放在指定的环境目录下,即提到的/data/salt/base /data/salt/base/sls或者/data/salt/apache/sls等目录
  注:假如在这两个目录下有两个一样的sls文件,那么会file_root配置的第一个环境目录,即
  比如环境:
  base:
  /data/salt/base
  /data/salt/base/sls
  会执行/data/salt/base里的sls文件,因为它在前一行
  sls文件基本格式如下:
  例子一
/tmp/ttt20:  
file.managed:
  
    - source: salt://files/tst
  
    - mode: 700
  
    - backup: minion
  
    - makedirs: True
  例子二
testfile:  
file.managed:
  
- name: /tmp/ttt20
  
    - source: salt://files/tst
  
    - mode: 700
  
    - backup: minion
  
    - makedirs: True
  如上所示,其实例子一与例子二是达成了一样的效果,只不过写法不一样
  像例子一,因为没有- name: /tmp/ttt20所以,它会去第一行的标识作为name
  ,而例子二的testfile可以任意起名,只要不与该文件中的其他标识一样即可。
  上面的例子达到的功能就是,将/srv/salt/files/tst文件复制到客户端的/tmp/ttt20位置,如果存在则替换,如果已存在且一样则提示is correct state,即已经是正确的状态了。
  然后就是top.sls
  在每个独立的salt环境下有且只能有一个top.sls文件,这个文件为该环境的入口文件,里面记录了目标主机对应的sls文件
  如:
base:  
minion-id-1:
  
    - test1
  
    - test2
  

  
minion-id-2:
  
    - test1
  
    - test3
  以tomcat-1为例
  它匹配了
    - test1  
    - test2
  上面一共是一个2个sls配置文件,即匹配该环境下的test11.sls,test2.sls文件
  所以在执行state模块的时候,它会去检索这些对应的配置文件并执行该配置文件里的内容。
  注:在前面提到过,这些参数前面的空格不能用tab键补全或者少写,不然会报错,再者就是如果配置文件为xxxx.sls在调用这个配置文件的时候只要写xxxx,即它的文件名,没有后缀
  以test1为例
/tmp/testfile.txt:  
file.managed:
  
    - source: salt://test.txt
  
    - mode: 700
  
    - user: root
  
    - mode: 644
  
    - makedirs: True
  功能就是调用file模块,将salt://test.txt(其中,salt://对于该环境的file_root目录,即/data/salt/base)与目标的/tmp/testfile.txt文件做比对,如不一致则更新。
  并且此文件的拥有者为root mask码为644,如果目标文件目录不存在就创建
  现在回到highstate,sls,show_sls方法
  执行如下
  salt \* state.sls test
  salt \* state.highstate
  salt \* state.show_sls test
  上面的意思依次是
  1.在当前环境下寻找test.sls文件并执行
  2.匹配当前环境的top.sls文件所有的sls文件并执行
  3.查看当前环境test.sls文件的执行内容,但是不在客户端执行。
  注:上面特别提到了是在当前环境,默认情况下,salt只会查找执行base环境下的sls文件,不会执行其他环境的配置文件,所以在不同环境下,需要指定要执行的配置环境,比如apache环境,只是执行apache的sls文件的话,则需声明saltenv=apache,如下
  
  salt \* state.sls test saltenv=apache
  salt \* state.highstate saltenv=apache
  salt \* state.show_sls test saltenv=apache
  暂时写到这里吧,如有错误还望指正
页: [1]
查看完整版本: Saltstack简单汇总,快速入门