1. 程式人生 > >Linux學習總結(七十三)自動化運維之saltstack

Linux學習總結(七十三)自動化運維之saltstack

配置文件 創建 運維工具 shell腳本 就是 數據庫 同步 service 方便

1 認識自動化運維

傳統運維效率低,大多工作人為完成
傳統運維工作繁瑣,容易出錯
傳統運維每日重復做相同的事情
傳統運維沒有標準化流程
傳統運維的腳本繁多,不能方便管理
自動化運維就是要解決上面所有問題

2 常見自動化運維工具

Puppet (www.puppetlabs.com)基於rubby開發,c/s架構,支持多平臺,可管理配置文件、用戶、cron任務、軟件包、系統服務等。 分為社區版(免費)和企業版(收費),企業版支持圖形化配置。
Saltstack(官網 https://saltstack.com,文檔docs.saltstack.com )基於python開發,c/s架構,支持多平臺,比puppet輕量,在遠程執行命令時非常快捷,配置和使用比puppet容易,能實現puppet幾乎所有的功能。

Ansible (www.ansible.com )更加簡潔的自動化運維工具,不需要在客戶端上安裝agent,基於python開發。可以實現批量操作系統配置、批量程序的部署、批量運行命令。

3 saltstack 安裝

saltstack介紹https://docs.saltstack.com/en/latest/topics/index.html
可以使用salt-ssh遠程執行,類似ansible,
也支持c/s模式,下面我們將講述該種模式的使用,需要準備兩臺機器
226.129為服務端,226.130為客戶端
設置hostname以及hosts,lvlinux-1,lvlinux-2

hostnamectl set-hostname lvlinux-1
vim /etc/hosts
192.168.226.129 lvlinux-1
192.168.226.130 lvlinux-2

兩臺機器上都要做
兩臺機器全部安裝saltstack yum源
yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
129上執行 yum install -y salt-master salt-minion
130上執行 yum install -y salt-minion
啟動salt相關服務
129上編輯配置文件
vi /etc/salt/minion //增加
master: lvlinux-1
啟動服務systemctl start salt-master; systemctl start salt-minion


130上編輯配置文件
vi /etc/salt/minion //增加
master: lvlinux-1
啟動服務systemctl start salt-minion
服務端監聽4505和4506兩個端口,4505為消息發布的端口,4506為和客戶端通信的端口

4saltstack 配置認證

master端和minion端通信需要建立一個安全通道,傳輸過程需要加密,所以得配置認證,也是通過密鑰對來加密解密的
minion在第一次啟動時會在/etc/salt/pki/minion/下生成minion.pem和minion.pub,其中.pub為公鑰,它會把公鑰傳輸給master
master第一次啟動時也會在/etc/salt/pki/master下生成密鑰對,當master接收到minion傳過來的公鑰後,通過salt-key工具接受這個公鑰,一旦接受後就會在/etc/salt/pki/master/minions/目錄裏存放剛剛接受的公鑰,同時客戶端也會接受master傳過去的公鑰,把它放在/etc/salt/pki/minion目錄下,並命名為minion_master.pub
以上過程需要借助salt-key工具來實現
執行如下命令 salt-key -a lvlinux-2// -a後面跟主機名,可以認證指定主機
salt-key -a lvlinux-2
salt-key 命令用法

 -a  後面跟主機名,認證指定主機
 -A 認證所有主機
 -r  跟主機名,拒絕指定主機
 -R  拒絕所有主機
 -d 跟主機名,刪除指定主機認證
 -D 刪除全部主機認證
 -y 省略掉交互,相當於直接按了y

5 saltstack 遠程執行命令

salt ‘*‘ test.ping //這裏的表示所有已經簽名的minion端,也可以指定一個
salt ‘lvlinux-1‘ test.ping
`salt ‘
‘ cmd.run "hostname"`
說明: 這裏的*必須是在master上已經被接受過認證的客戶端,可以通過salt-key查到,通常是我們已經設定的id值。關於這部分內容,它支持通配、列表以及正則。 比如兩臺客戶端aming-01,aming-02, 那我們可以寫成salt ‘aming-*‘, salt ‘aming-0[12]‘ salt -L ‘aming-01,aming-02‘ salt -E ‘aming-(01|02)‘等形式,使用列表,即多個機器用逗號分隔,而且需要加-L,使用正則必須要帶-E選項。 它還支持grains,加-G選項,pillar 加-I選項,下面會介紹到。

6 saltstack - grains

grains是在minion啟動時收集到的一些信息,比如操作系統類型、網卡ip、內核版本、cpu架構等。
salt ‘lvlinux-2‘ grains.ls列出所有的grains項目名字
salt ‘lvlinux-2‘ grains.items 列出所有grains項目以及值
grains的信息並不是動態的,並不會實時變更,它是在minion啟動時收集到的。
我們可以根據grains收集到的一些信息,做配置管理工作。
grains支持自定義信息。
自定義grains
minion上:
vim /etc/salt/grains //添加:

role: nginx 
env: test

重啟minion服務
systemctl restart salt-minion
master上:
獲取grains:
salt ‘*‘ grains.item role env
可以借助grains的一些屬性信息來執行
salt -G role:nginx cmd.run ‘hostname‘
備註:
在minion端自定義grains, 以key-vlaue的形式,可以將處理動作歸類。針對不同的minion端就可以定義不同的key-value,從而在master端執行命令時,區分不同類型的minion端。比如,我們要在web類服務器安裝nginx,在DB類服務器安裝數據庫。就可以做一下區分。在上面例子中,role為key,nginx 為value。中間以冒號,空格作為分割。

7 saltstack – pillar

pillar和grains不一樣,是在master上定義的,並且是針對minion定義的一些信息。像一些比較重要的數據(密碼)可以存在pillar裏,還可以定義變量等。
配置自定義pillar
vim /etc/salt/master
找到如下配置://去掉前面的井號

pillar_roots:
  base: #此行前面有兩個空格
    - /srv/pillar #此行前面有4個空格

mkdir /srv/pillar
vim /srv/pillar/test.sls //內容如下
conf: /etc/123.conf
vi /srv/pillar/top.sls //內容如下

base:
  ‘lvinux-2‘: #此行前面有兩個空格
    - test #此行前面有4個空格

重啟master
systemctl restart salt-master
當更改完pillar配置文件後,我們可以通過刷新pillar配置來獲取新的pillar狀態:
salt ‘*‘ saltutil.refresh_pillar
驗證:salt ‘*‘ pillar.item conf
pillar同樣可以用來作為salt的匹配對象。比如 salt -I ‘conf:/etc/123.conf‘ test.ping
備註:這次我們在master上定義,它的核心也跟grains相同,也是以key-value形式可以對批處理進行分類。首先我們在master配置文件中打開自定義pillar 的項目入口。其中/srv/pillar就是文件載入路徑。以後的自定義都放在該路徑下。用以上例子來說明的話,我們首先要定義我們的具體應用文件,
test.sls. 其中conf為key值,/etc/123.conf 為value值,該路徑文件暫時沒有實際含義。僅作為一個名稱。接下來我們還要定義應用的入口文件,top.sls 該文件以base 開頭,定義了要操作的主機,還有要調用的應用文件名稱。

8 saltstack – 安裝配置httpd

master上 vi /etc/salt/master //搜索找到file_roots
打開如下內容的註釋:

file_roots:
  base: #前面有兩個空格
    - /srv/salt #前面有4個空格

mkdir /srv/salt ; cd /srv/salt
vi /srv/salt/top.sls //加入如下內容

base:
  ‘*‘:  #前面有兩個空格
    - httpd #前面有4個空格

意思是,在所有的客戶端上執行httpd模塊
重啟 systemctl restart salt-master
master上vi /srv/salt/httpd.sls //加入如下內容,這個就是httpd模塊的內容

httpd-service:
  pkg.installed:
    - names:    //這裏如果只有一個服務,那麽就可以寫成 –name: httpd 不用再換一行了。
      - httpd
      - httpd-devel
  service.running:
    - name: httpd
    - enable: True

說明: httpd-service是id的名字,自定義的。pkg.installed 為包安裝函數,下面是要安裝的包的名字。service.running也是一個函數,來保證指定的服務啟動,enable表示開機啟動。層級結構之間依次縮進兩個空格
執行: salt ‘lvlinux-2‘ state.highstate//執行過程會比較慢,因為客戶端上在yum install httpd httpd-devel
備註:以上內容整體框架跟pillar用法相似,因為它同樣是針對master操作,也是在master配置文件中打開應用入口file_roots,再創建接引文件top.sls ,下來創建應用文件httpd.sls.不過這次應用文件httpd.sls中調用了兩個功能模塊,pkg.installed 和 service.running

9 saltstack – 配置管理文件

master上vi /srv/salt/test.sls //加入如下內容

file_test:
  file.managed:
    - name: /tmp/lvlinux.com
    - source: salt://test/123/1.txt
    - user: root
    - group: root
    - mode: 600

說明:第一行的file_test為自定的名字,表示該配置段的名字,可以在別的配置段中引用它,source指定文件從哪裏拷貝,這裏的salt://test/123/1.txt相當於是/srv/salt/test/123/1.txt
mkdir /srv/salt/test/123
cp /etc/passwd /srv/salt/test/123/1.txt
vi /srv/salt/top.sls//改為如下內容

base:
  ‘*‘:
    - test

執行: salt ‘lvlinux-2‘ state.highstate
檢查lvlinux-2上是否有/tmp/lvlinux.com,檢查內容以及權限
備註:簡單來說以上實現了文件的批量分發,類似於用rsync做循環同步的shell腳本。

10 saltstack – 配置管理目錄

master上vi /srv/salt/test_dir.sls //加入如下內容

file_dir:
  file.recurse:
    - name: /tmp/testdir
    - source: salt://test/123
    - user: root
    - file_mode: 640
    - dir_mode: 750
    - mkdir: True
    - clean: True 

//加上最後一句之後,源刪除文件或目錄,目標也會跟著刪除,否則不會刪除
修改top.sls, vi /srv/salt/top.sls //改為如下內容

base:
  ‘*‘:
    - test_dir 

執行: salt ‘lvlinux-2‘ state.highstate
檢查lvlinux-2上是否有/tmp/testdir,檢查裏面的目錄、文件以及權限
說明:這裏有一個問題,如果source對應的目錄裏有空目錄的話,客戶端上不會創建該目錄

11 saltstack – 配置管理遠程命令

master上vi /srv/salt/shell_test.sls //加入如下內容

shell_test:
  cmd.script:
    - source: salt://test/1.sh
    - user: root

vi /srv/salt/test/1.sh //加入如下內容

#!/bin/bash
touch /tmp/111.txt 
if [ ! -d /tmp/1233 ]
then
    mkdir /tmp/1233
fi

更改top.sls內容

base:
  ‘*‘:
    - shell_test

執行: salt ‘lvlinux-2‘ state.highstate
檢查是否有/tmp/111.txt和/tmp/1233
備註:就是關聯shell腳本,實現命令的封裝。

12 saltstack – 配置管理任務計劃

master上vi /srv/salt/cron_test.sls //加入如下內容

cron_test:
  cron.present:
    - name: /bin/touch /tmp/111.txt
    - user: root
    - minute: ‘*‘
    - hour: 20
    - daymonth: ‘*‘
    - month: ‘*‘
    - dayweek: ‘*‘

註意,*需要用單引號引起來。當然我們還可以使用file.managed模塊來管理cron,因為系統的cron都是以配置文件的形式存在的。想要刪除該cron,需要增加

cron.absent:
  - name: /bin/touch /tmp/111.txt

兩者不能共存,要想刪除一個cron,那之前的present就得去掉。
更改top.sls

base:
  ‘*‘:
    - cron_test

執行: salt ‘lvlinux-2‘ state.highstate
到lvinux-2上檢查cron,會看到提示# Lines below here are managed by Salt, do not edit
我們不能隨意改動它,否則就沒法刪除或者修改這個cron了。
crontab -l

13saltstack – 其它可能會用到的命令

cp.get_file 拷貝master上的文件到客戶端
salt ‘*‘ cp.get_file salt://test/1.txt /tmp/123.txt
cp.get_dir 拷貝目錄
salt ‘*‘ cp.get_dir salt://test/conf /tmp/ //會自動在客戶端創建conf目錄,所以後面不要加conf,如果寫成 /tmp/conf/ 則會在/tmp/conf/目錄下又創建conf
salt-run manage.up 顯示存活的minion
salt ‘*‘ cmd.script salt://test/1.sh 命令行下執行master上的shell腳本

14 salt-ssh 使用

salt-ssh不需要對客戶端做認證,客戶端也不用安裝salt-minion,它類似pssh/expect
安裝很簡單yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum install -y salt-ssh
vi /etc/salt/roster //增加如下內容

lvlinux-1:
  host: 192.168.226.129
  user: root
  passwd: lvlinux
lvinux-2:
  host: 192.168.226.130
  user: root
  passwd: lvlinux

salt-ssh --key-deploy ‘*‘ -r ‘w‘//第一次執行的時候會自動把本機的公鑰放到對方機器上,然後就可以把roster裏面的密碼去掉,該命令就是用秘鑰認證遠程登陸到機器,根據roster文件裏定義的主機,依次執行w命令返回結果。

Linux學習總結(七十三)自動化運維之saltstack