企业实战--saltstack自动化运维(grains与pillar详解)

一、grains

简介

Grains是SaltStack的一个组件,存放在SaltStack的minion端。

当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。

由于grains是静态数据,因此不推荐经常去修改它。

应用场景:

信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。

信息查询

用于查询minion端的IP、FQDN等信息

默认可用的grains键:

[root@server1 salt]# salt server3 grains.ls
server3:
    - SSDs
    - biosreleasedate
    - biosversion

查看grains键值对的信息:

[root@server1 salt]# salt server3 grains.items

也可以查看其中一项的信息:

[root@server1 salt]# salt server3 grains.item os		#查看系统
server3:
    ----------
    os:
        RedHat
[root@server1 salt]# salt server3 grains.item nodename		#查看主机名
server3:
    ----------
    nodename:
        server3
[root@server1 salt]# salt server3 grains.item shell			#查看shell类型
server3:
    ----------
    shell:
        /bin/sh

自定义grains项

1.在minion端主机/etc/salt/minion中定义:

[root@server3 ~]# vim /etc/salt/minion
grains:
  roles:
    - apache
    - httpd


在这里插入图片描述
重启salt-minion,否则数据不会更新:

[root@server3 ~]# systemctl restart salt-minion

在master查看:

[root@server1 salt]# salt server3 grains.item roles
server3:
    ----------
    roles:
        apache

通过-G选项使用定义的grains信息对主机进行匹配:

[root@server1 salt]# salt -G 'roles:apache' test.ping
server3:
    True

2.在minion端主机/etc/salt/grains中定义:

在server2:

[root@server2 salt]# vim /etc/salt/grains
[root@server2 salt]# cat /etc/salt/grains
roles: nginx

这种定义方式不需要重启minion端,但是需要同步:

[root@server1 salt]# salt server2 saltutil.sync_grains

同步后查看:

[root@server1 salt]# salt server2 grains.item roles
server2:
    ----------
    roles:
        nginx

定义成功。

3.在salt-master端创建_grains目录:

以上两种定义方式都需要在minion端操作,这种方式只需要在master端操作即可。
创建_grains目录

[root@server1 salt]# mkdir /srv/salt/_grains
[root@server1 salt]# ls
apache  _grains  _modules  nfs  nginx  top.sls

编写my。grains。py文件

[root@server1 salt]# cd _grains/
[root@server1 _grains]# vim my_grain.py
[root@server1 _grains]# cat my_grain.py 
def my_grain():
    grains = {}
    grains['salt'] = 'stack'
    grains['hello'] = 'world'
    return grains

在_grains目录中编辑py文件定义grains,定义后需要进行同步:

[

root@server1 _grains]# salt '*' saltutil.sync_grains
server2:
    - grains.my_grain
server3:
    - grains.my_grain

同步后就可以进行查看:

[root@server1 _grains]# salt '*' grains.item salt
server3:
    ----------
    salt:
        stack
server2:
    ----------
    salt:
        stack
[root@server1 _grains]# salt '*' grains.item hello
server2:
    ----------
    hello:
        world
server3:
    ----------
    hello:
        world

使用grains

在target中匹配minion:

[root@server1 salt]# salt -G 'roles:apache' test.ping
server3:
    True

在top文件中匹配:

[root@server1 salt]# vim top.sls 
[root@server1 salt]# cat top.sls 
base:
  'roles:apache':
    - match: grain
    - apache
  'roles:nginx':
    - match: grain
    - nginx

匹配到’roles:apache’ grain的节点执行apache目录的文件,匹配到’roles:nginx’ grain的节点执行nginx目录的文件,

二、pillar

简介

pillar和grains一样也是一个数据系统,但是应用场景不同。

pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。

pillar更加适合在配置管理中运用。

声明pillar

pillar的默认路径是/srv/pillar,这个路径需要我们自己建立,

[root@server1 srv]# mkdir /srv/pillar

编辑定义文件:

[root@server1 srv]# cd pillar/
[root@server1 pillar]# vim web.sls
[root@server1 pillar]# cat web.sls 
{% if grains['fqdn'] == 'server3' %}
webserver: httpd
port:80
{% elif grains['fqdn'] == 'server2' %}
webserver: nginx
port:8080
{% endif %}

以上文件内容表示给server3定义pillar webserver: httpd,给server2定义pillar webserver: nginx

编辑top文件:

[root@server1 pillar]# vim top.sls
[root@server1 pillar]# cat top.sls 
base:
  '*':
    - web

以上文件内容表示对所有节点匹配web.sls文件中的pillar信息。

[root@server1 pillar]# salt '*' pillar.items
server3:
    ----------
    port:
        80
    webserver:
        httpd
server2:
    ----------
    port:
        8080
    webserver:
        nginx

但是此时执行以下两条查看指令却没有返回:pillar与grains不同的是,由于其是动态的,因此pillar定义后直接就可以使用,但是当我们使用pillar。item查看时就需要刷新:salt '*' saltutil.refresh_pillar

[root@server1 pillar]# salt '*' pillar.item port
server2:
    ----------
    port:
server3:
    ----------
    port:
[root@server1 pillar]# salt -I 'webserver:nginx' test.ping

我们可以执行以下指令使其正常:

[root@server1 pillar]# salt '*' saltutil.refresh_pillar			#刷新pillar数据
server2:
    True
server3:
    True
[root@server1 pillar]# salt '*' pillar.item port
server3:
    ----------
    port:
        80
server2:
    ----------
    port:
        80
[root@server1 pillar]# salt -I 'webserver:nginx' test.ping
server2:
    True

在文件中使用pillar

[root@server1 pillar]# cd ../salt/
[root@server1 salt]# cd apache/
[root@server1 apache]# ls
httpd.conf  init.sls
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls 
apache:
  pkg.installed:
    - pkgs:
      - {{ pillar['webserver'] }}
  service.running:
    - name: httpd
    - reload: true
    - enable: true
    - watch:
      - file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://apache/httpd.conf

调用时使用{{ pillar[‘webserver’] }}的方式,表示读取推送节点的webserver pillar信息。
推送:

[root@server1 apache]# salt server3 state.sls apache

你可能感兴趣的:(企业实战saltstack)