天天看點

Linux系統運維之saltstack 自動化運維管理saltstack簡介saltstack通信機制saltstack安裝與配置saltstack遠端執行了解YAML文法配置管理grains與pillar詳解Jinja模闆Job管理salt-ssh與salt-syndic

saltstack簡介

saltstack是一個配置管理系統,能夠維護預定義狀态的遠端節點。

saltstack是一個分布式遠端執行系統,用來在遠端節點上執行指令和查詢資料。

saltstack是運維人員提高工作效率、規範業務配置與操作的利器。

Salt的核心功能

使指令發送到遠端系統是并行的而不是串行的

使用安全加密的協定

使用最小最快的網絡載荷

提供簡單的程式設計接口

Salt同樣引入了更加細緻化的領域控制系統來遠端執行,使得系統成為目标不止可以通過主機名,還可以通過系統屬性。

saltstack通信機制

SaltStack 采用 C/S模式,minion與master之間通過ZeroMQ消息隊列通信,預設監聽4505端口。

Linux系統運維之saltstack 自動化運維管理saltstack簡介saltstack通信機制saltstack安裝與配置saltstack遠端執行了解YAML文法配置管理grains與pillar詳解Jinja模闆Job管理salt-ssh與salt-syndic

Salt Master運作的第二個網絡服務就是ZeroMQ REP系統,預設監聽4506端口。

Linux系統運維之saltstack 自動化運維管理saltstack簡介saltstack通信機制saltstack安裝與配置saltstack遠端執行了解YAML文法配置管理grains與pillar詳解Jinja模闆Job管理salt-ssh與salt-syndic

saltstack安裝與配置

官網:https://www.saltstack.com/

設定官方YUM倉庫:

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

master端設定:

#yum install -y salt-master #安裝master端

#systemctl enable salt-master #設定master自啟動

#systemctl start salt-master #啟動master服務

minion端配置:

#yum install -y salt-minion #安裝minion端

#vim /etc/salt/minion

master: 172.25.0.1 #設定master主機的ip

#systemctl enable salt-minion

#systemctl start salt-minion

master端執行指令允許minion連接配接:

插圖:

master端測試與minion端的連接配接

插圖:

saltstack遠端執行

遠端執行shell指令

Salt指令由三個主要部分構成:

salt ‘’ [arguments]

target: 指定哪些minion, 預設的規則是使用glob比對minion id.

#salt ‘*’ test.ping

Targets也可以使用正規表達式:

#salt -E ‘server[1-3]’ test.ping

Targets也可以指定清單:

#salt -L ‘server2,server3’ test.ping

funcation是module提供的功能,Salt内置了大量有效的functions.

#salt '*' cmd.run 'uname -a'
arguments通過空格來界定參數:
#salt 'server2' sys.doc pkg			#檢視子產品文檔
#salt 'server2' pkg.install httpd
#salt 'server2' pkg.remove httpd
           

salt内置的執行子產品清單:

http://docs.saltstack.cn/ref/modules/all/index.html

編寫遠端執行子產品

編輯master配置檔案:

vim /etc/salt/master

file_roots:
  base:
    - /srv/salt
           

重新開機master服務:

systemctl restart salt-master

建立子產品目錄:

#mkdir /srv/salt/_modules

編寫子產品檔案:

vim /srv/salt/_modules/mydisk.py

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

同步子產品:

salt server2 saltutil.sync_modules

運作子產品:

#salt server2 mydisk.df

插圖:

了解YAML文法

規則一: 縮進

Salt需要每個縮進級别由兩個空格組成,不要使用tabs。

規則二: 冒号

字典的keys在YAML中的表現形式是一個以冒号結尾的字元串。

my_key: my_value

規則三: 短橫杠

想要表示清單項,使用一個短橫杠加一個空格。

  • list_value_one
  • list_value_two

配置管理

建立一個sls檔案:

#vim /srv/salt/apache.sls

httpd: # ID聲明

pkg: # 狀态聲明

- installed # 函數聲明

指定主機執行:

#salt server2 state.sls apache

準備Top檔案:

#vim /srv/salt/top.sls

base:

'*':
    - apache
           

批量執行:

#salt ‘*’ state.highstate

Salt 狀态系統的核心是SLS,或者叫SaLt State 檔案。

SLS表示系統将會是什麼樣的一種狀态,而且是以一種很簡單的格式來包含這些資料,常被叫做配置管理。

sls檔案命名:

sls檔案以”.sls”字尾結尾,但在調用是不用寫此字尾。

使用子目錄來做組織是個很好的選擇。

init.sls 在一個子目錄裡面表示引導檔案,也就表示子目錄本身, 是以

apache/init.sls

就是表示

apache

.

如果同時存在apache.sls 和 apache/init.sls,則 apache/init.sls 被忽略,apache.sls将被用來表示 apache.

