saltstack state编写

前言

sls文件作为saltstack中重要的一环,是必须掌握的

入门篇

放在入门篇的开始,带大家来了解一下sls的执行顺序

salt 'minion1' state.sls nginx.install

这是一个执行sls的命令,那么这个命令会读取那些文件呢?

  1. 遍历saltstack配置文件里边的file_roots
  2. 寻找file_roots 里边的nginx目录
  3. 访问java目录下的nginx.sls

上面命令执行时,指定了Java目录下的nginx.sls文件,而实际上有时候是可以不指定的,如:

salt 'minion1' state.sls java

这时候saltstack就会访问到java目录下的init.sls


简单的sls编写:

nginx_install:   # sls_id 不可重复
  pkg.installed: # 模块方法
    - pkgs:      # 参数
      - nginx

nginx_conf:
  file.managed:
    - name: /etc/nginx/nginx.conf
    - source: salt://nginx.conf
    - require:
      - pkg: nginx_install
  • :与- 后需要空格
  • salt:// 想当于master的file_roots目录
  • 多个 - 表示列表
  • 每一级缩进由2个空格组成,不能用Tab

就这一个简单的sls就可以安装nginx,并把nginx.conf替换成预先写好的配置文件

而再看一下这个:

nginx:
  pkg.installed:

/etc/nginx/nginx.conf:
  file.managed:
    - source: salt://nginx.conf
    - require:
      - pkg: nginx_install

这次的代码对比上面, - pkgs 和 - names 的内容不见了,相反把sls_id 的名字分别改成了nginx
和/etc/nginx/nginx.conf

这样写和上面的效果是一样的,当sls执行需要指定名字是,如果sls里边没有定义,那么默认会用sls_id的值

至于更多的模块方法可以到官网去找到saltstack官网

引入其他sls文件

include 就像nginx一样,include表示包含某个文件

include:
  - nginx.install
  - nginx.config

这样我们就在文件中引入了nginx目录下的install.sls(sls忽略不写了)和nginx.config.sls文件了

执行顺序

经常会听到别人说sls执行时是无序的,那么我们怎么做才能使得sls安装我们预期来执行呢?

  1. include引入的文件会被先执行
  2. 每个sls定义时可以定义order值,order值从小到大执行
  3. 按照依赖关系执行

下面看看order的用法,至于依赖关系,可以看回文章开始时的使用,分辨出require与require_in的作用

nginx:
  pkg:
  - installed
  - order: 1

/etc/nginx/nginx.conf:
  file.managed:
    - source: salt://nginx.conf
    - require:
      - pkg: nginx_install
    - order: 2

进阶篇

在知道了更多的模块方法后,我们基本可以用sls来完成大部分事情,但这还不能满足我们,下面再来看看一些关于sls的小技巧

jinja

在sls的文件中,我们还可以使用用jinja语法来控制sls执行,或者配置文件等

{% if grins[os] == 'Centos' %}

nginx:
  pkg.installed:

/etc/nginx/nginx.conf:
  file.managed:
    - source: salt://nginx.conf
    - require:
      - pkg: nginx_install
{% endif %}

一个十分简单的例子,但这并不能说明jinja的强大,除了if还有set,for,marco等等,jinja的强大之处还需要大家独自去领悟

引用外部变量

知道了jinja控制和引用变量之后也都不能满足与所有需求,有时候我们需要在执行时来定义变量

salt 'minion1' state.sls nginx.install pillar='{"version":"1.13.4"}'
nginx:
  pkg.installed:
{% if pillar["version"] %}
  - version: {{ pillar["version"] }}
{% endif %}

当然我们并不会每次都在执行命令时附带参数,我们可以把pillar,grains的数据预先设定好.下面来看看如何引入其他变量

{% set files = salt['cmd.run']("ls /data","default") %}

echo_files_name:
  cmd.run:
    - names:
{% for file in files %}
      - echo {{ file }}
{% endfor %}
  • salt 固定写法
  • ['cmd.run'] 表示执行cmd.run方法
  • ls /data 表示执行命令
  • "default" 最后的空字符代表默认值

这种方法可以执行大部分salt命令来获取返回值,然后传入到sls文件中执行

测试

有时候由于编写的sls文件太大,想测试一下刚添加进去的功能需要执行很久.

其实可以通过sls_id方法来执行sls文件内的某个方法

salt 'minion1' state.sls_id nginx_install nginx.install

这时候saltstack只会执行nginx.install.sls里边的nginx_install,而不会执行其他,但是我们要注意它的依赖关系

配置文件管理

在很多时候,我们需要统一管理配置文件,但是每台机器的配置信息又不一样,我们想根据每一台机的具体配置来定义应用的配置文件

通过saltstack file模块管理的文件,其实也可以使用jinja来获取,定义变量的

下面来看一份postgres配置,由于配置过长,删减了部分

listen_addresses = '*'
max_connections = {{ conn }}
{% if ((grains.mem_total|int) / 4)|round|int <= 8096 -%}
shared_buffers = {{ ((grains.mem_total|int) / 4)|round|int }}MB
{% else -%}
shared_buffers = 4GB
{% endif -%}
work_mem = {{ ((grains.mem_total|int) / conn * 2) |round|int }}MB
{% if ((grains.mem_total|int) / 16)|round|int <= 2048 -%}
maintenance_work_mem = {{ ((grains.mem_total|int) / 16)|round|int }}MB
{% else -%}
maintenance_work_mem = 2GB
{% endif -%}
temp_buffers = {{ ((grains.mem_total|int) / conn) |round|int }}MB
checkpoint_completion_target = 0.9
effective_cache_size = {{ (((grains.mem_total|int) * 3) / 4)|round|int }}MB

可以看到,配置文件内大量使用了granis来读取机器的配置信息,从而动态生产配置文件,这样所有的服务器都可以共用一份配置文件.

猜你喜欢

转载自www.cnblogs.com/dears/p/9138352.html