Linux下SaltStack的重要数据系统组件grains和pillar和jinja的使用(四)

续我的前四篇博文:https://mp.csdn.net/postedit/88882456,https://mp.csdn.net/postedit/88882815,https://mp.csdn.net/postedit/88920846,https://mp.csdn.net/postedit/88952162即SaltStack已经安装并配置好,httpd和nginx案例已经配置好。

 

一、实验环境(rhel7.3版本)

1selinux和firewalld状态为disabled

2各主机信息如下:

主机ip
server1(master)172.25.83.1
server2(minion)172.25.83.2
server3(minion)172.25.83.3

 

二、grains(存放的是静态数据)

 

1、grains的概念

 

grains是minion第一次启动的时候采集的静态数据,可以用在salt的模块和其他组件中。其实grains在每次minion启动(重启)的时候都会采集,即向master汇报一次。

grains的特性—每次启动汇报、静态决定了它没有pillar灵活,要知道pillar是随时可变的,只要在master端修改了,一般都会立刻生效的。所以grains更适合做一些静态的属性值的采集,例如设备的角色(role),磁盘个数(disk_num)等诸如此类非常固定的属性。
那么我们就可以得到一个大致的判断,如果你想定义的属性值是经常变化的,那请采用pillar,如果是很固定、不易变的那请用grains。

 

2、grains的相关命令:

 

salt server2 grains.items   #查看主机server2的grains详细信息(这里的items相当于字典的key和value)
salt '*' grains.items   #查看所有主机的grains详细信息(这里的items相当于字典的key和value)。值的注意的是:必须写'*',不能写为*

salt server2 grains.item fqdn   #查看主机server2的fdqn这个key值对应的value值。
salt '*' grains.item fqdn   #查看所有主机的fqdn这个key值对应的value值。

salt server2 grains.ls   #查看主机server2的所有key(针对grains)
salt '*' grains.ls   #查看所有主机的所有key(针对grains)

 

3、grains的一些用法

 

[root@server1 ~]# salt server2 grains.item ipv4   #查看主机server2的ipv4的信息
server2:
    ----------
    ipv4:
        - 127.0.0.1
        - 172.25.83.2
[root@server1 ~]# salt '*' grains.item ipv4   #查看所有主机的ipv4信息
server3:
    ----------
    ipv4:
        - 127.0.0.1
        - 172.25.83.3
server2:
    ----------
    ipv4:
        - 127.0.0.1
        - 172.25.83.2
[root@server1 ~]# salt server2 grains.item uuid   #查看主机server2的uuid信息
server2:
    ----------
    uuid:
        d8022f9f-9bbd-4ebe-9de7-f2232d17164a
[root@server1 ~]# salt '*' grains.item uuid   #查看所有主机的uuid信息
server3:
    ----------
    uuid:
        3a5ac263-f82b-4190-97fb-135245788384
server2:
    ----------
    uuid:
        d8022f9f-9bbd-4ebe-9de7-f2232d17164a
[root@server1 ~]# salt server2 grains.item os   #查看主机server2的os信息
server2:
    ----------
    os:
        RedHat
[root@server1 ~]# salt '*' grains.item os   #查看所有主机的os信息
server2:
    ----------
    os:
        RedHat
server3:
    ----------
    os:
        RedHat
[root@server1 ~]# salt -G 'os:Redhat' test.ping   #对系统为Redhat的主机进行test.ping方法
server3:
    True
server2:
    True
[root@server1 ~]# salt -G 'host:server2' cmd.run hostname   #对host为server2的用户执行shell命令hostname
server2:
    server2

 

4、设置grains的方法

 

方法1:基于配置文件修改roles

在minion端(server2):进行配置
[root@server2 ~]# vim /etc/salt/minion   #在server2的minion配置文件中打开grains
121 grains:
122   roles:   #相当于字典的key值
123     - httpd   #相当于字典的value值
[root@server2 ~]# systemctl restart salt-minion   #重启后minion会将grains同步到master

#在master端(server1):进行测试
[root@server1 ~]# salt server2 grains.item roles   #查看server2端的roles信息
server2:
    ----------
    roles:
        - httpd
[root@server1 ~]# salt server2 grains.ls   #查看server2端的所有key信息
    - roles   #我们会看到key信息中有roles出现
