Event 事件組件
Salt 事件組件用于觸發(fā)事件止邮,使第三方應(yīng)用程序或外部進(jìn)程能夠?qū)?Salt 中的行為做出反應(yīng)。 事件系統(tǒng)使用發(fā)布 - 訂閱模式国瓮,或稱為 pub/sub些椒。
Event Bus - 事件總線
Event 系統(tǒng)由兩個主要組件組成播瞳,它們構(gòu)成了事件總線的概念:
事件套接字,用于發(fā)布事件
事件庫免糕,它可以偵聽事件并將事件發(fā)送到 Salt 系統(tǒng)
事件被發(fā)布到事件總線上赢乓,事件總線的訂閱者則偵聽已發(fā)布的事件。
事件總線既用于進(jìn)程間通信石窑,又用于 Salt 中的網(wǎng)絡(luò)傳輸牌芋。 通過 UNIX 域套接字(UDX)提供進(jìn)程間通信。
Salt Master 和每個 Salt Minion 都有自己的事件總線松逊。
監(jiān)測 salt 事件
Salt 提供了一個 runner 方法躺屁,可以在 Salt Master 收到它們時實時顯示出事件信息,命令如下:
salt-run state.event pretty=True
pretty=True 參數(shù)可以增加輸出的可讀性经宏。
注意楼咳,該命令會一直占用終端,當(dāng)它接收到事件信息的時候會打印出來烛恤。
事件信息的格式
Event 由兩個主要部分組成:
識別被觸發(fā)事件的標(biāo)記
包含有關(guān)事件詳細(xì)信息的數(shù)據(jù)
所有的 salt 事件都以 salt/ 為前綴,并根據(jù)事件類型添加其他級別余耽。 例如缚柏,作業(yè)事件的前綴為 salt/job/。 每個事件的部分都使用 / 分隔以提供簡單的命名空間碟贾。 這是標(biāo)識符币喧,被稱為事件標(biāo)簽轨域,并且通常包含特定的詳細(xì)信息,如 job ID 或 minion ID杀餐。
每個事件都包含一個時間戳以及對該特定事件唯一的其他鍵和值干发。 后期當(dāng)我們使用 Ractor 時,將學(xué)習(xí)如何使用事件標(biāo)簽和數(shù)據(jù)來定制響應(yīng)史翘。
除了內(nèi)置事件之外枉长,我們還可以在 Salt 系統(tǒng)中啟用一些其他事件,并生成自定義的事件琼讽。
發(fā)送測試事件
我們既可以在 minions 的本地總線上觸發(fā)事件必峰,也可以在 Salt Master 節(jié)點上觸發(fā)事件。
要從 minion 的命令行本地觸發(fā)一個本地的事件钻蹬,需要調(diào)用 event.fire 執(zhí)行函數(shù)吼蚁,格式如下:
salt-call event.fire '{"data": "message to be sent in the event"}' 'tag'
現(xiàn)在讓我們來發(fā)送一個測試事件,首先啟動事件監(jiān)聽问欠。
salt-run state.event pretty=True
新開一個終端肝匆,切換到 root 執(zhí)行:
salt-call event.fire '{"data": "message to be sent in the event"}' 'tag'
查看事件輸出。
我們可以看到顺献,事件已經(jīng)被捕獲旗国,同時也接收到事件傳遞進(jìn)來的數(shù)據(jù)。
要觸發(fā)一個從 minion 發(fā)送到 master 的事件滚澜,調(diào)用 event.send 執(zhí)行函數(shù)粗仓。 另外,可以在 CLI 的函數(shù)參數(shù)中使用 YAML设捐。
salt-call event.send 'myco/mytag/success' '{success: True, message: "It works!"}'
同樣可以看到事件監(jiān)控程序捕獲的事件及數(shù)據(jù)借浊。
On presence 事件
啟用 on presence 事件后,會導(dǎo)致 Salt Master 周期性地查找主動連接的 minions萝招。 在事件總線上以固定時間間隔顯示出 minions 的 on presence 狀態(tài)信息事件蚂斤,以及帶有新連接或斷開的 minions 列表信息的事件。
這需要在 Salt Master 的配置文件中啟動以下參數(shù)槐沼,默認(rèn)值為 False:
# /etc/salt/master 文件添加
presence_events: True
查看事件
salt/presence/present 由 salt master 周期性連接 minion 觸發(fā)曙蒸,所以執(zhí)行該命令后稍微等一段時間才能看到事件。
SALT STATE 執(zhí)行進(jìn)度事件
啟用 Salt 狀態(tài)執(zhí)行進(jìn)度事件會導(dǎo)致 Salt Minions 發(fā)送 State 狀態(tài)的進(jìn)度事件岗钩,Salt 狀態(tài)運行中執(zhí)行的每個函數(shù)在執(zhí)行完成后都會觸發(fā)此類事件纽窟。 進(jìn)度事件信息的格式是: salt/job//prog//.
該功能默認(rèn)未啟用,需要在 Salt Master 中修改以下參數(shù)來打開這個進(jìn)度事件信息的功能:
# /etc/salt/master 文件添加
state_events: True
測試方法兼吓,先建一個 sls 任務(wù)文件臂港,路徑 /etc/salt/srv/salt/base/state_event.sls 。
# 該 sls 文件用來安裝 redis 服務(wù),只為測試 fire_event
redis installed:
pkg.installed:
- name: redis-server
- fire_event: redis-server/已安裝
如果設(shè)置為 - fire_event: True审孽,就可以發(fā)送 state Event县袱,我們在文件里使用 redis-server/已安裝 指定了特定的事件字符串。
我們先開啟事件監(jiān)聽佑力,salt-run state.event pretty=True式散,然后在另一個終端執(zhí)行 salt '*' state.apply state_event,可以在監(jiān)聽終端開到執(zhí)行 state 完成后的事件打颤。
Grains 組件
Grains 是 SaltStack 收集的有關(guān)底層管理系統(tǒng)的靜態(tài)信息暴拄。 SaltStack 收集的 Grains 信息包括操作系統(tǒng)版本、域名瘸洛、IP 地址揍移、內(nèi)核、操作系統(tǒng)類型反肋、內(nèi)存以及許多其他系統(tǒng)屬性那伐。
我們可以將自定義的 grains 添加到 Salt Minion 的 /etc/salt/grains 文件中,或放置在 Grains 部分下的 Salt Minion 配置文件中石蔗。 例如罕邀,許多用戶為每個 Salt Minion 添加一個稱為角色的定制 grain 來描述系統(tǒng)的功能。
我們可以使用 grains.ls 命令來列出 Salt Minion 的所有 grains:
Salt 提供了一個接口养距,用于獲取被管理系統(tǒng)的有關(guān)信息诉探。 這被稱為 grains interface,因為它為 salt 提供 grains 信息棍厌。 Grains 信息涉及操作系統(tǒng)肾胯、域名、IP 地址耘纱、內(nèi)核敬肚、操作系統(tǒng)類型、內(nèi)存和許多其他系統(tǒng)屬性束析。
Salt 模塊和組件可以利用 grain 接口艳馒,以在正確的系統(tǒng)上自動地獲得正確的 salt minion 命令參數(shù)。
Grains 數(shù)據(jù)是相對靜態(tài)的员寇,但如果系統(tǒng)信息發(fā)生變化(例如弄慰,如果網(wǎng)絡(luò)設(shè)置發(fā)生變化),或者如果將新值分配給自定義 grain蝶锋,那么 grains 數(shù)據(jù)將會被刷新陆爽。
注意: Grains 被統(tǒng)一解析為小寫字母。 例如扳缕,F(xiàn)OO 和 foo 指的是同一個 grain墓陈。
salt '*' grains.ls
查看 grains 列表
查看 grains 具體數(shù)據(jù)
salt '*' grains.items
在 state 文件中使用 grains
在 sls 文件中使用 grains 時恶守,類似 {{ grains.id }}。
下面來看一個例子贡必,新建文件 /etc/salt/srv/salt/base/test_grains.sls
# 文件/etc/salt/srv/salt/base/test_grains.sls
echo 服務(wù)器ID:{{ grains.id }}: cmd.run
執(zhí)行:
salt '*' state.apply test_grains
自定義 Grains
新建文件: /etc/salt/grains
roles:
- webserver
- redis
- mysql
以上文件為該服務(wù)器添加 grains 數(shù)據(jù),名稱為 roles庸毫,對應(yīng)了一個包含三個元素的列表仔拟。
將 grains 數(shù)據(jù)同步。
salt '*' saltutil.refresh_modules
現(xiàn)在查看跟新后的 grains 數(shù)據(jù)飒赃。
salt '*' grains.item roles
在 top 文件中使用
創(chuàng)建文件:/etc/salt/srv/salt/base/top.sls
base:
'roles:mysql':
- match: grain
- mysql
新增文件:/etc/salt/srv/salt/base/mysql.sls
echo '這是一個安裝mysql的模塊': cmd.run
執(zhí)行命令:
salt '*' state.apply
可以看到利花,top.sls 文件中 roles.mysql 可以匹配到本機(jī)并且執(zhí)行了mysql.sls
Pillar
Pillar 是 Salt 的一個旨在提供可以分發(fā)給 minions 全局?jǐn)?shù)值的功能接口。 pillar 數(shù)據(jù)的管理方式與 Salt State 樹類似载佳。
pillar 數(shù)據(jù)是在 master 上編譯炒事,提供給指定 minion 的 pillar 數(shù)據(jù)只能由其在 pillar 配置中設(shè)定為目標(biāo)的 minion 訪問。 所以 pillar 可用于為特定 minion 存儲其特有的敏感數(shù)據(jù)蔫慧。
Salt Master 服務(wù)器維護(hù)一個 pillar_roots 設(shè)置挠乳,該設(shè)置與 Salt 文件服務(wù)器中使用的 file_roots 的結(jié)構(gòu)相匹配。 與 file_roots 類似姑躲,pillar_roots 選項將環(huán)境映射到目錄睡扬。 然后根據(jù) top file 文件中的匹配器將 pillar 數(shù)據(jù)映射到 minions,該 top file 文件使用與 state top file 文件相同的方式布局黍析。 Pillar 可以使用與標(biāo)準(zhǔn) top file 文件相同的匹配器類型卖怜。
Pillar 的典型使用場景有:
高度敏感的數(shù)據(jù): 通過 pillar 傳輸?shù)男畔⒈WC僅提供給目標(biāo)對象,使 Pillar 適合管理安全信息阐枣,如加密密鑰和密碼马靠。
Minion 配置: Minion 模塊,例如執(zhí)行模塊蔼两、狀態(tài)和 returners 之類的通乘可以通過存儲在 pillar 中的數(shù)據(jù)來配置。
使用變量: 需要分配給特定 minions 或 minions 組的變量可以在 pillar 中定義宪哩,然后在 sls 公式和模板文件中訪問娩贷。
任意數(shù)據(jù): Pillar 可以包含字典格式的任何基本數(shù)據(jù)結(jié)構(gòu),因此可以定義一組 鍵/值 存儲锁孟,然后在 sls 公式中輕松迭代它彬祖。
查看 pillar 數(shù)據(jù)
salt '*' pillar.items
設(shè)置 pillar_roots 路徑
修改文件 /etc/salt/master
pillar_roots:
base:
- /etc/salt/srv/pillar
修改完 master 配置文件需要重啟 master
pkill salt-master
salt-master -d -l info
創(chuàng)建對應(yīng)的文件夾,mkdir /etc/salt/srv/pillar品抽,salt 將從該路徑讀取 pillar 數(shù)據(jù)储笑。
Pillar 系統(tǒng)的自定義變量和數(shù)據(jù)
Salt Pillar 是使 Salt state 可重復(fù)使用的必不可少的成分, 所以我們需要先從寫 Salt state 的狀態(tài)文件來設(shè)置它。
Salt Pillar 使用 top file 文件將 Salt Pillar 數(shù)據(jù)與 Salt Minions 配對圆恤。top file 的寫法與 salt state 非常像突倍。
top file 作為 pillar 的入口文件,salt 從該文件加載 pillar 的數(shù)據(jù)。我們現(xiàn)在創(chuàng)建該文件羽历,路徑 /etc/salt/srv/pillar/top.sls焊虏。
base:
"*":
- users
該文件表示所有 minions 主機(jī)都會使用 users 這個 pillar 數(shù)據(jù)。
新建 /etc/salt/srv/pillar/users 目錄秕磷,并創(chuàng)建文件 /etc/salt/srv/pillar/users/init.sls 文件诵闭,內(nèi)容如下:
users:
user1: 1011
user2: 1012
user3: 1013
該文件定義了一個 名字為 users 的數(shù)據(jù)字典,包含 3 個 user澎嚣,該文件與 /etc/salt/srv/pillar/users.sls 等同疏尿,pillar 組件會查找 引用組件.sls 和 引用組件/init.sls 導(dǎo)入數(shù)據(jù)。
當(dāng) Salt Pillar 數(shù)據(jù)更新時, 每個 Salt Minions 都與 top.sls 文件中列出的目標(biāo)匹配易桃。當(dāng)一個 Salt Minion 與目標(biāo)匹配上時, 它會接受在該目標(biāo)下方列表中定義的所有 Salt Pillar SLS 文件褥琐。
使用如下命令更新 pillar 數(shù)據(jù):
salt '*' saltutil.refresh_pillar
現(xiàn)在查看下 pillar 數(shù)據(jù):
salt '*' pillar.items
最后,我們使用這個數(shù)據(jù)晤郑。
新建 state 文件敌呈,路徑文件 /etc/salt/srv/salt/base/users.sls,內(nèi)容如下
{% for user, uid in pillar.get('users', {}).items() %}
{{user}}:
user.present:
- uid: {{uid}}
{% endfor %}
這個 state 文件通過 pillar.get 獲取 pillar 數(shù)據(jù)贩汉,使用 for 循環(huán)驱富,調(diào)用 user.present 模塊創(chuàng)建了 3 個用戶,并指定的用戶 uid匹舞。具體 state 用法我們會專門講到褐鸥。
現(xiàn)在我們執(zhí)行這個 state。
salt '*' state.apply users
pillar 其他寫法
可以在 state 狀態(tài)文件中訪問 pillar 數(shù)據(jù)赐稽,以定制每個 minion 的行為叫榕。適用于每個 minion 的所有 pillar(和 grain)數(shù)據(jù),在運行之前通過模板替換為最終可執(zhí)行的 state 狀態(tài)文件姊舵。比較典型的用途包括設(shè)置適合 minion 的配置目錄和跳過不適用的 states 狀態(tài)晰绎。
新建文件 /etc/salt/srv/pillar/pkgs.sls
pkgs:
{% if grains['os_family'] == 'RedHat' %}
apache: httpd
{% elif grains['os_family'] == 'Debian' %}
apache: apache2
{% elif grains['os'] == 'Arch' %}
apache: apache
{% endif %}
如上面文件,我們定義了一個名為 pkgs 的變量括丁,里面又包含了一個 apache 的變量荞下,但在不同操作系統(tǒng)下,其對應(yīng)的值是不一樣的史飞。
現(xiàn)在修改 /etc/salt/srv/pillar/top.sls尖昏,將我們新定義的 pkg 變量包含到 top 文件中。
base:
'*':
- users
- pkgs
同樣构资,我們新建一個使用 pkgs 變量的 state 文件抽诉。
文件名 /etc/salt/srv/salt/base/apache.sls
apache:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
上面的 state 文件要求安裝一個 pkg 包,軟件包名使用 pillar 數(shù)據(jù)吐绵。
現(xiàn)在刷新 pillar 數(shù)據(jù)
salt '*' saltutil.refresh_pillar
執(zhí)行 apache state 文件任務(wù)
salt '*' state.apply apache
如圖迹淌,我們看到河绽,salt 已經(jīng)通過系統(tǒng)識別到 apache 對應(yīng)的軟件包名稱為 apache2。