1.先了解下管理端(master)常用相關指令
1.1 salt #主要管理指令
指令格式:salt [options] <target> [arguments]
例:salt ‘*’ test.ping
1.2 salt-key #證書管理
1
2
3
4
5
<code> </code><code># salt-key –l #檢視所有minion-key</code>
<code> </code><code># salt-key –a <keys-name> #接受某個minion-key</code>
<code> </code><code># salt-key –d <keys-name> #删除某個minion-key</code>
<code> </code><code># salt-key –a #接受所有的minion-key</code>
<code> </code><code># salt-key –d #删除所有的minion-key</code>
1.3 salt-run #管理minion
<code> </code><code># salt-run manage.up #顯示目前活着的minion</code>
<code> </code><code># salt-run manage.down #顯示未存活的minion</code>
<code> </code><code># salt-run manage.status #顯示目前up和down 的minion </code>
<code> </code><code># salt-run manage.downremovekeys-true #顯示未存活的minion,并将其移除</code>
1.4 salt-cp #将master檔案複制到minion,不支援複制目錄
指令格式:salt-cp [options]<target> src dst
例:salt-cp '*'/root/test.sh /root/test.sh
1.5 salt-ssh
#通過ssh連接配接被管理端,被管理端不用安裝minion,管理端也不用安裝master,salt-ssh是一個獨立的包,安裝後即可使用saltstack大部分功能,沒有通訊機制zeromq,指令執行速度會下降。一般沒有用戶端沒有安裝minion時候才考慮先用salt-ssh批量安裝minion。
# apt-get install salt-ssh sshpass #salt-ssh用的sshpass進行密碼互動,必須要安裝
1.5.1 salt-ssh常用參數
-r,-raw-shell :執行shell指令
--key-deploy :配置keys
-i,-ignore-host-keys :當ssh連接配接時,忽略keys
-passwd :指定預設密碼
-roster-file :指定roster檔案
1.5.2 salt-ssh使用
1.5.2.1 sat-ssh通過調用roster配置檔案實作,是以先定義roster,讓salt-ssh生效,就可以執行操作了
6
7
<code> </code><code># vi /etc/salt/roster</code>
<code> </code><code>db:</code>
<code> </code><code>host: 192.168.18.212</code>
<code> </code><code>user: root</code>
<code> </code><code>passwd</code><code>: 123456</code>
<code> </code><code>port: 22</code>
<code> </code><code>timeout: 10</code>
1.5.2.1 測試
<code> </code><code># salt-ssh 'db' test.ping</code>
<code> </code><code>true</code>
1.5.2.3 執行shell指令及salt本身的子產品
#第一次運作時會提示是否接受秘鑰,如果不想再提示可以加入—key-deploy參數
<code> </code><code># salt-ssh 'db' -r 'uptime' </code>
<code> </code><code># salt-ssh 'db' disk.usage #調用salt本身的子產品</code>
<code> </code><code># salt-ssh 'db' grains.itemcpu_model #擷取grains資訊</code>
2、pillar
上節講過salt state,salt狀态系統的核心sls,也可叫做配置管理,sls描述了系統的目标狀态,由簡單的格式來包含這些資料。
pillar是salt最重要的系統之一,可用于提供開發接口,用于在master端定義資料,然後再minion中使用,一般傳輸敏感的資料,例如ssh key,加密證書等。
pillar和states建立方式類似,由sls檔案組成,有一個入口檔案top.sls,通過這個檔案關聯其他sls檔案,預設路徑在/srv/pillar,可通過/etc/salt/master裡面pillar_roots:指定位置。
pillar到底什麼作用呢?那麼下面介紹一個簡單的例子,你就明白了。
用zabbix監控新上架的伺服器(10台),需要将zabbix_agentd.conf分發到被監控主機,這個檔案中hostname的ip每台都不同,我們不可能寫10配置設定置檔案吧!那麼如何讓hostname在分發的時候就根據被監控主機ip,修改成自己的呢?這時就用到渲染了,預設渲染器是jinja,支援for in循環判斷,格式是{%...%}{% end* %},這樣一來salt會先讓jinja渲染,然後交給yaml處理。
2.1 建立pillar目錄和top.sls檔案
<code> </code><code># mkdir /srv/pillar</code>
<code> </code><code># vi /srv/pillar/top.sls</code>
<code> </code><code>base:</code>
<code> </code><code>'*'</code><code>:</code>
<code> </code><code>- ip</code>
2.2 先通過pillar擷取minion主機ip
<code> </code><code># vi /srv/pillar/ip.sls</code>
<code> </code><code>ip: {{ grains[</code><code>'ipv4'</code><code>][1] }}</code>
#寫完後,執行sls指令,可以看到已經擷取到ip
8
9
<code> </code><code># salt '*' pillar.item ip</code>
<code> </code><code>host2:</code>
<code> </code><code>----------</code>
<code> </code><code>ip:</code>
<code> </code><code>192.168.18.213</code>
<code> </code><code>host1:</code>
<code> </code><code>192.168.18.212</code>
2.3 随後寫個sate檔案,将檔案分發到minion上
<code> </code><code># mkdir /srv/salt/zabbix</code>
<code> </code><code># vi /srv/salt/zabbix/agentd_conf.sls</code>
<code> </code><code>zabbix:</code>
<code> </code><code>file</code><code>.managed:</code>
<code> </code><code>- </code><code>source</code><code>: salt:</code><code>//zabbix/zabbix_agentd</code><code>.conf</code>
<code> </code><code>- name: </code><code>/usr/local/zabbix/conf/zabbix_agentd</code><code>.conf</code>
<code> </code><code>- template: jinja</code>
<code> </code><code>- defaults:</code>
<code> </code><code>ip: {{ pillar[</code><code>'ip'</code><code>] }}</code>
2.4 修改zabbix_agentd.conf要渲染的ip
<code> </code><code># vi /srv/salt/zabbix/zabbix_agentd.conf</code>
<code> </code><code>logfile=</code><code>/tmp/zabbix_agentd</code><code>.log</code>
<code> </code><code>server=192.168.18.214</code>
<code> </code><code>serveractive=127.0.0.1</code>
<code> </code><code>hostname={{ ip }}</code>
2.5 執行單sls指令,不用将sls檔案關聯到top.sls檔案
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<code> </code><code># salt '*' state.sls zabbix.agentd_conf</code>
<code> </code><code>----------</code>
<code> </code><code>id: zabbix</code>
<code> </code><code>function: </code><code>file</code><code>.managed</code>
<code> </code><code>name:</code><code>/usr/local/zabbix/conf/zabbix_agentd</code><code>.conf</code>
<code> </code><code>result: true</code>
<code> </code><code>comment: file</code><code>/usr/local/zabbix/conf/zabbix_agentd</code><code>.conf is </code><code>in</code> <code>the correct state</code>
<code> </code><code>started: 11:48:35.261683</code>
<code> </code><code>duration: 139.733 ms</code>
<code> </code><code>changes: </code>
<code> </code>
<code> </code><code>summary</code>
<code> </code><code>------------</code>
<code> </code><code>succeeded: 1</code>
<code> </code><code>failed: 0</code>
<code> </code><code>total states run: 1 </code>
<code> </code><code>id: zabbix</code>
<code> </code><code>function: </code><code>file</code><code>.managed</code>
<code> </code><code>name:</code><code>/usr/local/zabbix/conf/zabbix_agentd</code><code>.conf</code>
<code> </code><code>result: true</code>
<code> </code><code>comment: file</code><code>/usr/local/zabbix/conf/zabbix_agentd</code><code>.conf is </code><code>in</code> <code>the correct state</code>
<code> </code><code>started: 11:31:41.906766</code>
<code> </code><code>duration: 141.928 ms</code>
<code> </code><code>changes: </code>
<code> </code><code>total states run: 1</code>
#這時再通過指令檢視,已經更新成功
<code> </code><code># salt '*' cmd.run 'cat/usr/local/zabbix/conf/zabbix_agentd.conf' </code>
<code> </code><code>logfile=</code><code>/tmp/zabbix_agentd</code><code>.log</code>
<code> </code><code>server=192.168.18.214</code>
<code> </code><code>serveractive=127.0.0.1</code>
<code> </code><code>hostname=192.168.18.212</code>
<code> </code><code>hostname=192.168.18.213</code>
pillar相關指令:
#重新整理pillar資料到minion
# salt "*" saltutil.refresh_pillar
#檢視所有pillar資訊
# salt "*" pillar.items
#檢視某個pillar資訊
# salt "*" pillar.item ip
既然grains與pillar類似,就說下差別:
1.grains是minion每次加載時擷取本地系統資訊資料,是靜态的,固定的,而pillar是動态加載資料,随時變化的,比grains更靈活。
2.grains資料存儲在minion本地,pillar存儲在master。