自動化運維工具之Saltstack

1、簡介html

what  is Saltstack?node

Saltstack是一個具有puppet與func功能爲一身的集中化管理平臺,saltstack基於python實現,功能十分強大,適合大規模批量管理服務器,而且它比 Puppet 更容易配置。saltstack具備三種基本功能包括遠程命令執行,配置管理(服務,文件,cron,用戶,組),雲管理。同時,saltstack具備三種運行方式Local、master/minon 、salt ssh。其中master/minion是其最傳統的運行方式採用c/s模式,須要在管理端安裝Master,被管理節點上安裝Minion;而Saltstack salt ssh 運行方式,能夠實現無需安Agent,經過SSH進行管理。python

Saltstack部署架構nginx

master->minion:master和全部minion鏈接,minion接收來自master的指令,完成命令執行或配置。如圖:web

28bd649378ba813ad2de8b202881e745.png-wh_

master->syndic->minion:master經過syndic對minion進行管理,該架構能夠進行多級擴展。如圖:正則表達式

ccb8204d6409a4e5f3b696dc41e84c77.png-wh_

無master的minion:minion不受任何master控制,經過本地運行便可完成相關功能。sql

8b3e2f87fb4d6536b3c292cd85f375cf.png-wh_

Saltstack的兩種主要設計理念是遠程執行和配置管理。在遠程執行系統中,salt用python經過函數調用來完成任務。salt中的配置管理系統能夠稱做state,也是基於遠程執行系統之上,經過master的定規可讓對應的minion達到想要的系統狀態。shell

salt遠程執行底層原理:數據庫

Salt的底層通訊是經過ZeroMQ完成的,採用了ZeroMQ的訂閱發佈模式(Pub和Sub)以下圖所示:apache

salt遠程執行原理圖.png

    簡單來說,Pub/Sub模式相似於廣播電臺,在訂閱發佈模式中Pub將消息發送到總線,全部的Sub收到來自總線的消息後,根據本身的條件來接收特定的消息。對應到salt中就是master將事件發佈到消息總線,minion訂閱並監聽事件,而後minion會查看事件是否和本身匹配以肯定是否須要執行,匹配條件就是多種主機匹配方法。saltmaster和minion的通訊過程當中,會啓動監聽兩個端口,默認是4505和4506。

    4506的做用:Salt Master Ret接口,支持認證(auth)、文件服務、結果收集等功能;

    4505的做用:Salt Master Pub接口,提供遠程執行命令發送功能。

    Salt minion啓動時從配置文件中獲取master的地址,若是爲域名,則進行解析。解析完成後,會鏈接master的4506(ret接口)進行key認證。認證經過,會獲取到master的publish_port(默認是4505),然手鍊接publish_port訂閱來自master pub接口任務。當master下發操做指令是,全部的minion都能接收到,而後minion會檢查本機是否匹配。若是匹配,則執行。執行完畢後,把結果發送到master的4506(ret接口)由master進行處理,命令發送通訊完成是異步的,而且命令包很小。此外,這些命令包經過maqpack進行序列化後數據會進一步壓縮(Maqpack是一種高效的二進制序列化格式),因此salt的網絡負載很是低。

2、Saltstack的安裝

2.1 yum源安裝

下載Centos6的epol源進行安裝:

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

若是使用Centos7,能夠下載此epol源:

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

安裝master端:

yum install salt-master

啓動master端服務:

/etc/init.d/salt-master start

43fd178ff2fc4e0b809cdd1474b4065c.png-wh_

Agent安裝minion端:

Yum install salt-minion

2.2 Agent簡單配置Saltstack

Agent指定master:

vim /etc/salt/mionion

# resolved, then the minion will fail to start.
#master: salt
master: 192.168.39.135

修改mionion的id號:

# clusters.
#id:
id: Agent1

注:id號用於惟一區分mionion的標示,能夠不作指定,默認爲主機名。

啓動minon服務:

873ac98c4110b922c7a67abac2091985.png-wh_

