saltstack(四)sls編寫

前言

sls文件作為saltstack中重要的一環(huán),是必須掌握的

入門篇

放在入門篇的開始,帶大家來了解一下sls的執(zhí)行順序

salt 'minion1' state.sls nginx.install

這是一個(gè)執(zhí)行sls的命令,那么這個(gè)命令會(huì)讀取那些文件呢?

  1. 遍歷saltstack配置文件里邊的file_roots
  2. 尋找file_roots 里邊的nginx目錄
  3. 訪問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í)行呢?

  1. include引入的文件會(huì)被先執(zhí)行
  2. 每個(gè)sls定義時(shí)可以定義order值,order值從小到大執(zhí)行
  3. 按照依賴關(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ù)器都可以共用一份配置文件.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 學(xué)習(xí)地址[http://tech.mainwise.cn/?p=438] 更新于 3.25 23:16 salt簡(jiǎn)...
    J書越來越垃圾了閱讀 31,208評(píng)論 9 36
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,602評(píng)論 19 139
  • 簡(jiǎn)述 saltstacksaltstack是一個(gè)新的基礎(chǔ)平臺(tái)管理工具,只需要花費(fèi)數(shù)分鐘即可運(yùn)行起來,可以支撐管理上...
    君惜丶閱讀 5,168評(píng)論 0 2
  • 大多數(shù)人總是以為結(jié)了婚就萬事大吉了,在那個(gè)人面前再也不用在乎形象,以為無論怎樣他都不會(huì)嫌棄,其實(shí),我之前曾經(jīng)也有過...
    小惠_f2b8閱讀 355評(píng)論 -1 3
  • 一:什么是scoket?網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通信鏈接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè) socket...
    小蝦米前端閱讀 593評(píng)論 0 0

友情鏈接更多精彩內(nèi)容