本文主要是介绍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的使用
<1>编辑/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
<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的区别
- grains存储的是静态、不常变化的内容,pillar则相反
- grains是存储在minion本地,而pillar存储在master本地
- minion有权限操作自己的grains值,如增加、删除,但minion只能查看自己的pillar,无权修改
四、jinja模块的使用方法
<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.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
<2>执行推送
[root@server1 httpd]# salt server2 state.sls httpd.service
<3>minion端查看,开启8888端口,启动成功
2、httpd服务只监听本机
<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: jinjaport: 8888host: 172.25.83.2 #新增加的内容httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- file: /etc/httpd/conf/httpd.conf
<2>执行推送
[root@server1 httpd]# salt server2 state.sls httpd.service
<3>minion端查看,开启172.25.83.2:8888端口,启动成功
3、server2监听172.25.83.2,server3监听172.25.83.3。
<1>部署脚本
[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
<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、将变量定义在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: jinjaport: 8888 #删除下面一行host的内容httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- 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端口
5、使用pillar类型的变量
<1>部署脚本
[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
<2>执行推送
[root@server1 httpd]# salt '*' state.sls httpd.service
<3>minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口
6、将变量定义在httpd.conf文件中
<1>部署脚本
[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
<2>执行推送
[root@server1 httpd]# salt '*' state.sls httpd.service
<3>minion端查看,server2上开启172.25.83.2:8888端口,server3上开启172.25.83.3:8888端口
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: jinjaport: 8888httpd-service:service.running:- name: httpd- enable: False- reload: Truewatch:- file: /etc/httpd/conf/httpd.conf
<2>执行推送
[root@server1 httpd]# salt server2 state.sls httpd.service
<3>minion端查看,server2上开启172.25.83.2:8888端口
这篇关于SaltStack之grains,pillar,jinja的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!