2.3 master受權mionion密鑰認證

master查看認證請求:

# salt-key

efbb1f99534bb6dfcb20628e9f4ae489.png-wh_

master受權請求:

# salt-key -a centos-test1

能夠批量受權請求:

[root@centos salt]# salt-key -A

再次查看請求,能夠看到都以受權成功:

5315774f7e5de67765b3f0c6ade9acd0.png-wh_

進行測試,能夠看到agent端信息:

fc16e9796a89da270f46749de6382689.png-wh_

3、Saltstack的數據系統

Saltstack有兩個數據系統,分別是Grains和Pillar。本質上它們都是key value型的數據庫。

3.1 Grains

Grains是存儲在minion上的數據,minion啓動後就進行Grains計算。Grains是一種靜態數據,包括不少諸如操做系統、操做系統版本或CPU內核數量、內存大小等數據。這些數據不

常常變,即便有所變化重啓Minion也會從新計算生成。Grains讓salt變得更加靈活。

Grains功能:1)信息查詢 ;包括資產管理  2)用於目標選擇   3)配置管理中使用

3.1.1 信息查詢(包括資產管理)

[root@centos ~]# salt 'centos-test1*' grains.ls  #列出ID爲"centos-test1"的主機,grains全部項

[root@centos ~]# salt 'centos-test1*' grains.items #列出主機的詳細信息,可用於資產管理
[root@centos ~]# salt 'centos-test1*' grains.item host #查詢centos-test1的主機名
[root@centos ~]# salt '*' grains.item fqdn_ip4 #查詢左右主機的ip地址

3.1.2 目標選擇

[root@centos ~]# salt -G os:CentOS test.ping #對全部主機系統爲"centos"的主機進行Ping測試
[root@centos ~]# salt -G os:CentOS cmd.run 'w' #對全部主機系統爲「centos」的主機查詢負載狀態

3.1.3 配置管理中的使用

方法一:

經過修改minion的配置文件能夠自定義Grains。

# vim /etc/salt/minion

#  cabinet: 13
#  cab_u: 14-15
grains:
   roles:
     - webserver
     - memcache

重啓minion服務:

# /etc/init.d/salt-minion restart

經過自定義的item,能夠實現對全部角色爲memche命令執行"date"命令

[root@centos ~]# salt '*' grains.item roles #查詢全部主機的角色信息

屏幕快照 2017-11-27 下午5.42.47.png

[root@centos ~]# salt -G 'roles:memcache' cmd.run 'date' #對全部主機roles爲memcache的主機,執行"date"命令

屏幕快照 2017-11-27 下午5.44.38.png

方法二:

也能夠經過修改/etc/salt/grains文件來實現。

# vim /etc/salt/grains

minion: host1

[root@centos ~]# salt -G 'minion:host1' cmd.run 'w'[object Object]

修改/etc/salt/grains不重啓服務的方法,刷新命令以下(備註:方式一和方式二修改配置文件,經過此命令均可以不用重啓服務)

# salt '*' saltutil.sync_grains

方法三:

Grains在top file中使用(Grains module方式)。

1)建立文件系統路徑:

[root@centos ~]# mkdir -p /srv/salt/

2)修改master配置文件指定top file文件路徑

[root@centos ~]# vim /etc/salt/master

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

3) 編輯top file文件

[root@centos ~]# vim /srv/salt/top1.sls base:
base:
  'web:nginx':
    - match: grains  #指定grains進行匹配
    - apache #執行apache.sls

#全部值爲nginx的主機,執行apache的狀態

[root@centos ~]# vim /srv/salt/apache.sls

apache-install:
  pkg.installed:
    - names:
      - httpd
      - httpd-devel
apache-service:
  service.running:
    - name: httpd
    - enable: True
    - reload: True

[root@centos ~]# salt '*' state.highstate  #執行[object Object]

Saltstart文件sls能夠參考:http://www.jianshu.com/p/7f0b4857c8ac