[root@server1 ~]# salt -G 'roles:httpd' cmd.run hostname   #查看角色为httpd的主机对应的主机名
server2:
    server2

 

方法2:基于自定义文件的grains

在master端(server1):进行配置
[root@server1 ~]# mkdir /srv/salt/_grains
[root@server1 ~]# cd /srv/salt/_grains/   #该目录的名字必须是_grains
[root@server1 _grains]# vim my_grains.py   #该文件的名字随意给,只要以.py结尾即可
#!/usr/bin/env python
def my_grains():
    grains={}
    grains['roles']='nginx'
    grains['hello']='world'
[root@server1 salt]# salt server3 saltutil.sync_grains    #将server1端将.py文件传给server3

#在master端(server1):进行测试
[root@server1 ~]# salt server3 grains.item roles   #查看server3端的roles信息
server3:
    ----------
    roles:
        nginx
[root@server1 ~]# salt server3 grains.item hello   #查看server3端的hello信息
server3:
    ----------
    hello:
        world
[root@server1 ~]# salt server3 grains.ls   #查看server3端的所有的key
    - hello
    - roles
  • 并且在server3的缓存目录下可以看到该文件

 


值的注意的点:如果master端定义了grains,同时minion端的配置文件中也指定了grains。minion端配置文件的优先级要高于master端定义的grains。

下面我们基于上面的两种方法来证明一下:

从上面的图我们可以得到结论:minion端配置文件的优先级要高于master端的grains。(因为master端定义的roles的信息为nginx,而minion端定义的roles的信息为httpd)。


 

我们设置完上面的grains之后,可以修改之前编写的top.sls文件,再次进行高级推送的实验

[root@server1 ~]# cd /srv/salt/
[root@server1 salt]# ls
_grains  httpd  nginx  top.sls  users
[root@server1 salt]# vim top.sls
base:
  'roles:httpd':
    - match: grain
    - httpd.service

  'roles:nginx':
    - match: grain
    - nginx.service
[root@server1 salt]# salt '*' state.highstate

看到上图,表示配置成功。

 

 

三、pillar(存放的是动态数据)

 

1、pillar的概念

 

pillar是salt用来分发全局变量到所有minions的一个端口
Pillar用于给特定的 minion 定义任何你需要的数据, 这些数据可以被Salt的其他组件使用!安全起见,有些数据是不可以共享出来的,需要指定。比如高度敏感的数据:通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,比如加密的key和密码。

 

2、pillar的相关命令:

 

salt server2 pillar.items   #查看主机server2的pillar详细信息(这里的items相当于字典的key和value)
salt '*' pillar.items   #查看所有主机的grains详细信息(这里的items相当于字典的key和value)。值的注意的是:必须写'*',不能写为*

salt server2 pillar.item webserver   #查看主机server2的webserver这个key值对应的value值。
salt '*' pillar.item webserver   #查看所有主机的webserver这个key值对应的value值。

salt server2 pillar.ls   #查看主机server2的所有key(针对pillar)
salt '*' pillar.ls   #查看所有主机的所有key(针对所有pillar)

 

3、pillar的一些用法

 

[root@server1 ~]# salt server2 pillar.item webserver   #查看主机server2的webserver信息
server2:
    ----------
    webserver:
        httpd
[root@server1 ~]# salt '*' pillar.item webserver   #查看所有主机的webserver信息
server3:
    ----------
    webserver:
        nginx
server2:
    ----------
    webserver:
        httpd
[root@server1 ~]# salt -I 'webserver:httpd' test.ping   #对webserver为httpd的主机进行test.ping方法测试
server2:
    True
[root@server1 ~]# salt -I 'webserver:httpd' cmd.run hostname   #对webserver为httpd的主机执行shell命令hostname
server2:
    server2

 

4、pillar的使用

 

<1>编辑/etc/salt/master打开pillar存储路径

[root@server1 salt]# vim /etc/salt/master
 844 pillar_roots:
 845   base:
 846     - /srv/pillar
[root@server1 salt]# systemctl restart salt-master
[root@server1 ~]# mkdir /srv/pillar

 

<2>编辑存储pillar键值对文件

