saltstack之Salt文件服務器與salt-cp以及cp模塊


在配置管理系統中,從中心服務器向客戶端推送文件是基本需求。SaltStack使用內建的ZeroMQ服務器作為文件服務器。文件服務器主要用於在state系統中將SLS文件推送到客戶端,當然也可以用於其他文件的傳輸。 
  運維工作中,經常會有文件同步的情況。我在日常工作中,由於權限限制,只能自己寫程序分發文件。我使用的是Python+paramiko+threading+Queue,paramiko用於遠程執行命令或者分發文件,threading+Queue實現並發分發文件(如果是串行的話,效率十分低下)。最近研究SaltStack時,發現有兩種方法可以做到文件分發,第一只是使用SaltStack命令:salt-cp;第二種是使用SaltStack提供的:Salt文件服務器,這兩種方法都可以實現文件分發的功能。

參考官網文檔:https://docs.saltstack.com/en/latest/ref/cli/salt-cp.html

一、 salt-cp  

1. salt-cp簡述

  salt-cp命令用於復制一個文件到多個minion系統中。指定minion可以使用通配符、正則表達式、Grains等方法

salt-cp '*' [ options ] SOURCE DEST salt-cp -E '.*' [ options ] SOURCE DEST salt-cp -G 'os:CentOS*' [ options ] SOURCE DEST
  • minion匹配 
       -E 目標選擇;表示以正則表達式匹配minion 
      -G 目標選擇表示使用minion上的Salt Graings系統的返回值來匹配特定minion 
      -L 目標minion別解析成用逗號分隔的列表

2. salt-cp 用例

  • 將irq.py 文件 發送到 OS為CentOS的minion的 /usr/local目錄下

salt-cp -G ‘os:centos’ irq.py /usr/local/

返回值:{‘192.168.1.223’: {‘/usr/local/irq.py’: True}} 表示成功

  • 將salt.doc文件發送到所有的minion的/usr/local目錄下

salt-cp ‘*’ salt.doc /usr/local/

返回值:{‘192.168.1.223’: {‘/usr/local/salt.doc’: True}} 表示成功

salt-cp -L ‘192.168.1.223’ install.log /usr/local/

返回{‘192.168.1.223’: {‘/usr/local/install.log’: True}} 表示成功

二、Salt 文件服務器

  Salt內置了一個簡單的文件服務器用於分發文件給Salt minions。

1. 文件服務器的base環境

  由於文件服務器是為Salt state system工作的,所以文件服務器也是支持環境的概念的。 
  Salt文件服務器/etc/salt/master配置文件中的flie_roots選項管理。Salt文件服務器的默認環境為為base環境,base環境必須定義,因為當環境沒有明確指定時,文件下載就是從base環境中去找的。其配置如下:

file_roots:
  base:
    - /srv/salt/base - /srv/salt/failover

/srv/salt/base和/srv/salt/failover這些目錄是不存在,需要手動創建。這里還需要說明的是下載文件時的搜索順序。文件服務器在給minions傳輸文件時,是有搜索順序的。這里用上述配置說明:如果文件URL為:salt://httpd/httpd.conf。那么傳輸文件時,首先搜索/srv/salt/base/httpd/httpd.conf,如果找到了,則下載;否則就使用/srv/salt/failover/httpd/httpd.conf

2. 文件服務器多環境配置

  多環境配置也是更改master配置達成,如下:

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

在這個配置中,處了base環境外。還有dev環境和prod環境。配置文件修改后,需要重啟master才能生效。

3. cp模塊

  cp模塊被用於用於Salt state system、salt-cp命令(如上所述)以及可用於Salt文件服務器。

3.1 cp.get_fle

  cp.get_file用於minion從master下載一個文件,語法:

  • 文件在base環境下 

    salt ‘*’ cp.get_file salt://testfile /root/testfile

該命令表示minion從master端下載文件並拷貝到到/root/testfile文件中。注意:salt://表示的base環境。因此,testfille是位於base環境下——即/srv/salt/base目錄中。

  • 文件在base環境的多級目錄下

