我们常常在使用saltstack的时候,需要根据不同主机名或id去区分不同业务,不同环境,同时我们又不想写太多配置文件,在saltstack里提供了salt[‘grains.filter_by’]的使用方法,可以轻松快速帮我们解决多环境下发不同配置文件及参数,直接上代码

我的主机名如下

[root@localhost ~]# salt 'java-15' grains.item fqdn
java-15:
  fqdn: l-salttest1.ops.beta.bj1

我们新建一个map.jinja文件

{% set env = salt['grains.filter_by']({
    'prod': {
        'file_path': '/tmp/prod.txt',
        'salt_source_path': 'salt://test/test.conf',

    },
    'beta': {
        'file_path': '/tmp/beta.txt',
        'salt_source_path': 'salt://test/test.conf',
    },
}, 'env', default='st')%}

在我们的init.sls中引用我们添加的变量,这里我们要注意哦 import env是set env,env就是你定议需要加载的名称就是一个json的key,你可以定义多个

{% from 'test/map.jinja' import env with context %}

test:
  file.managed:
    - source: {{env.salt_source_path}}
    - name: {{ env.file_path }}
    - user: root
    - group: root
    - mode: 644
    - template: jinja

看我们使用的结果

salt2

 

这里salt自动截取我们fqdn中的值做key,需要使用自定义grains
我的grains定义如下

# !/usr/bin/env python
#-*- coding: utf-8 -*-
#=============================================================================
#     FileName: node.py
#         Desc:
#       Author: 苦咖啡
#        Email: voilet@qq.com
#     HomePage: http://blog.kukafei520.net
#      Version: 0.0.1
#   LastChange: 2014-08-20
#      History:
#=============================================================================
import commands
def node():
    """
    取主机名相应字段
    """
    grains = {}
    hostname = commands.getoutput("hostname")
    data = hostname.split(".")
    grains['room'] = data[-1]
    grains['env'] = data[2]
    grains['project'] = data[1]
    grains['pro_name'] = data[0].split("-")[1]
    return grains

然后执行以下命令

state “*” saltutil.sync_all

salt ‘*’ sys.reload_modules

 

我们来看下代码
salt3

def filter_by(lookup_dict, grain='os_family', merge=None, default='default'):
   ret = lookup_dict.get(
            __grains__.get(
                grain, default),
            lookup_dict.get(
                default, None)
            )

    if merge:
        if not isinstance(merge, collections.Mapping):
            raise SaltException('filter_by merge argument must be a dictionary.')

        else:

            if ret is None:
                ret = merge

            else:
                salt.utils.dictupdate.update(ret, merge)

    return ret

其实非常简单,第一个传一个字典,第二个是我们传的变量,默认是取当前系统是centos还是debian,所以只要传我们自己定义的变量,就可以获取到我们想要的key和value



分享到: 更多

这篇日志的 QR 二维码为:

九月 1st, 2014

Posted In: 网络技术

发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量