salt 上手

1. 關於本文檔

這份文檔如其名,是我本身整理的學習 SaltStack 的過程記錄。只是過程記錄,沒有刻意像教程那樣去作。因此呢,從前至後,中間難免有一些概念不清不明的地方。由於事實上,在某個階段對於一些概念原本就不可能明白。因此,整個過程只求在形式上的能用便可。前面就不要太糾結概念和原理,知道怎麼用就好。php

但願這篇文章可以讓你快速瞭解並使用saltstack。文章還在編寫中。html

2. 關於SaltStack

2.1. 什麼是SaltStack

SaltStack是開源的管理基礎設置的輕量級工具,容易搭建,爲遠程管理服務器提供一種更好、更快速、更有擴展性的解決方案。經過簡單、可管理的接口,Salt實現了能夠管理成千上百的服務器和處理大數據的能力。node

  • 輕量級配置管理系統,可以維持遠端節點運行在預約狀態(例如,確保指定的軟件包已經安裝和特定的系統服務正在運行)python

  • 分佈式遠程執行系統,用於在遠端節點執行命令和查詢數據,能夠是單獨,也能夠是選定的條件linux

2.2. SaltStack特色

簡單

兼顧大規模部署與更小的系統的同時提供多功能性是很困難的,Salt是很是簡單配置和維護,無論項目的大小。Salt能夠勝任管理任意的數量的服務器,不論是本地網絡,仍是跨數據中心。架構採用C/S模式,在一個後臺程序中集成必要功能。默認不須要複雜的配置就能夠工做,同時能夠定製用於特殊的需求。git

並行執行

Salt的核心功能:github

  • 經過並行方式讓遠端節點執行命令web

  • 採用安全的加密/解析協議正則表達式

  • 最小化使用網絡和負載shell

  • 提供簡單的程序接口

  • Salt引入了更細粒度的控制,容許不經過目標名字,二是經過系統屬性分類

構建在成熟技術之上

Salt採用了不少技術和技巧。網絡層採用優秀的ZeroMQ庫,因此守護進程裏面包含AMQ代理。Salt採用公鑰和主控通信,同時使用更快的AES加密通訊,驗證和加密都已經集成在Salt裏面。Salt使用msgpack通信,因此更快速和更輕量網絡交換。

Python 客戶端接口

爲了實現簡單的擴展,Salt執行例程能夠寫成簡單的Python模塊。客戶端程序收集的數據能夠發送回主控端,能夠是其餘任意程序。能夠經過Python API調用Salt程序,或者命令行,所以,Salt能夠用來執行一次性命令,或者大型應用程序中的一部分模塊。

快速,靈活,可擴展

結果是一個系統能夠高速在一臺或者一組服務器執行命令。Salt速度很快,配置簡單,擴展性好,提供了一個遠程執行架構,能夠管理多樣化需求的任何數量的服務器。整合了世界上最好的遠程執行方法,加強處理能力,擴展使用範圍,使得能夠適用任何多樣化複雜的網絡。

開源

Salt基於Apache 2.0 licence開發,能夠用於開源或者自有項目。請反饋你的擴展給項目組,以便更多人受益,共同促進Salt發展。請在你的系統部署 系統,讓運維更便捷。

開發語言:Python

2.3. 支持的系統

常見的系統包能夠直接下載安裝使用:

3. 安裝SaltStack

3.1. 依賴

SaltStack只能安裝在類unix的操做系統上並依賴如下組件:

  • Python 2.6 >= 2.6 <3.0

  • ZeroMQ >= 2.1.9

  • pyzmq >= 2.1.9 - ZeroMQ Python bindings

  • PyCrypto - The Python cryptography toolkit

  • msgpack-python - High-performance message interchange format

  • YAML - Python YAML bindings

  • Jinja2 - parsing Salt States (configurable in the master settings)

可選的依賴:

  • mako - an optional parser for Salt States (configurable in the master settings)

  • gcc - dynamic Cython module compiling

3.2. 快速安裝

可使用官方提供的Salt Bootstrap來快速安裝SaltStack。

安裝master:

curl -L http://bootstrap.saltstack.org | sudo sh -s -- -M -N

安裝minion:

wget -O - http://bootstrap.saltstack.org | sudo sh

當前Salt Bootstrap已經在如下操做系統測試經過:

  • Ubuntu 10.x/11.x/12.x

  • Debian 6.x

  • CentOS 6.3

  • Fedora

  • Arch

  • FreeBSD 9.0

3.3. 經過rpm安裝

3.3.1. 下載EPEL yum源:

RHEL 5系統:

rpm -Uvh http://mirror.pnl.gov/epel/5/i386/epel-release-5-4.noarch.rpm

RHEL 6系統:

rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm

3.3.2. 安裝包

在master上運行:

yum install salt-master

在minion上運行:

yum install salt-minion

3.3.3. 安裝後