salt ‘*’ cp.get_file salt://httpd/httpd.conf /root/httpd.conf

salt://httpd/httpd.conf表示* /srv/salt/base/httpd/httpf.conf*

  • 實例
[root@master httpd]# salt '*' cp.get_file salt://httpd/httpd.conf /root 192.168.1.223: The minion function caused an exception: Traceback (most recent call last): File "/usr/lib/python2.6/site-packages/salt/minion.py", line 1412, in _thread_return return_data = executor.execute() File "/usr/lib/python2.6/site-packages/salt/executors/direct_call.py", line 28, in execute return self.func(*self.args, **self.kwargs) File "/usr/lib/python2.6/site-packages/salt/modules/cp.py", line 227, in get_file gzip) File "/usr/lib/python2.6/site-packages/salt/fileclient.py", line 1112, in get_file fn_ = salt.utils.fopen(dest, 'wb+') File "/usr/lib/python2.6/site-packages/salt/utils/__init__.py", line 1288, in fopen fhandle = open(*args, **kwargs) IOError: [Errno 21] Is a directory: '/root' [root@master httpd]# salt '*' cp.get_file salt://httpd/httpd.conf /root/httpd.conf 192.168.1.223: /root/httpd.conf

這里注意下,根據報錯可以發現:目標路徑必須是一個文件,而不是目錄。這點有區別去salt-cp命令。 
- cp.get_file gzip格式 
  對於大文件傳輸,cp.get_file支持gzip壓縮格式。因為gzip是CPU密集型的工具,因此cp.get_file開啟gzip是適用於高壓縮率的情況下,如JSON或者YAML文件。 
  語法:

salt ‘*’ cp.get_file salt://httpd/httpd.conf /root/httpd.conf gzip=5

gzip后的數字表示壓縮比,范圍在1-9之間,1表示最小壓縮比,9為最大壓縮比。換句話說,gzip=1情況下, 消耗的CPU小;gzip=9時,消耗的CPU則更多。

  • cp.get_file makedirs=True 
       注意,也就是時候,cp.get_file過程中,如果目錄不存在,cp.get_file是不會主動創建目錄的,如果要做到這點,可以使用makedirs=True 參數。測試如下:
[root@master httpd]# salt '*' cp.get_file salt://httpd/httpd.conf /root/test/httpd.conf 192.168.1.223: False [root@master httpd]# salt '*' cp.get_file salt://httpd/httpd.conf /root/test/httpd.conf makedirs=True 192.168.1.223: /root/test/httpd.conf

3.2 cp.get_dir

  顧名思義,cp.get_dir就是下載目錄,用法基本同cp.get_file一直。直接舉個例子吧

  • 將master端的httpd目錄下載到minion端的/root目錄下
[root@master ~]# salt '*' cp.get_dir salt://httpd /root 192.168.1.223: - /root/httpd/httpd.conf

3.3 cp.push

  cp.push 模塊允許minion上傳文件到master端。注意事項: 
- cp.push功能默認不開啟,需要修改配置文件中的file_recv 環境,默認為False 
- 上傳的文件存放在master端的 /var/cache/salt/master/minions//files/ 目錄下

修改master配置文件並重啟。
file_recv: True
以上傳httpd.conf為例
[root@logan ~]# salt '192.168.159.241' cp.push /etc/httpd/conf/httpd.conf 192.168.159.241: True # 查看文件 [root@logan conf]# pwd /var/cache/salt/master/minions/192.168.159.241/files/etc/httpd/conf [root@logan conf]# ls httpd.conf

三、利用Salt API分發文件

In [10]: import salt.client In [11]: local = salt.client.LocalClient() In [12]: local.cmd('*', 'cp.get_file', ['salt://httpd/httpd.conf', '/root/aaaaaaa']) Out[12]: {'192.168.1.223': '/root/aaaaaaa'}

寫運維管理平台時,要做一個文件分發的功能,因此就用到了Salt的文件服務器以及cp模塊來做,再調用下Salt開放的API,達到的效果也是十分理想的。當然,前提是要把文件准備在特定的目錄下,這點只要自己做一個規范,也是很好管理的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM