前言
sls文件作為saltstack中重要的一環(huán),是必須掌握的
入門篇
放在入門篇的開始,帶大家來了解一下sls的執(zhí)行順序
salt 'minion1' state.sls nginx.install
這是一個(gè)執(zhí)行sls的命令,那么這個(gè)命令會(huì)讀取那些文件呢?
- 遍歷saltstack配置文件里邊的file_roots
- 尋找file_roots 里邊的nginx目錄
- 訪問java目錄下的nginx.sls
上面命令執(zhí)行時(shí),指定了Java目錄下的nginx.sls文件,而實(shí)際上有時(shí)候是可以不指定的,如:
salt 'minion1' state.sls java
這時(shí)候saltstack就會(huì)訪問到j(luò)ava目錄下的init.sls
簡(jiǎn)單的sls編寫:
nginx_install: # sls_id 不可重復(fù)
pkg.installed: # 模塊方法
- pkgs: # 參數(shù)
- nginx
nginx_conf:
file.managed:
- name: /etc/nginx/nginx.conf
- source: salt://nginx.conf
- require:
- pkg: nginx_install
- :與- 后需要空格
- salt:// 想當(dāng)于master的file_roots目錄
- 多個(gè) - 表示列表
- 每一級(jí)縮進(jìn)由2個(gè)空格組成,不能用Tab
就這一個(gè)簡(jiǎn)單的sls就可以安裝nginx,并把nginx.conf替換成預(yù)先寫好的配置文件
而再看一下這個(gè):
nginx:
pkg.installed:
/etc/nginx/nginx.conf:
file.managed:
- source: salt://nginx.conf
- require:
- pkg: nginx_install
這次的代碼對(duì)比上面, - pkgs 和 - names 的內(nèi)容不見了,相反把sls_id 的名字分別改成了nginx
和/etc/nginx/nginx.conf
這樣寫和上面的效果是一樣的,當(dāng)sls執(zhí)行需要指定名字是,如果sls里邊沒有定義,那么默認(rèn)會(huì)用sls_id的值
至于更多的模塊方法可以到官網(wǎng)去找到saltstack官網(wǎng)
引入其他sls文件
include 就像nginx一樣,include表示包含某個(gè)文件
include:
- nginx.install
- nginx.config
這樣我們就在文件中引入了nginx目錄下的install.sls(sls忽略不寫了)和nginx.config.sls文件了
執(zhí)行順序
經(jīng)常會(huì)聽到別人說sls執(zhí)行時(shí)是無序的,那么我們?cè)趺醋霾拍苁沟胹ls安裝我們預(yù)期來執(zhí)行呢?
- include引入的文件會(huì)被先執(zhí)行
- 每個(gè)sls定義時(shí)可以定義order值,order值從小到大執(zhí)行
- 按照依賴關(guān)系執(zhí)行
下面看看order的用法,至于依賴關(guān)系,可以看回文章開始時(shí)的使用,分辨出require與require_in的作用
nginx:
pkg:
- installed
- order: 1
/etc/nginx/nginx.conf:
file.managed:
- source: salt://nginx.conf
- require:
- pkg: nginx_install
- order: 2
進(jìn)階篇
在知道了更多的模塊方法后,我們基本可以用sls來完成大部分事情,但這還不能滿足我們,下面再來看看一些關(guān)于sls的小技巧
jinja
在sls的文件中,我們還可以使用用jinja語(yǔ)法來控制sls執(zhí)行,或者配置文件等
{% if grins[os] == 'Centos' %}
nginx:
pkg.installed:
/etc/nginx/nginx.conf:
file.managed:
- source: salt://nginx.conf
- require:
- pkg: nginx_install
{% endif %}
一個(gè)十分簡(jiǎn)單的例子,但這并不能說明jinja的強(qiáng)大,除了if還有set,for,marco等等,jinja的強(qiáng)大之處還需要大家獨(dú)自去領(lǐng)悟
引用外部變量
知道了jinja控制和引用變量之后也都不能滿足與所有需求,有時(shí)候我們需要在執(zhí)行時(shí)來定義變量
salt 'minion1' state.sls nginx.install pillar='{"version":"1.13.4"}'
nginx:
pkg.installed:
{% if pillar["version"] %}
- version: {{ pillar["version"] }}
{% endif %}
當(dāng)然我們并不會(huì)每次都在執(zhí)行命令時(shí)附帶參數(shù),我們可以把pillar,grains的數(shù)據(jù)預(yù)先設(shè)定好.下面來看看如何引入其他變量
{% set files = salt['cmd.run']("ls /data","default") %}
echo_files_name:
cmd.run:
- names:
{% for file in files %}
- echo {{ file }}
{% endfor %}
- salt 固定寫法
- ['cmd.run'] 表示執(zhí)行cmd.run方法
- ls /data 表示執(zhí)行命令
- "default" 最后的空字符代表默認(rèn)值
這種方法可以執(zhí)行大部分salt命令來獲取返回值,然后傳入到sls文件中執(zhí)行
測(cè)試
有時(shí)候由于編寫的sls文件太大,想測(cè)試一下剛添加進(jìn)去的功能需要執(zhí)行很久.
其實(shí)可以通過sls_id方法來執(zhí)行sls文件內(nèi)的某個(gè)方法
salt 'minion1' state.sls_id nginx_install nginx.install
這時(shí)候saltstack只會(huì)執(zhí)行nginx.install.sls里邊的nginx_install,而不會(huì)執(zhí)行其他,但是我們要注意它的依賴關(guān)系
配置文件管理
在很多時(shí)候,我們需要統(tǒng)一管理配置文件,但是每臺(tái)機(jī)器的配置信息又不一樣,我們想根據(jù)每一臺(tái)機(jī)的具體配置來定義應(yīng)用的配置文件
通過saltstack file模塊管理的文件,其實(shí)也可以使用jinja來獲取,定義變量的
下面來看一份postgres配置,由于配置過長(zhǎng),刪減了部分
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
可以看到,配置文件內(nèi)大量使用了granis來讀取機(jī)器的配置信息,從而動(dòng)態(tài)生產(chǎn)配置文件,這樣所有的服務(wù)器都可以共用一份配置文件.