saltstack是自动化管理工具。


术语:

Master - 控制中心,salt命令运行和资源状态管理端 

Minions - 需要管理的客户端机器,会主动去连接Master端,并从Master端得到资源状态信息,同步资源管理信息

States - 配置管理的指令集 

Grains - minion端的变量,静态 

pillar - minion端的变量,动态

highstate - 给minion永久下添加状态,从sls配置文件读取到的

salt schedule - 自动保持客户端配置


安装源

centos6

rpm -ivh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm

centos5

rpm –ivh http://mirror.pnl.gov/epel/5/i386/epel-release-5-4.noarch.rpm 


安装

yum –y install salt-master (master 安装)

yum –y install salt-minion (minion 安装)


master配置

编辑配置文件/etc/salt/master 修改如下所示的配置项,去掉注释

interface: 0.0.0.0

keep_jobs: 12                        #12小时清楚一次cache

    file_recv: Ture              #开启master从minion上拉取文件

file_recv_max_size: 2000             #拉取文件的最大2000m(默认为m)


file_roots:                          #修改saltstack管理目录

       base:

            - /srv/salt

nodegroups:                          #配置组

  lc1: '[email protected],rsync2.a.com'

  

  

minion配置

master: 192.168.100.102

id: rsync1.a.com  

schedule:                #配置受控端同步,每隔60秒与主控端进行同步一次 编辑/etc/salt/minion

  highstate:

    function: state.highstate

    seconds: 60


证书管理

salt-key -L                       #列出所有

salt-key -a rsync1.a.com          #接受一个证书



通信测试

测试与受控主机网络是否通畅

salt '*'  test.ping


执行客户端的命令

salt '*'  cmd.run 'ifconfig'


可以通过grains查看一些系统信息,例如

salt \* grains.items

查看单个grain,使用grains.item命令

salt \* grains.item os


安装软件

[root@rsync2 ~]# salt -N lc1 pkg.install telnet


查看已经安装的包

[root@rsync2 ~]# salt '*' pkg.list_pkgs


删除包

[root@rsync2 ~]# salt '*' pkg.remove telnet


查看你repos

[root@rsync2 ~]# salt '*' pkg.list_repos


模板的使用



文件的拷贝

[root@rsync2 salt]# cat zabbix/zabbix.sls

/etc/zabbix/zabbix_agentd.conf:

  file.managed:

    - source: salt://zabbix/zabbix_agentd.conf

    - mode: 644

    - owner: root

    - group: root

    - template: jinja

zabbix/zabbix_agentd.conf中的Hostname换成下面

{% if grains['os'] == 'Ubuntu' %}

Hostname={{ grains['host'] }}

{% elif grains['os'] == 'CentOS' %}

Hostname={{ grains['fqdn'] }}

{% endif %}

执行

[root@rsync2 salt]# salt -N "lc2" state.sls zabbix.zabbix



监控配置文件的更改 

[root@rsync2 salt]# vim apache/httpd.sls 

test1:                         #id宣告

  pkg:                         #安装包管理

    - name: httpd              #安装哪个软件

    - installed                #要求是安装

  service:                     #服务管理

    - name: httpd              #指定服务

    - running                  #服务运行状态

    - reload: True             #是否重启

    - watch:                   #如果下面文件发生变化,就重启

      - file: /etc/httpd/conf/httpd.conf        #监控的文件地址

/etc/httpd/conf/httpd.conf: #宣告

  file.managed:                #文件管理

    - source: salt://apache/httpd.conf          #源数据在哪里

    - user: root               #用户

    - group: root              #组

    - mode: 644                #权限

    - backup: minion           #备份一份

    - template: jinja          #使用的模板

执行

[root@rsync2 salt]# salt -N "lc2" state.sls apache.httpd



创建用户

[root@rsync2 users]# vim lists.sls 

test13:

  user.present:

    - name: test13

    - gid: wheel

    - fullname: zhou test13

    - workphone: 11111111111

    - password: '$6$v9/LkY5c$t5OZ/2O0l6gWVd5LH7OHC8OEHMsWvfhYAsMYrZJ8trL5Xmfi02Y9.6XFiT8F6GH2vsjF6g9AefdGdpgp99p7Z1'

    - shell: /bin/bash

    - home: /home/test13

/home/test13/.ssh/authorized_keys:

  file.managed:

    - source: salt://users/keys/test13

    - makedirs: True

    - mode: 600

    - owner: test13

    - group: wheel

    - template: jinja

执行

[root@rsync2 salt]# salt "rsync1.a.com" state.sls users.lists

rsync1.a.com:

----------

          ID: test13

    Function: user.present

      Result: True

     Comment: User test13 is present and up to date

     Changes:

