通過 SaltStack 管理伺服器配置

1 贊 回覆發表於2015-02-22

我在搜尋Puppet的替代品時,偶然間碰到了Salt。我喜歡puppet,但是我又愛上Salt了:)。我發現Salt在配置和使用上都要比Puppet簡單,當然這只是一家之言,你大可不必介懷。另外一個愛上Salt的理由是,它可以讓你從命令列管理伺服器配置,比如:

要通過Salt來更新所有伺服器,你只需執行以下命令即可

salt '*' pkg.upgrade

安裝SaltStack到Linux上

如果你是在CentOS 6/7上安裝的話,那麼Salt可以通過EPEL倉庫獲取到。而對於Pi和Ubuntu Linux使用者,你可以從這裡新增Salt倉庫。Salt是基於python的,所以你也可以使用‘pip’來安裝,但是你得用yum-utils或是其它包管理器來自己處理它的依賴關係。

Salt採用伺服器-客戶端模式,伺服器端稱為領主,而客戶端則稱為下屬。

安裝並配置Salt領主

[root@salt-master~]# yum install salt-master

Salt配置檔案位於/etc/salt和/srv/salt。Salt雖然可以開箱即用,但我還是建議你將日誌配置得更詳細點,以方便日後排除故障。

[root@salt-master ~]# vim /etc/salt/master
# 預設是warning,修改如下
log_level: debug
log_level_logfile: debug

[root@salt-master ~]# systemctl start salt-master

安裝並配置Salt下屬

[root@salt-minion~]#yum install salt-minion

# 新增你的Salt領主的主機名
[root@salt-minion~]#vim /etc/salt/minion
master: salt-master.com
# 啟動下屬
[root@salt-minion~] systemctl start salt-minion

在啟動時,下屬客戶機會生成一個金鑰和一個id。然後,它會連線到Salt領主伺服器並驗證自己的身份。Salt領主伺服器在允許下屬客戶機下載配置之前,必須接受下屬的金鑰。

在Salt領主伺服器上列出並接受金鑰

# 列出所有金鑰
[root@salt-master~] salt-key -L
Accepted Keys:
Unaccepted Keys:
minion.com
Rejected Keys:

# 使用id 'minion.com'命令接受金鑰
[root@salt-master~]salt-key -a minion.com

[root@salt-master~] salt-key -L
Accepted Keys:
minion.com
Unaccepted Keys:
Rejected Keys:

在接受下屬客戶機的金鑰後,你可以使用‘salt’命令來立即獲取資訊。

Salt命令列例項

# 檢查下屬是否啟動並執行
[root@salt-master~]  salt 'minion.com' test.ping
minion.com:
    True
# 在下屬客戶機上執行shell命令
 [root@salt-master~]#  salt 'minion.com' cmd.run 'ls -l'
minion.com:
    total 2988
    -rw-r--r--. 1 root root 1024 Jul 31 08:24 1g.img
    -rw-------. 1 root root     940 Jul 14 15:04 anaconda-ks.cfg
    -rw-r--r--. 1 root root 1024  Aug 14 17:21 test
# 安裝/更新所有伺服器上的軟體
[root@salt-master ~]# salt '*' pkg.install git

salt命令需要一些元件來傳送資訊,其中之一是下屬客戶機的id,而另一個是下屬客戶機上要呼叫的函式。

在第一個例項中,我使用‘test’模組的‘ping’函式來檢查系統是否啟動。該函式並不是真的實施一次ping,它僅僅是在下屬客戶機作出回應時返回‘真’。

‘cmd.run’用於執行遠端命令,而‘pkg’模組包含了包管理的函式。本文結尾提供了全部內建模組的列表。

顆粒例項

Salt使用一個名為顆粒(Grains)的介面來獲取系統資訊。你可以使用顆粒在指定屬性的系統上執行命令。

[root@vps4544 ~]# salt -G 'os:Centos' test.ping
minion:
    True

更多顆粒例項,請訪問http://docs.saltstack.com/en/latest/topics/targeting/grains.html

通過狀態檔案系統進行包管理

為了使軟體配置自動化,你需要使用狀態系統,並建立狀態檔案。這些檔案使用YAML格式和python字典、列表、字串以及編號來構成資料結構。將這些檔案從頭到尾研讀一遍,這將有助於你更好地理解它的配置。

VIM狀態檔案例項

[root@salt-master~]# vim /srv/salt/vim.sls
vim-enhanced:
  pkg.installed
/etc/vimrc:
  file.managed:
    - source: salt://vimrc
    - user: root
    - group: root
    - mode: 644

該檔案的第一和第三行稱為狀態id,它們必須包含有需要管理的包或檔案的確切名稱或路徑。在狀態id之後是狀態和函式宣告,‘pkg’和‘file’是狀態宣告,而‘installed’和‘managed’是函式宣告。函式接受引數,使用者、組、模式和源都是函式‘managed’的引數。

要將該配置應用到下屬客戶端,請移動你的‘vimrc’檔案到‘/src/salt’,然後執行以下命令。

