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兩種方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM