saltstack 的日常使用(一)

更多關(guān)注:http://www.mknight.cn/

安裝

yum install salt-master
or
yum install salt-minion

啟動

systemctl start salt-master
or
/etc/init.d/salt-master start

基本命令

salt-key

salt-key命令用來管理master上所有的密鑰的;列出master上的密鑰:

salt-key -L

salt-key -a 接受一個minion的認(rèn)證

salt-key -a minion.saltstack.com

接受所有未驗證的鑰匙

salt-key -A

test.ping確認(rèn)一個minion是否連接正常

salt '*' test.ping

是指向所有minions的目標(biāo)。
test.ping告訴minion運行test.ping函數(shù)。
運行這條命令的結(jié)果將會是master指示所有的minions并行執(zhí)行test.ping并返回結(jié)果。
這不是真正的ICMP ping,而是一個簡單的函數(shù)返回True。使用test.ping是確認(rèn)一個minion是否連接正常

disk.usage

salt '*' disk.usage

network.interfaces

salt '*' network.interfaces

cmd.run

使用cmd.run遠(yuǎn)程執(zhí)行命令,cmd是模塊,run是cmd模塊的一個方法

salt '*' cmd.run 'df -h'

查看hosts

salt '*' cmd.run "grep salt /etc/hosts"
mq:
    192.168.1.31 salt
owncloud:
    192.168.1.31    salt
docker:
    192.168.1.31 salt
dev.db:
    192.168.1.31 salt

批量修改hosts

salt '*' cmd.run "sed -i 's/192.168.1.30/192.168.1.31/' /etc/hosts"

pkg

pkg 函數(shù)會自動將本地系統(tǒng)包管理器映射到相同的salt函數(shù)。這意味著 pkg.install 在基于Red Hat系統(tǒng)上將使用 yum 而在Debian系統(tǒng)上則使用 apt 來安裝包,等等。

 salt 'salt-minion' pkg.install vim

匹配主機(jī)

  • 普通匹配
匹配所有 '*'
匹配單個  'minion_id'
  • 正則匹配
    使用-E ,--pcre 進(jìn)行正則匹配
salt -E '^stack-node\w+'  cmd.run "free -m"

返回結(jié)果:

stack-node01:

                 total       used       free     shared    buffers     cached

    Mem:          1877        377       1499          0         27        223

    -/+ buffers/cache:        126       1751

    Swap:         4095          0       4095

stack-node02:

                 total       used       free     shared    buffers     cached

    Mem:          1877        377       1499          0         28        223

    -/+ buffers/cache:        125       1751

    Swap:         4095          0       4095
  • 列表匹配
    -L,--list,以主機(jī)id名列表的形式進(jìn)行過濾,格式與Python的列表相似,即不同主機(jī)id 名稱使用逗號分隔
[root@stack-master ~]# salt -L 'stack-node01,stack-node02'  cmd.run "free -m"

stack-node02:

                 total       used       free     shared    buffers     cached

    Mem:          1877        376       1501          0         28        223

    -/+ buffers/cache:        123       1753

    Swap:         4095          0       4095

stack-node01:

                 total       used       free     shared    buffers     cached

    Mem:          1877        378       1499          0         28        223

    -/+ buffers/cache:        126       1751

    Swap:         4095          0       4095
  • IP匹配
    -S,--ipcidr,根據(jù)被控主機(jī)的IP地址或IP子網(wǎng)進(jìn)行匹配
[root@stack-master ~]# salt -S 172.16.202.0/24  cmd.run "free -m"

stack-master:

                 total       used       free     shared    buffers     cached

    Mem:          1877        676       1201          0         30        225

    -/+ buffers/cache:        420       1457

    Swap:         4095          0       4095

stack-node01:

                 total       used       free     shared    buffers     cached

    Mem:          1877        378       1498          0         28        223

    -/+ buffers/cache:        126       1751

    Swap:         4095          0       4095

stack-node02:

                 total       used       free     shared    buffers     cached

    Mem:          1877        376       1500          0         28        223

    -/+ buffers/cache:        123       1753

    Swap:         4095          0       4095

配置管理

SLS(代表SaLt State文件)是Salt State系統(tǒng)的核心。SLS描述了系統(tǒng)的目標(biāo)狀態(tài),由格式簡單的數(shù)據(jù)構(gòu)成。這經(jīng)常被稱作配置管理。

