saltstack(四)sls编写

前言

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来读取机器的配置信息,从而动态生产配置文件,这样所有的服务器都可以共用一份配置文件.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • 学习地址[http://tech.mainwise.cn/?p=438] 更新于 3.25 23:16 salt简...
    J书越来越垃圾了阅读 30,773评论 9 36
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139
  • 简述 saltstacksaltstack是一个新的基础平台管理工具,只需要花费数分钟即可运行起来,可以支撑管理上...
    君惜丶阅读 4,748评论 0 2
  • 大多数人总是以为结了婚就万事大吉了,在那个人面前再也不用在乎形象,以为无论怎样他都不会嫌弃,其实,我之前曾经也有过...
    小惠_f2b8阅读 283评论 -1 3
  • 一:什么是scoket?网络上的两个程序通过一个双向的通信链接实现数据的交换,这个连接的一端称为一个 socket...
    小虾米前端阅读 504评论 0 0