案例:

/srv/salt/webserver.sls
apache:                 # 標籤訂義
  pkg:                  # state declaration
    - installed         # function declaration
第一行被稱爲(ID declaration) 標籤訂義,在這裏被定義爲安裝包的名。注意:在不一樣發行版軟件包命名不一樣,好比 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2
第二行被稱爲(state declaration)狀態定義, 在這裏定義使用(pkg state module)
第三行被稱爲(function declaration)函數定義, 在這裏定義使用(pkg state module)調用 installed 函數

3.2 Pillar

Grains很強大,可是其缺點是這些數據相對來講都是靜態數據。若是有變化的數據如何處理呢?這時咱們就用到了pillar。pillar數據存儲在master上。指定的minion只能看到本身pillar數據,其餘的minion看不到任何pillar數據,這一點與狀態文件正好相反。全部經過認證的minion均可以獲取狀態文件,可是每隔minion卻都有本身的一套pillar數據,並且每臺minion的pillar都進行了加密,因此很適用於敏感數據。

3.2.1 開啓pillar

如今saltstack已經默認關閉pillar,所以pillar功能須要開啓。

[root@centos ~]# vim /etc/salt/master

# the pillar called "master". This is used to set simple configurations in the
# master config file that can then be used on minions.
pillar_opts: True

[root@centos ~]# service salt-master restart

列出minion全部pillar的詳細信息。

[root@centos ~]# salt 'centos-test1' pillar.items

屏幕快照 2017-11-28 上午10.59.30.png

3.2.2 定義pillar目錄

[root@centos ~]# vim /etc/salt/master

#    - /srv/pillar
pillar_roots:
  base:
    - /srv/pillar

[root@centos ~]# mkdir -p /srv/pillar

1) 建立一個pillar文件(python jinjia2寫法)

[root@centos ~]# vim /srv/pillar/apache.sls

{%if grains ['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os' == 'Debian'] %}
apache: apache2
{% endif %}

2)建立top file文件

[root@centos ~]# vim /srv/pillar/top.sls
base:
  '*':
   - apache

#讓全部主機(*),讀取apachepillar

[root@centos ~]# salt '*' saltutil.refresh_pillar  #執行刷新pillar
[root@centos ~]# salt '*' pillar.items

屏幕快照 2017-11-28 上午11.22.59.png

使用pillar定位主機:

[root@centos ~]# salt -I 'apache:httpd' test.ping

屏幕快照 2017-11-28 上午11.37.21.png

3.3 Grains和Pillar的不一樣

屏幕快照 2017-11-28 下午2.40.19.png

4、Saltstack遠程執行

4.1 遠程執行

在遠程主機上運行預約義的或任意的命令,亦稱爲遠程執行,是salt的核心功能。瞭解模塊和返回值,是遠程執行兩個關鍵要素。

Salt命令由三個主要部分構成:

salt '<target>' <function> [arguments]

TARGET

target部分容許你指定哪些minion應該運行執行. 默認的規則是使用glob匹配minion id. 例如:

salt '*' test.ping
salt '*.example.org' test.ping

Targets可使用Grains系統來經過minion的系統信息進行過濾:

salt -G 'os:Ubuntu' test.ping

參見

Grains系統

ip地址或子網掩碼進行檢測:

salt -S '192.168.39.200' test.ping

Targets也可使用正則表達式:

salt -E 'virtmach[0-9]' test.ping

Targets也能夠指定列表:

salt -L 'foo,bar,baz,quo' test.ping

或者在一個命令中混合使用多target類型:

salt -C 'G@os:Ubuntu an webser* or E@database.*' test.ping

FUNCTION

funcation是module提供的功能. Salt內置了大量有效的functions. 列出minions上的全部有效functions?

salt '*' sys.doc

這裏有一些例子:

顯示當前全部有效的minions:

salt '*' test.ping

運行一個任意的shell命令:

salt '*' cmd.run 'uname -a'

參見

全部模塊列表