top.sls

top.sls 是配置管理的入口文件,一切都是從這里開始,在master 主機(jī)上,默認(rèn)存放在/srv/salt/目錄.
top.sls 默認(rèn)從 base 標(biāo)簽開始解析執(zhí)行,下一級是操作的目標(biāo),可以通過正則,grain模塊,或分組名,來進(jìn)行匹配,再下一級是要執(zhí)行的state文件,不包換擴(kuò)展名。
創(chuàng)建 /srv/salt/top.sls

#正則匹配
base:
  '*':
    - webserver
#組匹配
base:
  group1:
    - match: nodegroup
    - webserver
#grain匹配,必須要有- match: grain
base:
  'os:Fedora':
    - match: grain
    - webserver

準(zhǔn)備好top.sls文件后,編寫一個state文件

#/srv/salt/webserver.sls
apache:                 # 標(biāo)簽定義
  pkg:                  # state declaration
    - installed         # function declaration
  • 第一行被稱為(ID declaration) 標(biāo)簽定義,在這里被定義為安裝包的名。注意:在不同發(fā)行版軟件包命名不同,比如 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2
  • 第二行被稱為(state declaration)狀態(tài)定義, 在這里定義使用(pkg state module)
  • 第三行被稱為(function declaration)函數(shù)定義, 在這里定義使用(pkg state module)調(diào)用 installed 函數(shù)

最后可以在終端中執(zhí)行命令來查看結(jié)果:

salt '*' state.highstate

或附件 test=True參數(shù) 測試執(zhí)行

salt '*' state.highstate -v test=True

主控端對目標(biāo)主機(jī)(targeted minions)發(fā)出指令運行state.highstatem模塊,目標(biāo)主機(jī)首先會對top.sls下載,解析,然后按照top.sls內(nèi)匹配規(guī)則內(nèi)的定義的模塊將被下載,解析,執(zhí)行,然后結(jié)果反饋給 master.

SLS文件

注意在以上的例子中,SLS文件 webserver.sls 被簡稱為webserver. SLS文件命名空間有如下幾條基本的規(guī)則:

1、SLS文件的擴(kuò)展名 .sls 被省略。 (例如. webserver.sls 變成 webserver)
2、子目錄可以更好的組織,每個子目錄都由一個點來表示.(例如 webserver/dev.sls 可以簡稱為 webserver.dev)
3、如果子目錄創(chuàng)建一個init.sls的文件,引用的時候僅指定該目錄即可. (例如 webserver/init.sls 可以簡稱為 webserver)
4、如果一個目錄下同時存在webserver.sls 和 webserver/init.sls,那么 webserver/init.sls 將被忽略,SLS文件引用的webserver將只引用webserver.sls
示例:

apache/init.sls
apache/httpd.conf
ssh/init.sls
ssh/server.sls
ssh/banner
ssh/ssh_config
ssh/sshd_config

創(chuàng)建一個引用這些目錄的 server.sls

server:
  - apache
  - ssh
  - ...

state的層級關(guān)系

include

include 包含某個state文件
/srv/salt/apache.sls

apache:
  pkg:
    - installed
  service:
    - running
    - require:
      - pkg: apache

使用 include 可以包換有state文件而不必重新寫
/srv/salt/apache-custom.sls

include:
  apache

extend

extend 與include配合使用,作用是 修改,或擴(kuò)展引用的state文件的某個字段
/srv/salt/apache.sls

apache:
  pkg:
    - installed
  service:
    - running
    - require:
      - pkg: apache

extend默認(rèn)是替換引用文件的某個字段的屬性,簡單說就是先加載,再修改部分字段。如例
/srv/salt/apache-change.sls

include:
  - apache
extend:
  apache
    pkg:
      - name: vim
      - installed

當(dāng)extend與watch,或require結(jié)合使用的時候,則是擴(kuò)展某個字段的屬性。如例:
/srv/salt/apache-custom.sls

include:
  - apache
extend:
  apache
    service:
      - watch:
        - file: /etc/redis.conf

state的邏輯關(guān)系列表