master上設置開啓啓動並啓動服務:

chkconfig salt-master on
service salt-master start

minion上設置開啓啓動並啓動服務:

chkconfig salt-minion on
service salt-minion start

3.4. 排錯

當前最新版爲0.17.1,若是你也是使用的這個版本而且啓動提示以下錯誤:

[root@sk1 vagrant]# /etc/init.d/salt-master start
Starting salt-master daemon: Traceback (most recent call last):
 File "/usr/bin/salt-master", line 10, in <module>
   salt_master()
 File "/usr/lib/python2.6/site-packages/salt/scripts.py", line 20, in salt_master
   master.start()
 File "/usr/lib/python2.6/site-packages/salt/__init__.py", line 114, in start
   if check_user(self.config['user']):
 File "/usr/lib/python2.6/site-packages/salt/utils/verify.py", line 296, in check_user
   if user in e.gr_mem] + [pwuser.gid])
AttributeError: 'pwd.struct_passwd' object has no attribute 'gid'

經過google搜索關鍵字saltstack 'pwd.struct_passwd' object has no attribute 'gid',能夠找到這個issues,查看評論能夠發現這是一個bug,將會在0.17.2中被修復。

個人解決方法是:下載saltstack源碼從新編譯

wget https://github.com/saltstack/salt/archive/develop.zip
unzip develop
cd salt-develop/
python2.6 setup.py install

4. 配置SaltStack

4.1. master配置

master不修改配置文件就能夠運行,而minion必須修改配置文件中的master id才能和master通信,配置文件分別在/etc/salt/master 和 /etc/salt/minion

master默認監控0.0.0.0上4505和4506端口,你能夠在/etc/salt/master中修改成指定ip。

master關鍵配置:

  • interface

  • publish_port

  • user

  • max_open_files

  • worker_threads

  • ret_port

  • pidfile

  • root_dir

  • pki_dir

  • cachedir

  • keep_jobs

  • job_cache

  • ext_job_cache

  • minion_data_cache

  • enforce_mine_cache

  • sock_dir

Master Security配置

  • open_mode

  • auto_accept

  • autosign_file

  • client_acl

  • client_acl_blacklist

  • external_auth

  • token_expire

Master Module管理

  • runner_dirs

  • cython_enable

Master State設置

  • state_verbose

  • state_output

  • state_top

  • external_nodes

  • renderer

  • failhard

  • test

Master File Server設置

  • fileserver_backend

  • file_roots

  • hash_type

  • file_buffer_size

Pillar配置

  • pillar_roots

  • ext_pillar

Syndic Server設置

  • order_masters

  • syndic_master

  • syndic_master_port

  • syndic_log_file

  • syndic_pidfile

Peer發佈設置

  • peer

  • peer_run

Node Groups設置

Master Logging設置

  • log_file

  • log_level

  • log_level_logfile

  • log_datefmt

  • log_datefmt_logfile

  • log_fmt_console

  • log_fmt_logfile

  • log_granular_levels

Include配置

  • default_include

  • include

4.4. minion配置

Minion主要配置:

  • master

  • master_port

  • user

  • pidfile

  • root_dir

  • pki_dir

  • id

  • append_domain

  • cachedir

  • verify_env

  • cache_jobs

  • sock_dir

  • backup_mode

  • acceptance_wait_time

  • random_reauth_delay

  • cceptance_wait_time_max

  • dns_check

  • ipc_mode

  • tcp_pub_port

  • tcp_pull_port

Minion Module管理

  • disable_modules

  • disable_returners

  • module_dirs

  • returner_dirs

  • states_dirs

  • render_dirs

  • cython_enable

  • providers

State Management 設置

  • renderer

  • state_verbose

  • state_output

  • autoload_dynamic_modules

  • environment

File目錄設置

  • file_client

  • file_roots

  • hash_type

  • pillar_roots

Security設置

  • open_mode

線程設置

  • multiprocessing

Minion日誌設置

  • log_file

  • log_level

  • log_level_logfile

  • log_datefmt

  • log_datefmt_logfile

  • log_fmt_console

  • log_fmt_logfile

  • log_granular_levels

Include配置

  • default_include

  • include

Frozen Build Update Settings

  • update_url

  • update_restart_services

5. 初識SaltStack

5.1. 配置

參考上面的配置文件說明修改master和minion配置。這裏個人master主機名爲sk1,minion主機名爲sk2。

修改master配置文件/etc/salt/master

interface: 0.0.0.0
auto_accept: True

修改minion配置文件/etc/salt/minion

master: sk1
id: sk2

5.2. 運行salt

而後運行salt,啓動master(添加-d參數可讓其後臺運行):

salt-master

啓動minion(添加-d參數可讓其後臺運行):

salt-minion

若是須要排錯,能夠添加設置日誌級別:

salt-master --log-level=debug

若是想以非用戶運行,能夠添加--user參數

5.3. 管理Key

