傳統運維效率低,大多工做人爲完成
傳統運維工做繁瑣,容易出錯
傳統運維每日重複作相同的事情
傳統運維沒有標準化流程
傳統運維的腳本繁多,不能方便管理
自動化運維就是要解決上面全部問題html
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開發。能夠實現批量操做系統配置、批量程序的部署、批量運行命令。python
saltstack介紹https://docs.saltstack.com/en/latest/topics/index.html
可使用salt-ssh遠程執行,相似ansible,
也支持c/s模式,下面咱們將講述該種模式的使用,須要準備兩臺機器
226.129爲服務端,226.130爲客戶端
設置hostname以及hosts,lvlinux-1,lvlinux-2linux
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爲和客戶端通訊的端口nginx
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 命令用法web
-a 後面跟主機名,認證指定主機 -A 認證全部主機 -r 跟主機名,拒絕指定主機 -R 拒絕全部主機 -d 跟主機名,刪除指定主機認證 -D 刪除所有主機認證 -y 省略掉交互,至關於直接按了y
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選項,下面會介紹到。shell
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。中間以冒號,空格做爲分割。vim
pillar和grains不同,是在master上定義的,而且是針對minion定義的一些信息。像一些比較重要的數據(密碼)能夠存在pillar裏,還能夠定義變量等。
配置自定義pillarvim /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
//內容以下bash
base: 'lvinux-2': #此行前面有兩個空格 - test #此行前面有4個空格
重啓mastersystemctl 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 開頭,定義了要操做的主機,還有要調用的應用文件名稱。
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
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.txtmkdir /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腳本。
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對應的目錄裏有空目錄的話,客戶端上不會建立該目錄
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腳本,實現命令的封裝。
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
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/目錄下又建立confsalt-run manage.up
顯示存活的minionsalt '*' cmd.script salt://test/1.sh
命令行下執行master上的shell腳本
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命令返回結果。