----------

          ID: /home/test13/.ssh/authorized_keys

    Function: file.managed

      Result: True

     Comment: File /home/test13/.ssh/authorized_keys is in the correct state

     Changes:


Summary

------------

Succeeded: 2

Failed:    0

------------

Total:     2


user.present: 确保指定的账户名存在,并指定其对应的属性. 这些属性包括如下内容:


name: 指定需要管理的账户名.


uid: 指定uid, 如果不设置将配自动分配下一个有效的uid.


gid: 指定默认的组id(group id)


gid_from_name: 如果设置为_True_,默认的组id将自动设置为和本用户同名的组id


groups: 分配给该用户的组列表(a list of groups). 如果组在minion上不存在,则本state会报错. 如果设置会空,将会删除本用户所属的除了默认组之外的其他组


optional_groups: 分配给用户的组列表。 如果组在minion上不存在,则state会忽略它.


home: 关于用户的家目录(home directory).


password: 设置用户hash之后的密码.


enforce_password: 当设置为_False_时,如果设置的_password_与用户原密码不同,将保持原密码不做更改.如果没有设置_password_选项,该选项将自动忽略掉.


shell: 指定用户的login shell。 默认将设置为系统默认shell。


unique: UID唯一,默认为True.


system: 从_FIRST_SYSTEM_UID_和_LAST_SYSTEM_UID_间选择一个随机的UID.


用户描述选项(GECOS)支持(当前只支持Linux和FreeBSD系统):


fullname: 指定用户全名(full name).


roomnumber: 指定用户的房间号.


workphone: 指定用户的工作电话号码.


homephone: 指定用户的家庭电话号码.



user.absent 用于删除用户.其有以下选项:


name: 指定需要删除的用户名.


purge: 设置清除用户的文件(家目录)


force: 如果用户当前已登录,则absent state会失败. 设置_force_选项为True时,就算用户当前处于登录状态也会删除本用户.


当管理用户时,至少需要指定_user.present_或_user.absent_。 其他选项是可选的,比如_uid_、_gid_、_home_等选项没有指定是,将自动使用下一个有效的或者系统默认的


拷贝目录

[root@rsync2 dir]# vi file.sls

/tmp/zhou:                #id宣告

  file.recurse:           #使用文件递归模块

    - makedirs: Ture      #创建目录

    - user: root          #文件的用户

    - group: root         #文件的组

    - dir_mode: 755       #文件的权限

    - template: jinja     #使用的模板

    - source: salt://zhou #文件的来源

    - include_empty: True #空目录也拷贝

    - clean: True         #清理现在不存在文件或目录



执行

[root@rsync2 dir]# salt -N 'rsync1' state.sls dir.file 



引入变量


一样的文件拷贝

[root@rsync2 files]# cat myapp.sls

/etc/myapp.conf:

  file.managed:

    - source: salt://files/myapp2.conf

    - mode: 644

    - owner: test2

    - group: test2

    - template: jinja


参数的使用

[root@rsync2 files]# cat myapp2.conf

Listen: {{ pillar['db']['listen'] }}


参数的定义

[root@rsync2 pillar]# cat top.sls

base:

  'rsync1.a.com':

    - data

  'rsync2.a.com':

    - data2

[root@rsync2 pillar]# cat data.sls

db:

  listen: 888

[root@rsync2 pillar]# cat data2.sls

db:

  listen: 1111


执行

[root@rsync2 pillar]# salt -N 'lc1' state.sls files.myapp


查看所有变量

[root@rsync2 pillar]# salt 'rsync1.a.com' pillar.items


高级部分

cp.get_file用来从master下载文件到客户端,语法如下:


# salt '*' cp.get_file salt://vimrc /etc/vimrc


对于大文件,cp.get_file支持gzip压缩,在参数中指定gzip的压缩级别,如下:


# salt '*' cp.get_file salt://vimrc /etc/vimrc gzip=5




cp.get_file默认不在客户端上建立目录,如果客户端上没有这个目录了,文件拷贝将失败,可以指定makedirs=True来创建目录:


# salt '*' cp.get_file salt://vimrc /etc/vim/vimrc makedirs=True


cp.get_dir可以从master下载整个目录,语法如下:


# salt '*' cp.get_dir salt://etc/apache2 /etc

cp.get_dir也支持模板和压缩:


# salt '*' cp.get_dir salt://etc/`pillar`.`webserver` /etc gzip=5 template=jinja



get_url


cp.get_url可以从一个URL地址下载文件,URL可以是msater上的路径(salt://),也可以是http网址。


# salt '*' cp.get_url salt://my/file /tmp/mine

# salt '*' cp.get_url http://www.slashdot.org /tmp/index.html


get_template


cp.get_template可以在文件下载之前用模板引擎处理。


# salt '*' cp.get_template salt://path/to/template /minion/dest