zoukankan      html  css  js  c++  java
  • state.sls与state.highstate区别

    最近编写kubernetes的saltstack状态配置文件,在github上找到一个开源的salt文件,根据自己的需要,完成修改之后。执行部署测试

    大致目录结构如下:

    |————k8s
    |  |____node.sls
    |  |____master.sls
    |  |____etcd.sls
    |  |____modules
    |  |  |____kubelet.sls
    |  |  |____docker.sls
    |  |  |____quagga.sls
    |  |  |____kube-proxy.sls
    |  |  |____api-server.sls
    |  |  |____scheduler.sls
    |  |  |____cfssl.sls
    |  |  |____controller-manager.sls
    |  |  |____etcd.sls
    |____top.sls
    

    top.sls的内容如下:

    base:
      'k8s-role:master':
        - match: grain
        - k8s.master
      'k8s-role:node':
        - match: grain
        - k8s.node
      'etcd-role:node':
        - match: grain
        - k8s.etcd
    

    minion端/etc/salt/grains配置如下:

    k8s-role:
      - master
    

    在执行salt "*" state.highstate时,部署正常执行,然而在执行salt "*" state.sls k8s时,却抛出如下异常:

    yanwei-ubuntu:
        Data failed to compile:
    ----------
        No matching sls found for 'k8s' in env 'base'
    ERROR: Minions returned with non-zero exit code
    
    

    但是由于我们线上salt文件过多,而且平时都是通过state.sls的方式来实现服务配置与部署,直接执行state.highstate的话,风险太大。

    到此时才开始正视state.sls与state.highstate的区别,并尝试把上面的配置修改为同时支持两种方式的发布。

    在网上查找state.sls与state.highstate的区别大致如下:

    • state.highstate会读取所有环境(包括base环境)的top.sls文件,并且执行top.sls文件内容里面定义的sls文件,不在top.sls文件里面记录的sls则不会被执行;
    • state.sls默认读取base环境,但是它并不会读取top.sls文件。你可以指定state.sls执行哪个sls文件,只要这个sls文件在base环境下存在;
    • state.sls也可以指定读取哪个环境:state.sls salt_env='prod' xxx.sls,这个xxx.sls可以不在top.sls中记录。
    • state.sls执行的xxx.sls会被下发到minion端,而state.highstate则不会

    其实这些都不是重点,我认为重点在于state.sls执行指定模块的前提是,该模块存在init.sls文件。

    既然如此,我们要让上面的状态配置文件同时支持state.sls和state.highstate的话,首先需要在k8s模块中添加init.sls文件,因为并不是每一个节点都会执行k8s中所有模块,所以还需要在init.sls中实现一些条件判断。

    1. 修改top.sls文件如下:
    base:
      node_type:kubernetes:
            - match: grain
            - k8s
    
    1. 添加init.sls文件,内容如下:
    {% set k8s_master = salt['grains.get']('k8s_role:k8s_master',False) %}
    {% set k8s_node = salt['grains.get']('k8s_role:k8s_node',False) %}
    {% set k8s_etcd = salt['grains.get']('k8s_role:k8s_etcd',False) %}
    include:
      - k8s.modules.docker
    {% if k8s_master %}
      - k8s.master
    {% endif %}
    {% if k8s_node %}
      - k8s.node
    {% endif %}
    {% if k8s_etcd %}
      - k8s.etcd
    {% endif %}
    
    1. 修改minion端/etc/salt/grains,内容如下:
    node_type:
      - kubernetes
    k8s_role:
      - k8s_node: True
      - k8s_master: True
    

    至此,该状态配置文件可同时支持state.sls和state.highstate两种方式。

  • 相关阅读:
    并发编程 19—— 显式的Conditon 对象
    JVM实用参数——新生代垃圾回收
    设计模式 8 —— 适配器和外观模式
    并发编程 18—— 使用内置条件队列实现简单的有界缓存
    并发编程 17—— Lock
    Spring 事务管理 01 ——
    并发编程 16—— 线程池 之 原理二
    并发编程 15—— 线程池 之 原理一
    并发编程 14—— 线程池 之 整体架构
    java.util.logging.Logger 使用详解
  • 原文地址:https://www.cnblogs.com/breezey/p/8824610.html
Copyright © 2011-2022 走看看