一、grains

grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等。

# salt 'yw02' grains.ls   列出所有的grains项目名字
# salt 'aming-02' grains.items   列出所有grains项目以及值

grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的。

我们可以根据grains收集到的一些信息,做配置管理工作。

grains支持自定义信息。


自定义grains

minion上:

# vim /etc/salt/grains  //添加,前面是item,后面是value。这都是自定义的。
 role: nginx 
 env: test

重启minion服务

# systemctl restart salt-minion

master上:

获取grains:

 # salt '*' grains.item role env   //可以随便写一个item,如果minion端没有,就什么都不显示。

可以借助grains的item去匹配对应的主机来执行任务或命令

# salt -G role:nginx cmd.run 'hostname'


如果想把机器分组,就可以自定义一个grains。


二、pillar

pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。

配置自定义pillar

# vim  /etc/salt/master   找到如下配置://去掉前面的#号
pillar_roots:     //可以认为是接下来要配置的项目。
  base:   #此行前面有两个空格,项目里它的value叫base。
    - /srv/pillar   #此行前面有4个空格,value里的值叫/srv/pillar。
 重启master    //只有在修改了/etc/salt/master的情况下才需要重启服务,后面的只要刷新pillar配置即可。
# systemctl  restart salt-master    
    
# mkdir /srv/pillar
# vim /srv/pillar/test.sls  //子配置文件,内容如下,saltstack的配置文件通常情况下以sls作为后缀名,方便区分。
conf: /etc/123.conf
 
# vi /srv/pillar/top.sls  //内容如下,这个top.sls文件作为一个总入口。
base:   #base表示这是一个根
  'yw02': #此行前面有两个空格,针对的机器的主机名。
    - test #此行前面有4个空格,意思是要加载哪一个配置文件。-相当于是作为分隔符性质的。
    - test1   #多个就写多行
  'fuxi01':    #也可以写多个机器
    - test2    
这个文件的格式一定要注意,机器前空两gear,对应的配置文件空四格。


当更改完pillar配置文件后,通过刷新pillar配置来获取新的pillar状态:

# salt '*' saltutil.refresh_pillar
验证:# salt  '*' pillar.item conf

pillar同样可以用来匹配对应的主机。

比如 salt  -I 'conf:/etc/123.conf'  test.ping;salt -I 'conf:/etc/123.conf' cmd.run w


三、安装配置httpd

master上

# vi /etc/salt/master //搜索找到file_roots,打开如下内容的注释:
file_roots:
  base: #前面有两个空格
    - /srv/salt #前面有4个空格

# mkdir /srv/salt ; cd /srv/salt
# vi /srv/salt/top.sls  //定义总入口,加入如下内容
base:
  '*':  #前面有两个空格,
    - httpd #前面有4个空格
    
# systemctl restart salt-master

'*'的意思是,在所有的minion客户端上执行httpd模块,也可以写单独的机器。


master上

# vi /srv/salt/httpd.sls  //加入如下内容,这个就是httpd模块的内容
httpd-service:    #定义的服务名字
  pkg.installed:   #salt自带的模块,类似于cmd.run。
    - names:    #后面就是要安装的包的名字。这里如果只有一个服务,那么就可以写成 –name: httpd 不用再换一行了。
      - httpd
      - httpd-devel
  service.running:  #这个模块的作用是为了启动服务的。
    - name: httpd   #启动httpd这个服务
    - enable: True  #True表示要启动,false不启动。

说明: httpd-service是id的名字,自定义的。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running也是一个函数,来保证指定的服务启动,enable表示开机启动。

执行: salt 'yw02' state.highstate   //执行过程会比较慢,因为客户端上在yum install httpd httpd-devel,只要执行了这个state.highstate的命令,就会到/srv/salt目录下去找top.sls,这个配置文件里提到的相关的模块,都会去执行。

# ls /lib/systemd/system/httpd.service   //安装完后,就有这个服务的包了。


四、配置管理文件

master上

# vi /srv/salt/test.sls   //加入如下内容
file_test:
  file.managed:   #引用到的模块
    - name: /tmp/aminglinux.com   #minion端要给到的文件路径
    - source: salt://test/123/1.txt
    - user: root    #文件给过去以后,它的属主属组、权限。
    - group: root
    - mode: 600

说明:第一行的file_test为自定的名字,表示该配置段的名字,可以在别的配置段中引用它,source指定文件从哪里拷贝,来源文件,这里的salt://test/123/1.txt相当于是/srv/salt/test/123/1.txt,salt://这就表示在/etc/salt/master文件中的file_roots定义的根路径/srv/salt。

作用:比如,针对一组机器,改一个服务的配置文件,先把改好后的配置文件的模板搞过来,然后再告诉minion端,把这个文件要分发到机器上的哪一个目录下去,分发完后,可能还要做一些其他的操作,比如重启服务。

# mkdir /srv/salt/test/123
# cp /etc/passwd /srv/salt/test/123/1.txt
# vi /srv/salt/top.sls //因为salt默认找的是top.sls,它是总入口,top会告诉我们接下来要去找哪一个子配置文件,所以这里要改成test:
base:
  '*':
    - test
    
# salt 'yw02' state.highstate
yw02:
----------
          ID: file_test
    Function: file.managed
        Name: /tmp/aminglinux.com
      Result: True
     Comment: File /tmp/aminglinux.com updated
     Started: 19:37:17.272462
    Duration: 591.057 ms
     Changes:   
              ----------
              diff:
                  New file

Summary for yw02
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 591.057 ms

检查yw02上是否有/tmp/aminglinux.com,检查内容以及权限。


五、配置管理目录

master上

# vi /srv/salt/test_dir.sls  //加入如下内容
file_dir:
  file.recurse:   #模块
    - name: /tmp/testdir   #对方机器的目录
    - source: salt://test/123   #模板目录
    - user: root    #给过去后的目录、文件属主及权限
    - file_mode: 640
    - dir_mode: 750
    - mkdir: True
    - clean: True   ##加上它之后,删除源文件或目录,目标也会跟着删除,否则不会删除

修改top.sls,

# vi /srv/salt/top.sls //添加test_dir
base:
  '*':
    - test_dir 
# salt 'yw02' state.highstate

检查yw02上是否有/tmp/testdir,检查里面的目录、文件以及权限

说明:saltstack的一个特性,如果source对应的目录里有空目录的话,客户端上不会同步它,它会认为这是无用的。