SaltStack之grains,pillar,jinja

一、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。

设置完上面的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的使用

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

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

编辑存储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 %}

编辑推送脚本

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

测试:

[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的区别

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

四、jinja模块的使用方法

部署脚本:在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.conf42 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: Truewatch:- file: /etc/httpd/conf/httpd.conf

执行推送

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

在这里插入图片描述
minion端查看,开启8888端口,启动成功

在这里插入图片描述
2、httpd服务只监听本机

部署脚本

[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: jinjaport: 8888host: 172.25.83.2   #新增加的内容httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- file: /etc/httpd/conf/httpd.conf

执行推送

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

在这里插入图片描述
minion端查看,开启172.25.83.2:8888端口,启动成功
在这里插入图片描述
3、server2监听172.25.83.2,server3监听172.25.83.3。

部署脚本

[root@server1 httpd]# vim files/httpd.conf42 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: jinjaport: 8888host: {{ grains['ipv4'][-1] }}   #修改的内容httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- file: /etc/httpd/conf/httpd.conf

执行推送

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

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、将变量定义在httpd.conf文件中

部署脚本

[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: jinjaport: 8888   #删除下面一行host的内容httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- file: /etc/httpd/conf/httpd.conf

执行推送

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

minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口

在这里插入图片描述
在这里插入图片描述
5、使用pillar类型的变量

部署脚本

[root@server1 httpd]# vim files/httpd.conf42 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: jinjaport: 8888host: {{ pillar['IP'] }}   #修改的内容httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- file: /etc/httpd/conf/httpd.conf

执行推送

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

minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口

在这里插入图片描述
在这里插入图片描述
6、将变量定义在httpd.conf文件中

部署脚本

[root@server1 httpd]# vim files/httpd.conf42 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: jinjaport: 8888   #删除下面一行host的内容httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- file: /etc/httpd/conf/httpd.conf

执行推送

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

minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口
在这里插入图片描述
在这里插入图片描述
7、使用import的方法定义变量

部署脚本

[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: jinjaport: 8888httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- file: /etc/httpd/conf/httpd.conf

执行推送

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

在这里插入图片描述
minion端查看,server2上开启172.25.83.2:8888端口
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部