(四)、通过jinja2模板及Grains和Pillar扩展主机状态

一、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 %}
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第1张图片
运行结果

二、Grains 相关的基本命令

salt node1 grains.ls : 列出所有的grains选项
salt node1 grains.items :列出所有的grains选项及值
salt node1 grains.item 选项名:列出指定的选项所对应的值
  1. 设置 grains 数据
salt node1 grains.setval key value # 设置单个键值对
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第2张图片
salt node1 grains.setvals "{'key1':'value1','key2':'value2'}" # 设置多个个键值对
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第3张图片
salt node1 grains.setval my_list "['one','two','three']" # 列表结构设置
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第4张图片

查看对应的minion主机上已经有了新添加的grains数据

(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第5张图片
salt node1 grains.delkey 键名 #删除 grains 数据
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第6张图片
删除结果
  1. 设置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 # 重载一次模块
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第7张图片
grains模块执行结果

三、Pillar相关操作

  1. 建立目录,为每个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
  1. 建立入口文件
# cat /srv/pillar/top.sls 
base:
    'node*': 
        - minion_node_key
    'm':
        - minion_m_key
  1. 刷新Pillar数据
salt '*' saltutil.refresh_pillar
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第8张图片
查看设置的Pillar数据

四、用Jinja2和Grain扩展SLS文件

  1. 根据不同的操作系统来安装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 %}
  1. 根据不同的操作系统下发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配置

  1. 添加多个不同用户
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第9张图片
# cat /srv/salt/adduser.sls 
{% for i in pillar['user'] %}
add_{{ i }}:
    user.present:
        - name: i
{% endfor %}

六、使用Jinja2以及Grain和Pillar动态下发配置文件

  1. 简单模板下发实例
# 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] }
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第10张图片
执行结果
  1. 在例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 %}
(四)、通过jinja2模板及Grains和Pillar扩展主机状态_第11张图片
执行结果

你可能感兴趣的:((四)、通过jinja2模板及Grains和Pillar扩展主机状态)