[root@server1 ~]# cd /srv/pillar/
[root@server1 pillar]# vim web.sls   #该文件的名字随便起,只要以.sls结尾即可
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}

 

<3>编辑推送脚本

[root@server1 pillar]# pwd
/srv/pillar
[root@server1 pillar]# vim top.sls
base:
  '*':
    - web   #表示的就是之前编辑的web.sls文件

 

<4>测试:

[root@server1 ~]# salt '*' pillar.items   #查看所有主机的pillar信息
server3:
    ----------
    webserver:
        nginx
server2:
    ----------
    webserver:
        httpd
[root@server1 ~]# salt server2 pillar.items   #查看主机server2的pillar信息
server2:
    ----------
    webserver:
        httpd
[root@server1 ~]# salt server2 pillar.ls   #查看主机server2的所有key(针对pillar)
server2:
    - webserver
[root@server1 ~]# salt server2 pillar.item webserver   #查看主机server2的key值为webserver对应的value值
server2:
    ----------
    webserver:
        httpd
[root@server1 ~]# salt -I 'webserver:httpd' test.ping   #对webserver这个key值对应的value值为httpd的主机进行test.ping的方法。
server2: 
    True

 


值的注意的是:如果命令"salt  -I  'wervserver:httpd'  test.ping"测试失败,则使用下面的命令进行刷新

[root@server1 ~]# salt '*' saltutil.refresh_pillar   #刷新pillar数据到所有主机
[root@server1 ~]# salt server2 saltutil.refresh_pillar   #刷新pillar数据到server2主机

 

四、grains和pillar的区别

 

  1. grains存储的是静态、不常变化的内容,pillar则相反
  2. grains是存储在minion本地,而pillar存储在master本地
  3. minion有权限操作自己的grains值,如增加、删除,但minion只能查看自己的pillar,无权修改

 

五、jinja模块的使用方法

 

1、

 

<1>部署脚本:在server1的httpd.service中编写jinja模版

[root@server1 ~]# cd /srv/salt/httpd/
[root@server1 httpd]# ls
files  install.sls  service.sls
[root@server1 httpd]# vim files/httpd.conf
 42 Listen {{ port }}
[root@server1 httpd]# vim service.sls
include:
  - httpd.install

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - template: jinja   #新添加的内容
      port: 8888   #新添加的内容

httpd-service:
  service.running:
    - name: httpd
    - enable: False
    - reload: True
      watch:
        - file: /etc/httpd/conf/httpd.conf

 

<2>执行推送

[root@server1 httpd]# salt server2 state.sls httpd.service

 

<3>minion端查看,开启8888端口,启动成功

 

2、从1中运行的结果图,我们可以得知主机server2的httpd服务监听的主机都是0.0.0.0,那如果我们想httpd服务只监听本机(server2监听172.25.83.2)。那又该如何做呢?

 

<1>部署脚本

[root@server1 httpd]# pwd
/srv/salt/httpd
[root@server1 httpd]# vim files/httpd.conf  
42 Listen {{ host }}:{{ port }}   #修改的内容
[root@server1 httpd]# vim service.sls 
include:
  - httpd.install

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - template: jinja
      port: 8888
      host: 172.25.83.2   #新增加的内容

httpd-service:
  service.running:
    - name: httpd
    - enable: False
    - reload: True
      watch:
        - file: /etc/httpd/conf/httpd.conf

 

<2>执行推送

[root@server1 httpd]# salt server2 state.sls httpd.service

 

<3>minion端查看,开启172.25.83.2:8888端口,启动成功(值的注意的是:因为server1端的service.sls文件中指定的是当/etc/httpd/conf/httpd.conf文件发生变化,才触发触发器,重载httpd服务。而修改监听主机需要的是重启httpd服务,所以这里需要在minion端(server2端)重启httpd服务)

 

3、2中推送的主机只有一个(server2),如果主机个数变多。要使各自的httpd服务只监听本机,那么又该怎么做即server2监听172.25.83.2,server3监听172.25.83.3。

 

<1>部署脚本

[root@server1 httpd]# vim files/httpd.conf
 42 Listen {{ host }}:{{ port }}
[root@server1 httpd]# vim service.sls
include:
  - httpd.install

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - template: jinja
      port: 8888
      host: {{ grains['ipv4'][-1] }}   #修改的内容