Salt在master和minion通訊之間使用AES加密。在master和minion通訊以前,minion上的key須要發送到master並被master接受。能夠在master上查看已經接受的key:

[root@sk1 pillar]# salt-key -L
Accepted Keys:
Unaccepted Keys:
sk2
Rejected Keys:

而後運行下面命令能夠接受全部未被接受的key:

[root@sk1 pillar]# salt-key -A

5.4. 發送命令

在master上發送ping命令檢測minon是否被認證成功:

[root@sk1 pillar]# salt '*' test.ping
sk2:salt '*' test.ping
    True

True代表測試成功。

6. 配置管理

## 6.1 states
## 6.1.1 states文件

salt states的核心是sls文件,該文件使用YAML語法定義了一些k/v的數據。

sls文件存放根路徑在master配置文件中定義,默認爲/srv/salt,該目錄在操做系統上不存在,須要手動建立。

在salt中能夠經過salt://代替根路徑,例如你能夠經過salt://top.sls訪問/srv/salt/top.sls

在states中top文件也由master配置文件定義,默認爲top.sls,該文件爲states的入口文件。

一個簡單的sls文件以下:

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

說明:此SLS數據確保叫作」apache」的軟件包(package)已經安裝,而且」apache」服務(service)正在運行中。

  • 第一行,被稱爲ID說明(ID Declaration)。ID說明代表能夠操控的名字。

  • 第二行和第四行是State說明(State Declaration),它們分別使用了pkg和service states。pkg state經過系統的包管理其管理關鍵包,service state管理系統服務(daemon)。 在pkg及service列下邊是運行的方法。方法定義包和服務應該怎麼作。此處是軟件包應該被安裝,服務應該處於運行中。

  • 第六行使用require。本方法稱爲」必須指令」(Requisite Statement),代表只有當apache軟件包安裝成功時,apache服務才啓動起來。

state和方法能夠經過點連起來,上面sls文件和下面文件意思相同。

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

將上面sls保存爲init.sls並放置在sal://apache目錄下,結果以下:

/srv/salt
├── apache
│   └── init.sls
└── top.sls

top.sls如何定義呢?

master配置文件中定義了三種環境,每種環境均可以定義多個目錄,可是要避免衝突,分別以下:

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

top.sls能夠這樣定義:

 base:
   '*':
    - apache

說明:

  • 第一行,聲明使用base環境

  • 第二行,定義target,這裏是匹配全部

  • 第三行,聲明使用哪些states目錄,salt會尋找每一個目錄下的init.sls文件。

6.1.2 運行states

一旦建立完states並修改完top.sls以後,你能夠在master上執行下面命令:

[root@sk1 salt]# salt '*' state.highstate
sk2:
----------
    State: - pkg
    Name:      httpd
    Function:  installed
        Result:    True
        Comment:   The following packages were installed/updated: httpd.
        Changes:
                   ----------
                   httpd:
                       ----------
                       new:
                           2.2.15-29.el6.centos
                       old:

----------
    State: - service
    Name:      httpd
    Function:  running
        Result:    True
        Comment:   Service httpd has been enabled, and is running
        Changes:
                   ----------
                   httpd:
                       True

Summary
------------
Succeeded: 2
Failed:    0
------------
Total:     2

上面命令會觸發全部minion從master下載top.sls文件以及其中定一個的states,而後編譯、執行。執行完以後,minion會將執行結果的摘要信息彙報給master。

6.2. Grains

## Pillar
## Renderers

遠程執行命令

在上面的例子中,test.ping是最簡單的一個遠程執行的命令,你還能夠執行一些更加複雜的命令。

salt執行命令的格式以下:

salt '<target>' <function> [arguments]
  • target: 執行salt命令的目標,可使用正則表達式

  • function: 方法,由module提供

  • arguments:function的參數

target可使用正則表達式匹配:

salt '*' test.ping
salt 'sk2' test.ping

function是module提供的方法。經過下面命令能夠查看全部的function:

salt '*' sys.doc

function能夠接受參數:

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

而且支持關鍵字參數:

salt '*' cmd.run 'uname -a' cwd=/ user=salt

上面例子意思是:在全部minion上切換到/目錄以salt用戶運行uname -a命令。

關鍵字參數能夠參考module的api,經過api你能夠查看cmd.run的定義:

salt.states.cmd.mod_watch(name, **kwargs)
Execute a cmd function based on a watch call

salt.states.cmd.run(name, onlyif=None, unless=None, cwd=None, user=None, group=None, shell=None, env=(), stateful=False, umask=None, quiet=False, timeout=None, **kwargs)

全部module中的方法定義都與上面相似,說明:

  • name: 第一個參數,爲執行的命令

  • 中間的key=alue爲keyword參數,都有默認值

  • 最後一個參數爲name中命令的輸入參數

TARGETING

## Returners## Mine

相關文章
相關標籤/搜索