grains與pillar詳解

grains簡介

Grains是SaltStack的一個元件,存放在SaltStack的minion端。
           

當salt-minion啟動時會把收集到的資料靜态存放在Grains當中,隻有當 minion重新開機時才會進行資料的更新。

由于grains是靜态資料,是以不推薦經常去修改它。

應用場景:

資訊查詢,可用作CMDB。

在target中使用,比對minion。

在state系統中使用,配置管理子產品。

資訊查詢

用于查詢minion端的IP、FQDN等資訊。

預設可用的grains:

#salt ‘*’ grains.ls

插圖:

檢視每一項的值:

salt ‘*’ grains.items

插圖:

取單項的值:

#salt server3 grains.item ipv4

#salt server3 grains.item fqdn

自定義grains項

在/etc/salt/minion中定義:

#vim /etc/salt/minion

grains:

roles:

- apache

- httpd

重新開機salt-minion,否則資料不會更新:

#systemctl restart salt-minion

在/etc/salt/grains中定義:

#vim /etc/salt/grains:

deployment: datacenter1

同步資料:

#salt server3 saltutil.sync_grains

查詢自定義項:

#salt server3 grains.item deployment

編寫grains子產品

在salt-master端建立_grains目錄:

#mkdir /srv/salt/_grains

#vim /srv/salt/_grains/my_grain.py

def my_grain():
    grains = {}
    grains['roles'] = 'nginx'
    grains['hello'] = 'world'
    return grains
           

#salt ‘*’ saltutil.sync_grains #同步grains到minion端

grains比對運用

在target中比對minion:

#salt -G roles:apache cmd.run hostname

在top檔案中比對:

#vim /srv/salt/top.sls

base:
  'roles:apache':
    - match: grain
    - apache.install


           

pillar簡介

pillar和grains一樣也是一個資料系統,但是應用場景不同。

pillar是将資訊動态的存放在master端,主要存放私密、敏感資訊(如使用者名密碼等),而且可以指定某一個minion才可以看到對應的資訊。

pillar更加适合在配置管理中運用。

聲明pillar

定義pillar基礎目錄:

#vim /etc/salt/master

pillar_roots:

base:

- /srv/pillar

#mkdir /srv/pillar

重新開機salt-master服務:

#/etc/init.d/salt-master restart

#vim /srv/pillar/top.sls

base:
  '*':
    - packages
           

#vim /srv/pillar/apache.sls

{% if grains['fqdn'] == 'server3' %}
package: httpd
{% elif grains['fqdn'] == 'server2' %}
package: mairadb
{% endif %}
           

重新整理pillar資料:

#salt ‘’ saltutil.refresh_pillar

查詢pillar資料:

#salt '’ pillar.items

#salt ‘*’ grains.item roles

指令行中比對:

#salt -I ‘roles:apache’ test.ping

state系統中使用:

#vim /srv/salt/apache.sls

apache:
  pkg.installed:
    - name: {{ pillar['package'] }}
    - 
           

Jinja模闆

Jinja模闆簡介

Jinja是一種基于python的模闆引擎,在SLS檔案裡可以直接使用jinja模闆來做一些操作。

通過jinja模闆可以為不同伺服器定義各自的變量。

兩種分隔符: {% … %} 和 {{ … }},前者用于執行諸如 for 循環 或指派的語句,後者把表達式的結果列印到模闆上。

Jinja模闆使用方式

Jinja最基本的用法是使用控制結構包裝條件:

#vim /srv/salt/test.sls

/mnt/testfile:

file.append:

{% if grains['fqdn'] == 'server2' %}
    - text: server2
    {% elif grains['fqdn'] == 'server3' %}
    - text: server3
    {% endif %}
           

Jinja在普通檔案的使用:

#vim /srv/salt/apache.sls

/etc/httpd/conf/httpd.conf:
  file.managed:
  - source: salt://httpd.conf
  - template: jinja
  - context:
    bind: 172.25.2.2
           

import方式,可在state檔案之間共享:

定義變量檔案:

#vim lib.sls

{% set port = 80 %}

導入模闆檔案:

#vim httpd.conf

{% from ‘lib.sls’ import port %}

Listen {{ prot }}

引用變量

直接引用grains變量:

直接引用pillar變量:

在state檔案中引用:

- template: jinja
    - context:
      bind: {{ pillar['ip'] }}
           

Job管理

Job簡介

master在下發指令任務時,會附帶上産生的jid。

minion在接收到指令開始執行時,會在本地的/var/cache/salt/minion/proc目錄下産生該jid命名的檔案,用于在執行過程中master檢視目前任務的執行情況。

指令執行完畢将結果傳送給master後,删除該臨時檔案。

Job cache

Job緩存預設儲存24小時:

vim /etc/salt/master