httpd-service:
  service.running:
    - name: httpd
    - enable: False
    - reload: True
      watch:
        - file: /etc/httpd/conf/httpd.conf

 

<2>执行推送

[root@server1 httpd]# salt '*' state.sls httpd.service

 

<3>minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口(值的注意的是:因为server1端的service.sls文件中指定的是当/etc/httpd/conf/httpd.conf文件发生变化,才触发触发器,重载httpd服务。而修改监听主机需要的是重启httpd服务,所以这里需要在minion端(server2和server3)重启httpd服务)

 

4、3中定义的变量是在脚本中定义的,如果我们想将变量定义在httpd.conf文件中,又该怎么做呢?

 

<1>部署脚本

[root@server1 httpd]# vim files/httpd.conf 
 42 Listen {{ grains['ipv4'][-1] }}:{{ port }}   #修改的内容
[root@server1 httpd]# vim service.sls 
include:
  - httpd.install

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - template: jinja
      port: 8888   #删除下面一行host的内容

httpd-service:
  service.running:
    - name: httpd
    - enable: False
    - reload: True
      watch:
        - file: /etc/httpd/conf/httpd.conf

 

<2>执行推送

[root@server1 httpd]# salt '*' state.sls httpd.service

 

<3>minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口(值的注意的是:因为server1端的service.sls文件中指定的是当/etc/httpd/conf/httpd.conf文件发生变化,才触发触发器,重载httpd服务。而修改监听主机需要的是重启httpd服务,所以这里需要在minion端(server2和server3)重启httpd服务)

 

5、3,4中使用的变量是grains类型的,如果我们想使用pillar类型的变量,又该怎么做呢?

 

<1>部署脚本

[root@server1 httpd]# vim files/httpd.conf
 42 Listen {{ host }}:{{ port }}
[root@server1 httpd]# cd /srv/pillar/
[root@server1 pillar]# ls
top.sls  web.sls
[root@server1 pillar]# vim web.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
IP: 172.25.83.2
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
IP: 172.25.83.3
{% endif %}
[root@server1 pillar]# cd /srv/salt/httpd/
[root@server1 httpd]# ls
files  install.sls  service.sls
[root@server1 httpd]# vim service.sls
include:
  - httpd.install

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - template: jinja
      port: 8888
      host: {{ pillar['IP'] }}   #修改的内容

httpd-service:
  service.running:
    - name: httpd
    - enable: False
    - reload: True
      watch:
        - file: /etc/httpd/conf/httpd.conf

 

<2>执行推送

[root@server1 httpd]# salt '*' state.sls httpd.service

 

<3>minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口(值的注意的是:因为server1端的service.sls文件中指定的是当/etc/httpd/conf/httpd.conf文件发生变化,才触发触发器,重载httpd服务。而修改监听主机需要的是重启httpd服务,所以这里需要在minion端(server2和server3)重启httpd服务)

 

6、5中中定义的变量是在脚本中定义的,如果我们想将变量定义在httpd.conf文件中,又该怎么做呢?

 

<1>部署脚本

[root@server1 httpd]# vim files/httpd.conf
 42 Listen {{ pillar['IP'] }}:{{ port }}   #修改的内容
[root@server1 httpd]# cd /srv/pillar/
[root@server1 pillar]# ls
top.sls  web.sls
[root@server1 pillar]# vim web.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
IP: 172.25.83.2
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
IP: 172.25.83.3
{% endif %}
[root@server1 pillar]# cd /srv/salt/httpd/
[root@server1 httpd]# ls
files  install.sls  service.sls
[root@server1 httpd]# vim service.sls
include:
  - httpd.install

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - template: jinja
      port: 8888   #删除下面一行host的内容

httpd-service:
  service.running:
    - name: httpd
    - enable: False
    - reload: True
      watch:
        - file: /etc/httpd/conf/httpd.conf

 

<2>执行推送

[root@server1 httpd]# salt '*' state.sls httpd.service

 

<3>minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口(值的注意的是:因为server1端的service.sls文件中指定的是当/etc/httpd/conf/httpd.conf文件发生变化,才触发触发器,重载httpd服务。而修改监听主机需要的是重启httpd服务,所以这里需要在minion端(server2和server3)重启httpd服务)

 

