通过Jinja2模板以及Grain和Pillar扩展主机状态

Jinja2模板语言的基础
Jinja2是一个强大的python模板引擎,可以使用代码动态生成内容和创建文件内容。可以理解为何django的模板用法一样。
官网地址:http://jinja.pocoo.org/

1
2
3
4
5
6
Jinja2变量:
[root@localhost states]# cat init/var.sls
{% set var = 'hello' %}
test_var:
cmd.run:
- name: echo "var is {{ var }}"

由于和d’jango模板差不多,此处不作过多解析。

Grains

Grains的概念
grains是minion第一次启动的时候采集的静态数据,可以用在salt的模块和其他组件中。其实grains在每次的minion启动(重启)的时候都会采集,即向master汇报一次的。这个很重要,可以让某些同学企图使用grains值来做监控死心了。

Grain相关命令

列出所有minion上的Grains项:
[root@localhost states]# salt ‘*’ grains.ls
192.168.17.132:

- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
  • domain
    …省略

查询minion上某一具体Grain的值:
salt ‘*’ grains.item 选项

列出对应minion上所有Grain的详细信息:
[root@localhost states]# salt ‘*’ grains.items
….省略部分数据

192.168.17.132:

    192.168.17.132

manufacturer:
    VMware, Inc.
master:
    192.168.17.135
mdadm:
mem_total:
    980
nodename:
    localhost.localdomain
num_cpus:
    1

设置Grains数据

命令行方式

单个值设置:

查询:

多个值设置:

列表结构设置:

查询:

Grains_module的方式设置
mkdir -p /etc/salt/states/_grains新增模块目录

1
2
3
4
5
6
[root@localhost salt]# cat states/_grains/my_grain_mod.py 
import time
def now():
grains = ()
grains['now'] = time.time()
return grains

saltutil.sync_all同步模块到minion:

重载一次模块:

自定义grains的item:编辑etc/salt/minion注意是有空格
grains:
roles: nginx
env: prod

[root@localhost psycopg2]# salt -G ‘env:prod’ test.ping
192.168.17.130:
True
在minion端新增以下,重启动客户端
[root@localhost ~]# cat /etc/salt/grains
web: nginx

master可以

以下是采用刷新方式,不重启minion客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@salt-minion ~]# cat /etc/salt/grains 
web: nginx
web: tomcat

[root@ salt-master~]# salt -G 'web:tomcat' test.ping
No minions matched the target. No command was sent, no jid was assigned.
ERROR: No return received
[root@ salt-master~]# salt '*' saltutil.sync_grains
192.168.1.230:
test_lnmp.1.248:
CacheServer:
[root@ salt-master~]# salt -G 'web:tomcat' test.ping
test_lnmp.1.248:
True

Pillar

Pillar是什么?

Pillar是Salt非常重要的一个组件,它用于给特定的minion定义任何你需要的数据,这些数据可以被Salt的其他组件使用。Salt在 0.9.8版本中引入了Pillar。Pillar在解析完成后,是一个嵌套的dict结构;最上层的key是minion ID,其value是该minion所拥有的Pillar数据;每一个value也都是key/value。



这里可以看出Pillar的一个特点,Pillar数据是与特定minion关联的,也就是说每一个minion都只能看到自己的数据,所以 Pillar可以用来传递敏感数据(在Salt的设计中,Pillar使用独立的加密session,也是为了保证敏感数据的安全性)。
Pillar可以用在哪些地方?
• 敏感数据
例如ssh key,加密证书等,由于Pillar使用独立的加密session,可以确保这些敏感数据不被其他minion看到。
• 变量
可以在Pillar中处理平台差异性,比如针对不同的操作系统设置软件包的名字,然后在State中引用。
• 其他任何数据
可以在Pillar中添加任何需要用到的数据。比如定义用户和UID的对应关系,mnion的角色等。
• 用在Targetting中
Pillar可以用来选择minion,使用-I选项。

Pillar相关命令
列出对应minion上所有的pillar的详细信息:
[root@localhost salt]# salt ‘‘ pillar.items
*Pillar实战:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost pillar]# tree
.
├── init
│ └── rsyclog.sls
└── top.sls
[root@localhost pillar]# cat top.sls
base:
'test_lnmp.1.248':
- init.rsyslog

[root@localhost pillar]# cat init/rsyclog.sls
{% if grains['osfinger'] == 'CentOS-6' %}
syslog: rsyslog
{% elif grains['osfinger'] == 'CentOS-5' %}
syslog: syslog
{% endif %}

Grains和Pillar区别

Comments

2017-03-03