keep_jobs: 24

master端Job緩存目錄:

/var/cache/salt/master/jobs

把Job存儲到資料庫

Linux系統運維之saltstack 自動化運維管理saltstack簡介saltstack通信機制saltstack安裝與配置saltstack遠端執行了解YAML文法配置管理grains與pillar詳解Jinja模闆Job管理salt-ssh與salt-syndic

修改master端配置:

#vim /etc/salt/master
master_job_cache: mysql
mysql.host: 'localhost'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'


           

重新開機salt-master服務:

安裝mysql資料庫:

執行資料庫初始化腳本:

導入資料模闆:

在這裡插入代碼片
           

#mysql -p < salt.sql

建立資料庫授權:

salt.sql模闆内容:

CREATE DATABASE  `salt`
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;
USE `salt`;
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;

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;

           

Job管理

檢視所有minion目前正在運作的jobs(在所有minions上運作saltutil.running)

salt-run jobs.active
           

列出目前master jobs cache中所有job

salt-run jobs.list_jobs
           

從master jobs cache中查詢指定jid的運作結果

salt-ssh與salt-syndic

salt-ssh簡介

salt-ssh可以獨立運作的,不需要minion端。

salt-ssh 用的是sshpass進行密碼互動的。

以串行模式工作,性能下降。

安裝salt-ssh:

salt-ssh配置

配置roster檔案,預設的本地路徑是 /etc/salt/roster:

server2:

host: 172.25.2.2
user: root
           

測試:

#salt-ssh ‘*’ test.ping -i //詢問密碼加 -i

#vim ~/.ssh/config

StrictHostKeyChecking no
           

salt-syndic簡介

如果大家知道zabbix proxy的話那就很容易了解了,syndic其實就是個代理,隔離master與minion。

Syndic必須要運作在master上,再連接配接到另一個topmaster上。

Topmaster 下發的狀态需要通過syndic來傳遞給下級master,minion傳遞給master的資料也是由syndic傳遞給topmaster。

topmaster并不知道有多少個minion。

syndic與topmaster的file_roots和pillar_roots的目錄要保持一緻。

salt-syndic配置

Linux系統運維之saltstack 自動化運維管理saltstack簡介saltstack通信機制saltstack安裝與配置saltstack遠端執行了解YAML文法配置管理grains與pillar詳解Jinja模闆Job管理salt-ssh與salt-syndic

topmaster端:

#vim /etc/salt/master

order_masters: True	
           
#作為頂級master
           

#systemctl start salt-master

#salt-key -L #檢視下級master的連接配接授權

#salt-key -A

下級master端:

#yum install -y salt-syndic

#vim /etc/salt/master

#systemctl restart salt-master

#systemctl start salt-syndic

salt-api配置

salt-ssh可以獨立運作的,不需要minion端。

salt-ssh 用的是sshpass進行密碼互動的。

以串行模式工作,性能下降。

安裝salt-ssh:

#yum install -y salt-ssh

salt-api簡介

SaltStack 官方提供有REST API格式的 salt-api 項目,将使Salt與第三方系統內建變得尤為簡單。

官方提供了三種api子產品:

rest_cherrypy
rest_tornado
rest_wsgi
           

官方連結:https://docs.saltstack.com/en/latest/ref/netapi/all/index.html#all-netapi-modules

salt-api配置

安裝salt-api:

#yum install -y salt-api python-cherrypy

生成證書:

#cd /etc/pki/tls/private

#openssl genrsa 2048 > localhost.key

#cd /etc/pki/tls/certs

#make testcert //根據提示填寫相關資訊即可

建立使用者認證檔案:

#useradd -s /sbin/nologin saltapi

#echo westos | passwd --stdin saltapi

#vim /etc/salt/master.d/eauth.conf

external_auth:
  pam:
    saltapi:
      - .*
      - '@wheel'
      - '@runner'
           

激活rest_cherrypy子產品:

#vim /etc/salt/master.d/api.conf

rest_cherrypy:

host: 172.25.2.1
  port: 8000
  ssl_crt: /etc/pki/tls/certs/localhost.crt
  ssl_key: /etc/pki/tls/private/localhost.key
           

重新開機服務:

#systemctl restart salt-master

#systemctl start salt-api

擷取認證token:

#curl -sSk https://172.25.2.1:8000/login \

-H 'Accept: application/x-yaml' \
    -d username=saltapi \
    -d password=westos \
    -d eauth=pam
           

推送任務:

#curl -sSk https://172.25.0.1:8000 \

-H 'Accept: application/x-yaml' \
    -H 'X-Auth-Token: 77e2b1de04b0dbc0a4bf11900712b83e4fa2c241'\
    -d client=local \
    -d tgt='*' \
    -d fun=test.ping
           

token值是上面指令擷取的toekn值。