saltstack详解(学习汇总)

saltstack


介绍:

1.是一个基础平台管理工具
2.是一个配置配置管理系统,能够维护预定义状态的远程节点
3.是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据

三大功能:

  • 远程执行
  • 配置管理(状态)
  • 云管理

安装

1.先安装指定epel源

baseurl=http://repo.saltstack.com/yum/redhat/6.7/x86_64/

2.安装master

yum install -y salt-master

3.安装minion

yum install -y salt-minion

配置

1.修改minion的配置文件/etc/salt/minion

master后面加上master的IP地址或域名

2.修改master的配置文件/etc/salt/master

修改为 log_level: debug
在 file_roots后面加上state.sls所在的文件夹

3.启动服务

systemctl start salt-master
systemctl start salt-minion

认证

salt-key 查看目前已认证与未认证的minion

minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key)和minion.pub(public key),然后将minion.pub发送给master。

master在第一次启动时,会在/etc/salt/pki/master下自动生成master.pem

salt-key -a hostname进行认证

认证成功后master与minion都会有对方的公钥,就可以进行通信了


远程执行

1.测试连通

salt '*' test.ping

'*'表示所有目标机器 test.ping 只是模块里的一个功能,用来测试连通性

2.常用命令结构

salt [options] ‘<目标机>’ <功能> [arguments]

例如:

#对机器node1使用w命令
test 'node1' cmd.run 'w'

3.常用命令

salt-run

该命令执行runner(salt带的或者自定义的,runner以后会讲),通常在master端执行,比如经常用到的manage

salt-run [options] [runner.func]
salt-run manage.status   ##查看所有minion状态
salt-run manage.down     ##查看所有没在线minion
salt-run manged.up       ##查看所有在线minion

salt-key

密钥管理,通常在master端执行

salt-key [options]
salt-key -L              ##查看所有minion-key
salt-key -a <key-name>   ##接受某个minion-key
salt-key -d <key-name>   ##删除某个minion-key
salt-key -A              ##接受所有的minion-key
salt-key -D              ##删除所有的minion-key

salt-call

该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job

salt-call [options] <function> [arguments]
salt-call test.ping           ##自己执行test.ping命令
salt-call cmd.run 'ifconfig'  ##自己执行cmd.run函数

salt-cp

分发文件到minion上,不支持目录分发,通常在master运行

salt-cp [options] '<target>' SOURCE DEST
salt-cp '*' testfile.html /tmp
salt-cp 'test*' index.html /tmp/a.html

state.sls

SLS(代表SaLt State文件)是Salt State系统的核心。SLS描述了系统的目标状态,由格式简单的数据构成。这经常被称作配置管理。首先,在master上面定义salt的主目录,默认是在/srv/salt/下面。

1.YAML

sls采用YAML的格式编写

1.空格和Tabs
在YAML中不要使用Tab

2.缩进
YAML推荐缩进为2个空格,**’ : ’ , ’ - ’**后面缩进1个空格再写

3.数字会解析成数字
如mode: 0644会解析成mode: 644,可用’括住防止mode: ’0644′此情况

4.YAML不允许双简写

5.下划线将会被删除
有出现下划线要用 " " 括起来

2.基本格式

1| httpd:
2|   pkg:
3|     - installed

第一行被称为标签定义,在这里被定义为安装包的名
第二行被称为状态定义,在这里定义使用module
第三行被称为函数定义,在这里定义使用调用函数


3.常用模块

(1)用户管理

创建用户

user.present: - shell: /bin/bash - home: /home/admin - uid: 888

删除用户
user.absent: - purge: True - force: True
#purge类似userdel -r force为用户在线也强制删除

(2)文件管理

上传文件
		  file.managed:
		    - source:salt://nginx/nginx-xxx.xxx.tar.gz
		    - user: root
		    - group:root
		    - mode: 755
		    - backup:minion
		    - template:jinja
追加文件
		file.append:
		  - text:
	        - "exportJAVA_HOME=/usr/local/jdk1.6.0_13"
	        - "exportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH"
	        - "exportCLASSPATH=$JAVA_HOME/lib/:$JAVA_HOME/jre/lib:$CLASSPATH"

