Saltstack自動化運維

Saltstack三大功能html

1,遠程執行python

2,配置管理(狀態)mysql

3,雲管理ios

 

四種運行方式:web

  Local            本地正則表達式

  Minion/Master   C/S sql

  Syndic       代理模式數據庫

  Salt SSHapache

 

安裝倉庫vim

yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm

安裝master和minion

 yum -y install salt-master salt-minion

 

客戶端安裝minion

 

不修改master配置文件就能夠先啓動master

systemctl start salt-master

 

修改minion配置文件

vim /etc/salt/minion

16行填寫master地址

103號配置ID(也能夠不配置默認使用主機名爲ID這裏我沒有配置)

啓動

systemctl start salt-minion

會在/etc/salt文件夾下面生成一個id文件就是主機名(不要隨意修改,由於啓動須要讀取minion_id,若是修改須要先把這個文件刪除而後在啓動的時候又自動生成)

修改兩個個客戶端的配置文件而後啓動(分別爲個人web服務器和ios服務器)

 

須要通過master認證之後才能使用

minion第一次啓動會生成一個pki目錄

pem是私鑰 pub爲公鑰

master下面也有一個pki文件夾

pre下是客戶端發送的ID可是尚未通過master的認證

能夠查看服務器端文件和客戶端文件的MD5來看是否是同一個文件

經過salt-key能夠查看key

贊成的 拒絕的 沒有贊成的

贊成

salt-key -A 贊成全部

贊成之後

同時在客戶端生成一個公鑰

minion_master.pub

實際上認證過程就是交換公鑰的過程,實現了加密通訊。

 

遠程執行

 salt '*' test.ping

這裏的ping不是發送ping包而是檢測客戶端是否通訊正常

 

批量執行建立文件夾的命令

salt '*' cmd.run 'mkdir /tmp/hehe'

 

配置管理

State 要寫一個文件格式 YAML 後綴

YAML:三板斧

  1,縮進

  兩個空格,不能使用Tab

  2,冒號

  表示層級關係的冒號後面沒有東西,表示鍵值的有一個空格

  key:value

  3,短橫線

  短橫線後面也有一個空格

  - list1

  - list2

 

設置master配置文件

vim /etc/salt/master

去掉這幾行的#

重啓master

systemctl restart salt-master

建立配置文件目錄

mkdir /srv/salt

在建立一個web配置文件目錄

mkdir web

進入這個web目錄建立一個配置文件apache.sls

apache-install:         #定義惟一標示
  pkg.installed:        #pkg是一個狀態模塊,installed是執行方法
    - names:
      - httpd
      - httpd-devel
apache-service:
  service.running:
    - name: httpd       #運行一個服務,服務名是httpd
    - enable: True      #開機自啓動

執行

salt '10-8-86-172' state.sls web.apache

在對應的客戶端目錄/var/cache/salt生成對應的文件,是master發送給minnon的

若是客戶端是centos就使用yum安裝若是是Ubuntu就使用apt-get自動安裝

執行完畢會在相應客戶端自動安裝apache而且啓動

PS:後面加test = True能夠先測試可是不執行

  注意編輯時候的空格,每一行的末尾也不能有空格和Tab

 

上面是手動執行一個模塊

slat有一個高級狀態

打開master配置文件(須要放在base下面)

vim /srv/salt/top.sls

base:
  '10-8-45-27':
    - web.apache
  '10-8-86-172':
    - web.apache

執行

salt '*' state.highstate

 

Saltstack與ZeroMQ

Saltstack使用4505 4506兩個端口4505用於消息的發佈

4506請求與響應

ZeroMQ不是一個傳統意義的消息隊列

默認salt-master進程顯示都是salt-master

安裝顯示進程的詳細信息的包

yum -y install python-setproctitle
systemctl restart salt-master
ps -ef|grep salt-master

經過進程已經創建好長鏈接了,因此執行速度快

 

SaltStack 數據系統

  Grains (穀粒)

  Pillar    (柱子)

 Grains:靜態數據 當Minion啓動時收集的Minion本地相關信息

     操做系統版本,內核版本,CPU,內存,硬盤,設備型號,序列號

     不重啓就不會變,因此叫靜態數據

  1,資產管理,信息查詢

  2,用於目標選擇

  3,配置管理中使用

 

查看其中一條服務器的grains信息

salt '10-8-45-27' grains.ls

salt '10-8-45-27' grains.items

查看全部機器的操做系統

salt '*' grains.item os

查看ip

salt '*' grains.item fqdn_ip4

查找出操做系統是CentOS的執行相應的命令,這樣就能夠作目標選擇

salt -G 'os:CentOs' test.ping

salt -G 'os:CentOs' cmd.run 'echo hehe'

 

若是列出的grains不夠用也能夠自定義grains

能夠修改客戶端的的vim /etc/salt/minion自定義grains

先不重啓,查看是沒有的

重啓之後再查找

重啓定義爲apache的apache

salt -G 'roles:apache' cmd.run 'systemcet restart httpd'

 

生產環境不建議寫在minion直接寫在

vim /etc/salt/grains

cloud: openstack

minion會自動找

 

grain在top裏面的用法

PS:這裏grain沒有s

 

開發一個Grains 在master下

  Python。寫一個Python腳本,返回一個字典就能夠了

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

def my_grains():
    #初始化一個grains字典
    grains = {}
    #設置字典中的key
    grains['iaas'] = 'openstack'
    grains['edu'] = 'oldboyedu'
    #返回這個字典
    return grains

  同步到minion