arguments 

function經過空格來界定參數:

salt '*' cmd.exec_code python 'import sys; sys.version'

可選的, 也支持keyword參數:

salt '*' pip.install salt timeout=5 upgrade=True

他們經常在 kwargs=argument form中.

4.2 salt經常使用模塊

saltstack提供了不少執行模塊,能夠從官方文檔上查找模塊具體使用方法。saltstack執行模塊連接:http://docs.saltstack.cn/ref/modules/all/index.html#all-salt-modules

下面指列舉service模塊使用方法:

salt.modules.service.available(name)

判斷指定服務是否存在,若是存在返回True,不然返回False。

[root@centos ~]# salt '*' service.available sshd
centos-test2:
    True
centos-test3:
    True
centos-test1:
    True

salt.modules.service.get_all()

返回全部服務可用的列表。

[root@centos ~]# salt '*' service.get_all
centos-test1:
    - abrt-ccpp
    - abrt-oops
    - abrtd
    - acpid
    - atd
    - auditd
    - blk-availability
    - control-alt-delete
    - cpuspeed
    - crond
    - haldaemon

salt.modules.service.run(name, action)

用動做運行指定的服務。

name --服務名 action --動做名稱,如start,stop,reload,restart。

# salt '*' service.run apache2 reload
# salt '*' service.run postgresql initdb
salt.modules.service.start(name)

啓動指定服務。

[root@centos ~]# salt '*' service.start httpd
salt.modules.service.status(name)

查詢指定服務狀態。服務啓動返回True,服務未啓動返回False。

[root@centos ~]# salt '*' service.status httpd
centos-test2:
    True
centos-test1:
    True
centos-test3:
    True

4.3 模塊的ACL(訪問控制)
4.3.1 對系統用戶容許特定命令執行

1)修改相應目錄權限

[root@centos ~]# chmod 755 /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master/

2)修改master配置文件,開啓acl訪問控制

[root@centos ~]# vim /etc/salt/master

client_acl:
  jerry:    #用戶jerry
    - test.ping  #只容許使用test.ping和network下全部方法
    - network.*

3)重啓服務

[root@centos ~]# /etc/init.d/salt-master restart

測試:

屏幕快照 2017-11-30 下午2.28.59.png

4.3.2 指定用戶在某一臺機器上執行特定命令

1)修改配置

[root@centos ~]# vim /etc/salt/master

client_acl:
  jerry:
    - test.ping
    - network.*
  tom:  #用戶
    - centos-test1*: #主機centos-test1
      - test.ping #test.ping命令

2)重啓服務

[root@centos ~]# /etc/init.d/salt-master restart

測試:

屏幕快照 2017-11-30 下午2.38.43.png

5、Saltstack配置管理

Saltstack包含一個健壯且靈活的配置管理框架,該框架創建在遠程執行核心上。這個框架執行的minion端,容許輕鬆,同時可配置成千上萬的主機,經過編寫特定於語言的狀態文件得以實現。saltstack的配置管理提供了不少的「狀態模塊」用於實現不一樣配置管理的需求。如下是配置管理的連接以方便查詢:https://docs.saltstack.com/en/latest/topics/states/index.html

1)修改file_root文件目錄

[root@centos base]# vim /etc/salt/master 
file_roots:
  base:
    - /srv/salt/base
  test:
    - /srv/salt/test
  prod:
    - /srv/salt/prod

2) 建立文件目錄

[root@centos base]# mkdir -p /srv/salt/base
[root@centos base]# mkdir -p /srv/salt/test
[root@centos base]# mkdir -p /srv/salt/prod

3)重啓服務

[root@centos base]# /etc/init.d/salt-master restart

批量修改/etc/resolv.conf文件:

[root@centos ~]# cd /srv/salt/base
[root@centos base]# vim dns.sls
/etc/resolv.conf:    #標籤
  file.managed:     #狀態模塊file的mamaged方法,用以實現
    - source: salt://files/resolv.conf  #源文件resolv.conf
    - user: root    #文件用戶屬主
    - group: root    #文件數組
    - mode: 644    #文件權限