(3)包管理

yum安装
    pkg.latest:
      - pkgs:
        - aspell
        - ncurses
        - ncurses-devel
        - pcre-devel
        - telnet
        - libcurl
        - libcurl-devel

(4)目录管理

目录覆盖
	  file.recurse:
	    -source: salt://nginx/conf
	    -user: root
	    -group: root
	    -file_mode: 644
	    -dir_mode: 755
	    -template: jinja
		  - backup: minion
		  - makedirs: True
		  - include_empty: True
		  - recurse:
		  - user
		  - group
		  - mode
目录创建
	 file.directory:
	    - user: web
	    - group: web
	    - file_mode:644
	    - dir_mode:755
	    - makedirs:True
	    - include_empty: True
	    - template:jinja
	    - backup:minion

(5)逻辑关系

继承(include)
include:
  - web.apache
...
依赖(require)

依赖某个state,在运行此state前,先运行依赖的state,依赖可以有多个

require:
  - pkg: nginx
...
监控(watch)

在某个state变化时运行此模块,文中的配置,相关文件变化后,立即执行相应操作

- watch:
  - file: /etc/nginx/nginx.conf
  - file: /etc/nginx/fastcgi.conf
  - pkg: nginx 
顺序(order)

优先级比require和watch低,有order指定的state比没有order指定的优先级高,假如一个state模块内安装多个服务,或者其他依赖关系,可以使用。如果想让某个state最后执行,可以使用last。

nginx:
  pkg.installed:
    - order:1

举例:批量安装tengine

make.sls

1| pkg-init:
2|   pkg.installed:
3|     - pkgs:
4|       - automake
5|       - gcc-c++
6|       - zlib-devel
7|       - openssl-devel
8|       - pcre-devel

install.sls

include:
  - tengine.make
  
tengine_source:
  file.managed:
    - name: /tmp/tengine-2.3.1.tar.gz
    - unless: test -e /tmp/tengine-2.3.1.tar.gz
    - source: salt://tengine/files/tengine-2.3.1.tar.gz

extract_tengine:
  cmd.run:
    - cwd: /tmp
    - names:
      - tar zxf tengine-2.3.1.tar.gz
    - unless:
      - test -d tengine-2.3.1
    - require:
      - file: tengine_source

tengine_compile:
  cmd.run:
    - cwd: /tmp/tengine-2.3.1
    - names:
      - ./configure --prefix=/usr/local/tengine && make && make install
    - require:
      - cmd: extract_tengine
    - unless: test -d /usr/local/tengine

init.sls

include:
  - tengine.make
  - tengine.install

top.sls(放置在salt工作根目录)

base:
  '*':
    - tengine

执行命令salt ‘’ state.sls tengine 或者 salt '’ state.highstate 便可以在所有minion上自动编译安装tengine


数据系统

Grains

服务器的一些静态信息,这里强调的是静态,就是不会变的东西。比如说os是centos不会变化,除非重新安装系统。

salt 'node1' grains.list  列出node1所有的静态数据键
salt 'node1' grains.items 列出node1所有的静态数据键与值
salt '*' grains.item os 列出所有机器的os

-G 用于对匹配到的进行操作 (目标选择)

salt -G ‘os:CentOS’ cmd.run ‘echo haha’

自定义grains的3种手段

直接在/etc/salt/minion中定义

grains:
   roles:
      - webserver
      - memcache

创建/etc/salt/grains

vim /etc/salt/grains
  hehe:321
  haha:654

开发grains

用python 写一个python脚本,返回一个字典就可以了
在 /srv/salt/ 下创建一个 _grains 的目录,然后在目录中创建一个.py文件

#!/usr/bin/env python

def my_grains():
    grains = {}
    grains['iaas'] = 'openstack'
    grains['edu'] = 'aron'
    return grains

grains的优先级

1.系统自带
2.grains文件写的
3.minion配置文件写的
4.自己写的

每次修改数据都需要重启服务或刷新grains操作才会生效,这也印证了是静态数据
命令 salt ‘*’ saltutil.sync_grains 用于刷新grains的数据