match: 配模某個模塊,比如 match: grain match: nodegroup
require: 依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個
watch: 在某個state變化時運行此模塊
order: 優(yōu)先級比require和watch低,有order指定的state比沒有order指定的優(yōu)先級高

state的邏輯關(guān)系實例

require:依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個.
先檢查依賴,再運行其他。

httpd:                                  # maps to "name"
  pkg:
    - installed
  file:                                # maps to State module  filename
    - managed:                          # maps to the managed function in the file State module
    - name: /etc/httpd/conf/httpd.conf  # one of many options passed to the manage function
    - source: salt://httpd/httpd.conf
    - require:
      - pkg: httpd

watch:在某個state變化時運行此模塊,watch除具備require功能外,還增了關(guān)注狀態(tài)的功能。檢查是否有變化為前提條件。

redis:
  pkg:
    - latest
  file.managed:
    - source: salt://redis/redis.conf
    - name: /etc/redis.conf
    - require:
      - pkg: redis
  service.running:
    - enable: True
    - watch:
      - file: /etc/redis.conf
      - pkg: redis

order:優(yōu)先級比require和watch低,有order指定的state比沒有order指定的優(yōu)先級高

vim:
  pkg.installed:
    - order: 1

想讓某個state最后一個運行,可以用last.

環(huán)境變量

示例:

file_roots:
  base:
    - /srv/salt/
  dev:
    - /srv/salt/dev/services
    - /srv/salt/dev/states
   prod:
     - /srv/salt/prod/services
     - /srv/salt/prod/states

state.sls默認(rèn)的運行環(huán)境是base環(huán)境,但是它并不讀取top.sls(top.sls定義了運行環(huán)境以及需要運行的sls)。關(guān)于state.sls的官方文檔說明如下:

salt.modules.state.sls(mods, saltenv='base', test=None, exclude=None, queue=False, env=None,**kwargs)

這里saltenv指的是運行環(huán)境,默認(rèn)是base環(huán)境。

state.highstate: 這個是全局的所有環(huán)境,以及所有狀態(tài)都生效。它會讀取每一個環(huán)境的top.sls,并且對所有sls都生效。

state.sls也可以指定讀取哪個環(huán)境:

state.sls  salt_env='prod' xxxx.sls

這個xxxx.sls可以不在top.sls中記錄。

模板

使用模板可以精簡sls,使sls文件可以使用Python的循環(huán),判斷等邏輯。
示例:

{% for item in ['tmp','test'] %}
/opt/{{ item }}:
  file.directory:
    - user: root
    - group: root
    - mode: 755
    - makedirs: True
{% endfor %}
httpd:
  pkg.managed:
{% if grains['os'] == 'Ubuntu' %}
    - name: apache2
{% elif grains['os'] == 'CentOS' %}
    - name: httpd
{% endif %}
    - installed

使用的步驟比較簡單:
1.File狀態(tài)使用template參數(shù) - template: jiaja
2.模板文件里面使用{{名稱}}
3.File狀態(tài)模塊要指定變量列表

- defaults:
  PORT:8080

示例:

[root@linux-node1 base]# cd /srv/salt/base/
[root@linux-node1 base]# vim dns.sls
/etc/resolv.conf:
  file.managed:
    - source: salt://files/resolv.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    - defaults:
      DNS_SERVER: 10.0.0.2
[root@linux-node1 base]# vim files/resolv.conf
###hehe
nameserver {{ DNS_SERVER }}
[root@linux-node1 base]# salt '*' state.highstate

語法

YAML語法

規(guī)則一:縮進(jìn)

YAML使用一個固定的縮進(jìn)風(fēng)格表示數(shù)據(jù)層結(jié)構(gòu)關(guān)系,Saltstack需要每個縮進(jìn)級別由兩個空格組成。一定不能使用tab鍵

規(guī)則二:冒號

YAML:
mykey: my_value
每個冒號后面一定要有一個空格(以冒號結(jié)尾不需要空格,表示文件路徑的模版可以不需要空格)

規(guī)則三:短橫線

想要表示列表項,使用一個短橫杠加一個空格。多個項使用同樣的縮進(jìn)級別作為同一個列表的一部分。

my_dictionary:
  - list_value_one
  - list_value_two
  - list_value_three

更多關(guān)注:http://www.mknight.cn/

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

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

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