7、使用import的方法定义变量

 

<1>部署脚本

[root@server1 ~]# cd /srv/salt/httpd/
[root@server1 httpd]# ls
files  install.sls  service.sls
[root@server1 httpd]# vim lib.sls
{% set host = '172.25.83.2' %}
[root@server1 httpd]# vim files/httpd.conf 
1 {% from 'httpd/lib.sls' import host %}
43 Listen {{ host }}:{{ port }}
[root@server1 httpd]# vim service.sls 
include:
  - httpd.install

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - template: jinja
      port: 8888

httpd-service:
  service.running:
    - name: httpd
    - enable: False
    - reload: True
      watch:
        - file: /etc/httpd/conf/httpd.conf

 

<2>执行推送

[root@server1 httpd]# salt server2 state.sls httpd.service

 

<3>minion端查看,server2上开启172.25.83.2:8888端口(值的注意的是:因为server1端的service.sls文件中指定的是当/etc/httpd/conf/httpd.conf文件发生变化,才触发触发器,重载httpd服务。而修改监听主机需要的是重启httpd服务,所以这里需要在minion端(server2)重启httpd服务)

 


值的注意的是

1.master端(server1)定义的httpd.conf文件要拷贝到minion端(server2),但是拷贝到minion端(server2)的httpd.conf文件中没有最上面那行内容(import...)

查看server2上的/etc/httpd/conf/httpd.conf文件:

2.如果web.sls中指定了端口,同时service.sls文件中也指定了端口,那么web.sls文件的优先级要高于service.sls文件。

[root@server1 ~]# cd /srv/salt/httpd/
[root@server1 httpd]# ls
files  install.sls  service.sls
[root@server1 httpd]# vim lib.sls
{% set host = '172.25.83.2' %}
[root@server1 httpd]# vim files/httpd.conf 
1 {% from 'httpd/lib.sls' import host %}
43 Listen {{ host }}:{{ port }}
[root@server1 httpd]# vim service.sls 
include:
  - httpd.install

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - template: jinja
      port: 8888
      host: 127.0.0.1

httpd-service:
  service.running:
    - name: httpd
    - enable: False
    - reload: True
      watch:
        - file: /etc/httpd/conf/httpd.conf
[root@server1 httpd]# salt server2 state.sls httpd.service

由上图可见web.sls文件的优先级要高于service.sls。(web.sls中定义的主机是172.25.83.2,而service.sls文件中定义的主机是127.0.0.1。但是最后显示的是172.25.83.2。可见web.sls文件的优先级要高于service.sls文件)


 

六、补充内容

 

<1>部署脚本

#在server3端,将之前推送nginx过来的压缩文件nginx-1.15.8.tar.gz删除,以便实验结果的验证
[root@server3 ~]# cd /mnt/
[root@server3 mnt]# ls
nginx-1.15.8.tar.gz
[root@server3 mnt]# rm -rf nginx-1.15.8.tar.gz 
[root@server3 mnt]# ls
#在server1端,修改之前编写的nginx服务对应的install.sls文件
[root@server1 ~]# cd /srv/salt/nginx/
[root@server1 nginx]# ls
files  install.sls  service.sls
[root@server1 nginx]# vim install.sls
{% set nginx_ver = '1.15.8' %}   #定义变量nginx_ver,并将其中所有的1.15.8替换为变量nginx_ver
nginx-install: 
  pkg.installed:
    - pkgs:
      - pcre-devel
      - zlib-devel
      - gcc
      - make

  file.managed:
    - name: /mnt/nginx-{{ nginx_ver }}.tar.gz
    - source: salt://nginx/files/nginx-{{ nginx_ver }}.tar.gz

  cmd.run:
    - name: cd /mnt && tar zxf nginx-{{ nginx_ver }}.tar.gz && cd nginx-{{ nginx_ver }} && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx &> /dev/null && make &> /dev/null && make install &> /dev/null && cd .. && rm -rf nginx-{{ nginx_ver }}
    - creates: /usr/local/nginx

 

<2>执行推送

[root@server1 nginx]# salt server3 state.sls nginx.service

 

<3>minion端查看,server3的/mnt目录下是否存在文件nginx-1.15.8.tar.gz

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值