salt '*' saltutil.sync_grains

 在minion的/var/cache/salt

在master下面查看

Grains優先級:

  1,系統自帶

  2,Grains文件寫的

  3,minion配置文件

  4,本身寫的

 

PS:能夠不重啓salt-minion刷新更新grains命令是,salt '*' saltutil.sync_grains

 

Pillar:

  Pillar是動態的。給特定的Minion指定特定的數據。只有指定的minion本身能看到本身的數據(安全,好比定義用   戶密碼)

  和top file相似

 

顯示

salt '*' pillar.items

 

默認沒有顯示

設置成顯示

vim /etc/salt/master

systemctl restart salt-master

能夠查看了 是一個名稱爲master的字典

仍是註釋掉以避免影響自定義的pillar

 

修改master配置

重啓

systemctl restart salt-master

1,寫pillar sls

vim /srv/pillar/web/apache.sls

{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}

2,top file

vim /srv/pillar/top.sls

base:
  '10-8-86-172':
    - web.apache

刷新

salt '*' saltutil.refresh_pillar

查看

salt '*' pillar.items apache

PS:注意文件apache.sls和top.sls的位置

 

pillar使用場景

1,目標選擇

salt -I 'apache:httpd' test.ping

salt -I 'apache:httpd' cmd.run 'w'

 

Grains VS Pillar

 

     類型    數據採集方式    應用場景            定義位置

Grains   靜態    minion啓動時收集  數據查詢 目標選擇 配置管理    minion

Pillar  動態    master自定義    目標選擇 配置選擇 敏感數據    master

 

深刻學習saltstack遠程執行

 

salt '*' cmd.run 'w'

命令:salt

目標:'*'

模塊: cmd.run 自帶150+模塊。本身寫模塊

返回: 執行後結果返回,Returnners

 

目標:Targeting

  兩種:一種和minion ID有關

     一種和minion ID無關

1,Minion ID有關的方法

  minion ID

  通配符

  列表

        salt -L '10-8-86-172,10-8-45-27' cmd.run 'uptime'

  正則表達式

   salt -E '10-8*' test.ping

全部匹配目標的方式,均可以用到top file裏面來指定目標

 

主機名設置方案:

  1,IP地址

  2,根據業務來進行設置

 

按百分比執行

salt '*' -b 10 test.ping

 

模塊:

返回tcp連接

salt '*' network.active_tcp

獲取主機名

salt '*' network.get_hostname

取得全部在運行的服務

salt '*' service.get_all

取得對應服務的狀態

salt '*' service.status sshd

往全部機器上面拷貝文件

salt-cp '*' /etc/hosts /opt/hehe

查看top file

salt '*' state.show_top

單獨安裝一個服務

salt '*' state.single pkg.installed name=lsof

 

返回程序

ruturns

數據返回到muysql這個返回是minion直接返回給mysql的不是返回給master而後到mysql的

 

salt.returners.mysql

 

客戶端安裝MySQL-python  (python的MySQL庫)

salt '10-8-86-172' state.single pkg.installed name=MySQL-python

或者使用下面命令安裝

salt '10-8-86-172' cmd.run 'yum -y install MySQL-python'

 

master建立數據庫

create database `salt`  character set utf8  collate utf8_general_ci;

建立表

DROP TABLE IF EXISTS `jids`; CREATE TABLE `jids` ( `jid` varchar(255) NOT NULL, `load` mediumtext NOT NULL, UNIQUE KEY `jid` (`jid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE INDEX jid ON jids(jid) USING BTREE;


DROP TABLE IF EXISTS `salt_returns`; CREATE TABLE `salt_returns` ( `fun` varchar(50) NOT NULL, `jid` varchar(255) NOT NULL, `return` mediumtext NOT NULL, `id` varchar(255) NOT NULL, `success` varchar(10) NOT NULL, `full_ret` mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY `id` (`id`), KEY `jid` (`jid`), KEY `fun` (`fun`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `salt_events`; CREATE TABLE `salt_events` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `tag` varchar(255) NOT NULL, `data` mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `master_id` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `tag` (`tag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


受權
grant all on salt.* to salt@'%' identified by 'salt@pwd';


修改兩個minion的配置文件vim /etc/salt/minion
在尾部添加

mysql.host: '10.8.45.27'
mysql.user: 'salt'
mysql.pass: 'salt@pwd'
mysql.db: 'salt'
mysql.port: 3306

重啓minion

systemctl restart salt-minion

在minion看着日誌執行

先查看一下master的數據庫是空的

執行  '*' test.ping --return mysql 再來查看數據庫就有數據了

 

PS:返回程序是比較深刻的,或者基於saltstack作二次開發時候使用

參考文檔

https://www.unixhot.com/docs/saltstack/ref/returners/all/salt.returners.mysql.html#module-salt.returners.mysql

 

編寫狀態模塊

先看一個系統自帶模塊

vim /usr/lib/python2.7/site-packages/salt/modules/service.py

編寫模塊

1,放哪裏

在/srv/salt目錄下新建一個文件夾_modules

2,命名

vim _modules/my_disk.py

def list():
  cmd = 'df -h'
  ret = __salt__['cmd.run'](cmd)
  return ret

PS:是兩個下劃線

3,刷新

salt '*' saltutil.sync_modules

 

4,執行

salt '*' my_disk.list

 

相關文章
相關標籤/搜索