[root@salt-master~]# salt 'minion.com' state.sls vim
minion.com:
----------
          ID: vim-enhanced
    Function: pkg.installed
      Result: True
     Comment: The following packages were installed/updated: vim-enhanced.
     Started: 09:36:23.438571
    Duration: 94045.954 ms
     Changes:
              ----------
              vim-enhanced:
                  ----------
                  new:
                      7.4.160-1.el7
                  old:


Summary
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1

你也可以新增依賴關係到你的配置中。

[root@salt-master~]# vim /srv/salt/ssh.sls
openssh-server:
  pkg.installed


/etc/ssh/sshd_config:
  file.managed:
    - user: root
    - group: root
    - mode: 600
    - source: salt://ssh/sshd_config

sshd:
  service.running:
    - require:
      - pkg: openssh-server

這裡的‘require’宣告是必須的,它在‘service’和‘pkg’狀態之間建立依賴關係。該宣告將首先檢查包是否安裝,然後執行服務。

但是,我更偏向於使用‘watch’宣告,因為它也可以檢查檔案是否修改和重啟服務。

[root@salt-master~]# vim /srv/salt/ssh.sls
openssh-server:
  pkg.installed


/etc/ssh/sshd_config:
  file.managed:
    - user: root
    - group: root
    - mode: 600
    - source: salt://sshd_config

sshd:
  service.running:
    - watch:
      - pkg: openssh-server
      - file: /etc/ssh/sshd_config

[root@vps4544 ssh]# salt 'minion.com' state.sls ssh
seven.leog.in:
     Changes:
----------
          ID: openssh-server
    Function: pkg.installed
      Result: True
     Comment: Package openssh-server is already installed.
     Started: 13:01:55.824367
    Duration: 1.156 ms
     Changes:
----------
          ID: /etc/ssh/sshd_config
    Function: file.managed
      Result: True
     Comment: File /etc/ssh/sshd_config updated
     Started: 13:01:55.825731
    Duration: 334.539 ms
     Changes:
              ----------
              diff:
                  ---
                  +++
                  @@ -14,7 +14,7 @@
                   # SELinux about this change.
                   # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
                   #
                  -Port 22
                  +Port 422
                   #AddressFamily any
                   #ListenAddress 0.0.0.0
                   #ListenAddress ::

----------
          ID: sshd
    Function: service.running
      Result: True
     Comment: Service restarted
     Started: 13:01:56.473121
    Duration: 407.214 ms
     Changes:
              ----------
              sshd:
                  True

Summary
------------
Succeeded: 4 (changed=2)
Failed:    0
------------
Total states run:     4

在單一目錄中維護所有的配置檔案是一項複雜的大工程,因此,你可以建立子目錄並在其中新增配置檔案init.sls檔案。

[root@salt-master~]# mkdir /srv/salt/ssh
[root@salt-master~]# vim /srv/salt/ssh/init.sls
openssh-server:
  pkg.installed

/etc/ssh/sshd_config:
  file.managed:
    - user: root
    - group: root
    - mode: 600
    - source: salt://ssh/sshd_config

sshd:
  service.running:
    - watch:
      - pkg: openssh-server
      - file: /etc/ssh/sshd_config

[root@vps4544 ssh]# cp /etc/ssh/sshd_config /srv/salt/ssh/
[root@vps4544 ssh]# salt 'minion.com' state.sls ssh

Top檔案和環境

top檔案(top.sls)是用來定義你的環境的檔案,它允許你對映下屬客戶機到包,預設環境是‘base’。你需要定義在基本環境下,哪個包會被安裝到哪臺伺服器。

如果對於一臺特定的下屬客戶機而言,有多個環境,並且有多於一個的定義,那麼預設情況下,基本環境將取代其它環境。

要定義環境,你需要將它新增到領主配置檔案的‘file_roots’指標。

[root@salt-master ~]# vim /etc/salt/master
file_roots:
  base:
    - /srv/salt
  dev:
    - /srv/salt/dev

現在,新增一個top.sls檔案到/src/salt。

[root@salt-master ~]# vim /srv/salt/top.sls
base:
  '*':
    - vim
  'minion.com':
     - ssh

應用top檔案配置

[root@salt-master~]# salt '*' state.highstate
minion.com:
----------
          ID: vim-enhanced
    Function: pkg.installed
      Result: True
     Comment: Package vim-enhanced is already installed.
     Started: 13:10:55
    Duration: 1678.779 ms
     Changes:
----------
          ID: openssh-server
    Function: pkg.installed
      Result: True
     Comment: Package openssh-server is already installed.
     Started: 13:10:55.
    Duration: 2.156 ms

下屬客戶機將下載top檔案並搜尋用於它的配置,領主伺服器也會將配置應用到所有下屬客戶機。


這僅僅是一個Salt的簡明教程,如果你想要深入學習並理解,你可以訪問下面的連結。如果你已經在使用Salt,那麼請告訴我你的建議和意見吧。

更新: Foreman 已經通過外掛支援salt。

閱讀連結

顆粒

Salt和Puppet的充分比較

內建執行模組的完全列表


via: http://techarena51.com/index.php/getting-started-with-saltstack/

作者:Leo G 譯者:GOLinux 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章