一、jinjia2 模板语言语法简介
# cat jinja2.sls # 运行时把注释去掉,不然会出错
{% set var = 'Hello World!' %} # 定义变量
{% set L = ['value1','value2','value3'] %} # 定义列表
{% set D = {'key1':'value1','key2':'value2','key3':'value3'} %} # 定义字典
test_var:
cmd.run:
- name: echo {{ var }} # 打印变量
# 循环遍历列表
{% for l in L %}
echo {{ l }}
{% endfor %}
# 循环遍历字典
{% for k,v in D.iteritems() %}
# 使用条件判断
{% if k == 'key2' %}
{% break %} # 也可以是continue
{% else %}
echo {{k}}:{{v}}
{% endif %}
{% endfor %}
![](https://img.haomeiwen.com/i5083227/3394650410a4a81d.png)
二、Grains 相关的基本命令
salt node1 grains.ls : 列出所有的grains选项
salt node1 grains.items :列出所有的grains选项及值
salt node1 grains.item 选项名:列出指定的选项所对应的值
- 设置 grains 数据
salt node1 grains.setval key value # 设置单个键值对
![](https://img.haomeiwen.com/i5083227/51d61243f8daa529.png)
salt node1 grains.setvals "{'key1':'value1','key2':'value2'}" # 设置多个个键值对
![](https://img.haomeiwen.com/i5083227/a2da5220574075c1.png)
salt node1 grains.setval my_list "['one','two','three']" # 列表结构设置
![](https://img.haomeiwen.com/i5083227/ab3423603bb34d73.png)
查看对应的minion主机上已经有了新添加的grains数据
![](https://img.haomeiwen.com/i5083227/767f9207c5ddd65c.png)
salt node1 grains.delkey 键名 #删除 grains 数据
![](https://img.haomeiwen.com/i5083227/7485478e242bb9f4.png)
- 设置grains模块
mkdir -pv /srv/salt/_grains #创建grains模块目录
# cat /srv/salt/_grains/my_grains_module.py #写一个简单的grains模块
import time
def now():
grains = {}
grains['now'] = int(time.time())
return grains
salt node1 saltutil.sync_all # 同步模块到minion
salt node1 sys.reload_modules # 重载一次模块
![](https://img.haomeiwen.com/i5083227/eaac2025089d7a4f.png)
三、Pillar相关操作
- 建立目录,为每个minion编写对应的SLS文件
mkdir -pv /srv/pillar
# cat /srv/pillar/minion_m_key.sls #主机m的pillar数据
private_key: minion_m_key
# cat /srv/pillar/minion_node_key.sls #主机node组的pillar数据
role: webserver
private_key: node
- 建立入口文件
# cat /srv/pillar/top.sls
base:
'node*':
- minion_node_key
'm':
- minion_m_key
- 刷新Pillar数据
salt '*' saltutil.refresh_pillar
![](https://img.haomeiwen.com/i5083227/523b4fa48f6a249b.png)
四、用Jinja2和Grain扩展SLS文件
- 根据不同的操作系统来安装apahce服务
# cat /srv/sal/apache.sls
install_apache:
pkg.installed:
{% if grains['os_family'] == 'Debian' %}
- name: apache2
{% elif grains['os_family'] == 'RedHat' %}
- name: httpd
{% endif %}
- 根据不同的操作系统下发iptables配置文件
# cat iptables.sls
iptables:
pkg:
- installed
service:
- running
- watch:
- pkg: iptables
- file: iptables
file:
- managed
- source: salt://service/iptables
{% if grains['os'] == 'CentOS' or grains['os'] == 'Fedora' %}
- name: /etc/sysconfig/iptables
{% elif grains['os'] == 'Arch' %}
- name: /etc/conf.d/iptables
{% endif %}
五、使用Jinja2和Pillar扩展SLS配置
- 添加多个不同用户
![](https://img.haomeiwen.com/i5083227/65a6ab28d6d11858.png)
# cat /srv/salt/adduser.sls
{% for i in pillar['user'] %}
add_{{ i }}:
user.present:
- name: i
{% endfor %}
六、使用Jinja2以及Grain和Pillar动态下发配置文件
- 简单模板下发实例
# cat /srv/salt/template.sls
template_test:
file.managed:
- source: salt://test.j2
- name: /tmp/test.conf
- user: root
- group: root
- mode: 644
- template: jinja
# cat /srv/salt/test.j2
cpu_num = {{ grains['num_cpus'] }}
mem_total = {{ grains['mem_total'] }}
hostname = {{ grains['host'] }}
user = {{ pillar['user'][0] }
![](https://img.haomeiwen.com/i5083227/41ac328fbf52290a.png)
- 在例1中的 test.j2 中添加流程控制
# cat /srv/salt/test.j2
{% if grains['num_cpus'] >= 8 %}
cpu_num = {{ grains['num_cpus'] }}
{% endif %}
{% if grains['mem_total'] <= 512 %}
mem_total = {{ grains['mem_total'] }}
mem_total <= 512
{% endif %}
hostname = {{ grains['host'] }}
{% for i in pillar['user'] %}
user = {{ i }}
{% endfor %}
![](https://img.haomeiwen.com/i5083227/49876cac07e3dce2.png)
网友评论