死磕salt系列-salt 配置文件管理

SLS是Salt State系统的核心,用来描述系统的目标状态,使用YAML语言书写。被用作配置文件管理。

SLS文件

sls配置文件分为两种类型

  • top.sls 这是所有配置文件的入口
  • sls 这是每个不同的配置文件

top.sls

  • top.sls 文件是其他sls文件的起始位置,使用salt '*' state.highstate调用。
  • top.sls 文件的位置:master文件中base环境定义的文件夹下。
  • 假设base路径为:/srv/salt/base 则top文件路径:/srv/salt/base/top.sls

top.sls 文件格式如下:

base: ## 从哪里开始读取配置文件,可以是base,prod等,
  'os:centos':   ## 目标主机
    - match: grain  ## match 匹配方式,
    - init.env_init  ## 需要执行的什么命令
    - zabbix-agent-linux.config
    - salt.agent

prod:
  'blog.*.(service|mongodb|proxydb)':
    - match: pcre
    - publish.config
    - filebeat.config

解释:

  • top文件遵循YAML语法,不同的层级用不同的空格定义。
  • base:表示文件的其实位置。
  • 'os:centos' :表示目标主机。
  • match:
  • grain: 按照grains规则去匹配
  • nodegroup: 按照分组名进行匹配
  • pcre: 正则匹配
  • 如果不写match行,则默认使用通配符匹配。

sls文件编写方法

agent-config:  ##定义一个名称
  file.managed:  ## 定义一个方法
    - name: /etc/salt/minion   ##定义方法需要的相关参数
    - source: salt://salt/files/minion-config
    - user: root
    - group: root
    - mode: 644
    - template: jinja  ##启用jinja模板匹配

简写方法:

vim /srv/salt/apache/install.sls

apache:                 # 定义名称
  pkg:                     # 定义函数
    - installed         # 定义方法

简版的语法与上面的语法一致,区别在于可以将名称写在行首。这样就不用定义方法名称了。

最后执行 salt '*' state.highstate test=True测试编写的文件是否正常。结果正常,则去掉test=True正式执行。

sls编写方法注意事项

  • include可以把已经写好的文件包含进来一起执行。
  • 一个agent-config代表一个命名空间,一个命名空间内只有有一种方法即file.managed方法只能出现一次。
  • 如果写多个file.managed就需要使用不用的命名空间。
  • - template: jinja 表示配置文件中定义了jinja模板。
  • 缩进用空格(一般是2个),不要用tab
  • :表示是字典
  • -表示是列表
include: 
  apache.install
  
agent-config:  
  file.managed:  
    - name: /etc/salt/minion   
    - source: salt://salt/files/minion-config
    - user: root
    - group: root
    - mode: 644
    - template: jinja  
    - require:
      - pkg: apache
include: 
  apache.install

include 声明

一个list,其元素是要引用到本SLS文件的其他SLS模块。 只能用在highstate结构的顶层

include:
  - edit.vim      
  - http.server

引用其他环境变量的sls文件:

include:
  - dev: http

相对引用:

include:
include:
  - .virt
  - .virt.hyper
  - ..http
  - ...base

其中的语法类似于python中的相对引用

jinja模板语法:

小技巧:
使用{{ salt['granins.get']('user'),'larry' }}, {{ salt['pillar.get']('user'),'larry' }}的方法提供默认值。

{% for i in ['/etc/','/usr']%}
touch  {{ i }}/1.txt
{% endfor %}
httpd:
  pkg.managed:
{% if grains['os'] == 'Ubuntu' %}
    - name: apache2
{% elif grains['os'] == 'CentOS' %}
    - name: httpd
{% endif %}
    - installed

set 这是jinja模板的值

{% set site_user = 'testuser' %}
{% set site_name = 'test_site' %}
{% set project_name = 'test_proj' %}
{% set sites_dir = 'test_dir' %}

django-project:
  file.recurse:
    - name: {{ sites_dir }}/{{ site_name }}/{{ project_name }}
    - user: {{ site_user }}
    - dir_mode: 2775
    - file_mode: '0644'
    - template: jinja
    - source: salt://project/templates_dir
    - include_empty: True

- require表示依赖,Apache表示命名空间,pkg表示命名空间中的某一个方法。

    - require:
      - pkg: apache

其他配置

  • watch: 监控状态是否变化,常用在service.running中。
  • last:想让某个state最后一个运行,可以用last。
  • order:优先级比require和watch低,有order指定的state比没有order指定的优先级高。
vim:
  pkg.installed:
    - order: 1
posted @ 2018-04-08 11:21  biglittleant  阅读(1300)  评论(0编辑  收藏  举报