文件目錄狀態爲:

屏幕快照 2017-12-01 下午5.12.06.png

resolv.conf文件內容:

[root@centos base]# more files/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.39.2

[root@centos base]# salt '*' state.sls dns #執行dns狀態文件

屏幕快照 2017-12-01 下午5.12.55.png

也能夠從top文件上執行。

[root@centos base]# vim top.sls 
base:
  '*':
    - dns

[root@centos base]# salt '*' state.highstate  #state高級狀態默認從top文件中執行

查看minion端的resolv.conf文件:

屏幕快照 2017-12-01 下午5.22.04.png

5.2 saltstack配置管理之YAML和jinjia

5.2.1 什麼是YAML?

YAML是「另外一種標記語言」的外語縮寫(見前方參考資料原文內容);但爲了強調這種語言以數據作爲中心,而不是以置標語言爲重點,而用返璞詞從新命名。它是一種直觀的可以被電腦識別的數據序列化格式,是一個可讀性高而且容易被人類閱讀,容易和腳本語言交互,用來表達資料序列的編程語言。

它是相似於標準通用標記語言的子集XML數據描述語言,語法比XML簡單不少。

YAML語法規則:

規則一:縮緊

1)yaml使用一個固定的縮緊風格表示水層結構關係。salt須要每一個縮緊分別由兩個空格組成。

2)不要使用tabs。

規則二:冒號

YAML my_key: my_value

first_level dict_key:

  second_level dict_key: value_in_second_level_dict

IN Pyton {‘my_key’: ‘my_value’,

{

‘first_level_dict_key’:{

‘second_level_dict_key’: ‘value_in_second_level_dict’

}

}

}

規則三:短橫線

想要表示列表項:使用一個短橫槓加一個空格。多個項使用一樣的縮緊級別做爲同一列表的一部分。

my_dictionary:

  - list_value_one

  - list_value_two

  - list_value_three

{‘my_dictionary’: [‘list_value_one’,’list_value_two’,’list_value_three’]}

5.2.2 什麼是jinja?

Jinja2是基於python模板引擎,功能比較相似於於PHPsmartyJ2eeFreemarkervelocity。 它能徹底支持unicode,並具備集成的沙箱執行環境,應用普遍。jinja2使用BSD受權。jiaja2官網:http://jinja.pocoo.org/

1.file狀態使用template參數

2.模版文件裏面變量使用{{ 名稱 }} {{ PORT }}

3.變量列表

-defaults:

PORT:8080

4.Jinjia if-else 語句

{% if grains[‘fqdn’] == ‘lb-node1.unixhot.com’ %}

  — ROUTEID: haproxy_master

  - STATEID: master

{% elif grains[‘fedn’] == ‘lb-node2.unixhot.com’ %}

  - ROUTEID: haproxy_backup

  - STATEID: backup

  - PRIORITYID: 100

{% endif %}

5.2.2 變量的使用

以上一個示例需改resolv.conf爲例

[root@centos ~]# vim /srv/salt/base/dns.sls 
/etc/resolv.conf:
  file.managed:
    - source: salt://files/resolv.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja #template指定爲jinja模版
    - defaults:
      DNS_SERVER: 192.168.39.23 #變量:默認值

[root@centos ~]# vim /srv/salt/base/files/resolv.conf 
# Generated by NetworkManager
nameserver {{ DNS_SERVER }} #{{ DNS_SERVER }} 做爲變量,也可使用單括號,這裏使用便於區分
[root@centos base]# salt '*' state.highstate #執行進行修改minions端配置

能夠看到已經修改完成。

屏幕快照 2017-12-04 下午5.44.00.png

參考資料:

https://docs.saltstack.com/en/latest/

http://outofmemory.cn/saltstack/salt

https://repo.saltstack.com/

相關文章
相關標籤/搜索