Pillar

Pillar在salt中是非常重要的组成部分,利用它可以完成很强大的功能,它可以指定一些信息到指定的minion上。不像grains一样是分发到所有Minion上的,它保存的数据可以是动态的。Pillar以sls来写的,格式是键值对。

适用情景:
1.比较敏感的数据,比如密码,key等
2.特殊数据到特定Minion上
3.动态的内容
4.其他数据类型

查看Minion的Pillar信息

salt '*' pillar.items

####查看某个Pillar值

salt '*' pillar.item <key>      #只能看到顶级的
salt '*' pillar.get <key>:<key> #可以取到更小粒度的

编写pillar数据

指定pillar_roots,默认是/srv/pillar(可通过修改master配置文件修改),建立目录
mkdir /srv/pillar
cd /srv/pillar

编辑一个pillar数据文件

vim test1.sls
name: 'salt'
 users:
   hadoop: 1000
   redhat: 2000
   ubuntu: 2001

建立top file指定minion到pillar数据文件

vim top.sls
 base:
   '*':
     - test1

刷新pillar数据

salt '*' saltutil.refresh_pillar

测试是否生效

salt '*' pillar.get name
salt '*' pillar.item name

在state中通过jinja使用pillar数据

vim /srv/salt/user.sls
 {% for user, uid in pillar.get(’users’, {}).items() %}
 {{user}}:
   user.present:
     - uid: {{uid}}
 {% endfor %}

通过jinja模板配合grains指定pillar数据

/srv/pillar/pkg.sls
 
pkgs:
 {% if grains[’os_family’] == ’RedHat’ %}
 apache: httpd
 vim: vim-enhanced
 {% elif grains[’os_family’] == ’Debian’ %}
 apache: apache2
 vim: vim
 {% elif grains[’os’] == ’Arch’ %}
 apache: apache
 vim: vim
 {% endif %}

salt schedule

schedule是salt中的crontab,就是周期性执行一些函数,需要注意的是在minion上执行的函数是salt的可执行模块里的函数,在master上执行的是runner模块的函数。下面看看如何设置: master是修改master配置文件/etc/salt/master:

#每隔3小时30分35秒,master就会运行一个state.over这个runner
schedule:
  overstate:                    ##这个是ID,可以随意起,全文件唯一
    function: state.over        ##对于master,function就是runner
    seconds: 35                 ##间隔秒数
    minutes: 30                 ##间隔分数
    hours: 3                    ##间隔小时数

minion的两种schedule定义方式
1.通过修改minion的配置文件,这种方式需要修改所有Minion的配置文件

schedule:
 highstate:
   function: state.highstate
seconds: 30
minutes: 5
hours: 1

2.为Minion指定pillar

schedule:
 highstate:
   function: state.highstate
seconds: 30
minutes: 5
hours: 1

自定义可执行模块

所有可执行module可见:
https://github.com/saltstack/salt/tree/develop/salt/modules
http://docs.saltstack.com/ref/modules/all/index.html?highlight=full list builtin

1.建立自定义模块目录,通常所有自定义模块放在该目录下

mkdir /srv/salt/_modules

2.编写模块(示例)

vim test.py

-*- coding: utf-8 -*-

def __virtual__():

   if __grains__.get('os_family', 'unkown') == 'RedHat':
       return 'yum'
   else:
       return False
 
 
def install(rpm):
   cmd = 'yum -y install {0}'.format(rpm)
   re = __salt__['cmd.run'](cmd)
   return re

说明:__virtual__函数通常用来匹配是否满足该模块的环境,满足return出来的字符串作为该模块的名字而不是文件名,但return的是False代表的此模块无效,不能使用。在自定义模块中可以中__grains__是一个包含了minion 所有grains的字典,__pillar__是包含了所有Pillar的grains字典,__salt__是所有可执行函数对象的字典,通常最常使用的就是这三个变量了。再往下面是定义了函数install,在salt中一般不用’%s’ % var这种格式化形式,而是使用字符串的format方法。下面就是通过__salt__执行了cmd.run这个函数来运行yum命令。


版权声明:本文为weixin_44541528原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。