目錄
一、Grains靜態數據組件
Grains是saltstack的組件,用於收集salt-minion在啓動時候的信息,又稱爲靜態信息。
Grains是服務器的一系列粒子信息,也就是服務器的一系列物理,軟件環境信息。在執行salt的sls時候可以根據Grains信息的不同對服務器進行匹配分組,例如可以根據系統是centos服務器跟系統是redhat環境的安裝不同的軟件包。
Grains功能:1.收集資產信息 2.信息查詢
官方文檔:https://docs.saltstack.com/en/getstarted/overview.html
#Grains查詢信息
[root@linux-node1 ~]# salt '*' grains.items #查看所有grains的key和values
[root@linux-node1 ~]# salt '*' grains.get saltversion #查看salt的版本
linux-node2.example.com:
2016.11.8
linux-node1.example.com:
2016.11.8
[root@linux-node1 ~]# salt '*' grains.get ip4_interface #查看ip
[root@linux-node1 ~]# salt '*' grains.get ip4_interface:eth0
#Grains目標匹配
grains可以用於進行目標匹配,比如讓所有的centos系統進行某個操作。使用salt -G
#(1)對os系統爲centos系統執行一個uptime的命令:
[root@linux-node1 ~]# salt -G 'os:Centos' cmd.run 'uptime' #查看負載
linux-node2.example.com:
14:17:06 up 13 days, 8:51, 2 users, load average: 0.00, 0.01, 0.05
linux-node1.example.com:
14:17:06 up 22 days, 8:23, 2 users, load average: 0.01, 0.02, 0.05
#(2)在init爲systemd的系統上執行查看負載:
[root@linux-node1 ~]# salt -G 'init:systemd' cmd.run 'uptime'
linux-node1.example.com:
14:21:00 up 22 days, 8:27, 2 users, load average: 0.00, 0.01, 0.05
linux-node2.example.com:
14:21:00 up 13 days, 8:55, 2 users, load average: 0.00, 0.01, 0.05
#Grains在top file中進行匹配
#在top.sls中定義對系統是CentOS的服務之星web.apached定義的狀態信息
[root@linux-node1 ~]# vim /srv/salt/base/top.sls
base:
'os:CentOS':
- match: grain
- web.apache
[root@linux-node1 ~]# salt '*' state.highstate
linux-node2.example.com:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 14:28:57.612549
Duration: 2490.712 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 14:29:00.104396
Duration: 41.901 ms
Changes:
Summary for linux-node2.example.com
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 2.533 s
linux-node1.example.com:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 14:29:12.061257
Duration: 11458.788 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 14:29:23.520720
Duration: 46.868 ms
Changes:
Summary for linux-node1.example.com
#Grains自定義
Grains的四種存在形式:
①Core grains.
②在 /etc/salt/grains 自定義grains。
③在 /etc/salt/minion 自定義grains。
④在 _grains 目錄自定義grain,同步到minions。
#生產環境使用自定義一個grains
[root@linux-node1 ~]# vim /etc/salt/grains
test-grains: linux-node2 #冒號後面有空格
[root@linux-node1 ~]# systemctl restart salt-minion
[root@linux-node1 ~]# salt '*' grains.get test-grains
linux-node1.example.com:
linux-node2
linux-node2.example.com:
[root@linux-node1 ~]# vim /etc/salt/grains
test-grains: linux-node2
hehe: haha
[root@linux-node1 ~]# salt '*' saltutil.sync_grains
[root@linux-node1 ~]# salt '*' grains.get hehe
linux-node1.example.com:
haha
linux-node2.example.com:
二、Pillar動態參數組件
Pillar是Salt最重要的系統之一,它跟grains的結構一樣,也是一個字典格式,數據通過key/value的格式進行存儲。在Salt的設計中,Pillar使用獨立的加密sessiion。可用於提供開發接口,用於在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處理。
#如何定義Pillar數據
- a.master配置文件中定義pillar:
默認情況下,master配置文件中的所有數據都添加到Pillar中,且對所有minion可用。如果要禁用這一默認值,可以在master配置文件中添加如下數據,重啓服務後生效:
#默認的pillar的items爲空,需要修改/etc/salt/master
[root@linux-node1 ~]# salt '*' pillar.items
linux-node1.example.com:
----------
linux-node2.example.com:
----------
[root@linux-node1 ~]# vim /etc/salt/master
#pillar_opts: False 打開該項,修改成True
pillar_opts: True
[root@linux-node1 ~]# systemctl restart salt-master
[root@linux-node1 ~]# salt '*' pillar.items
- b.使用SLS文件定義Pillar
Pillar使用與State相似的SLS文件。Pillar文件放在master配置文件中pillar_roots定義的目錄下。示例如下:
[root@linux-node1 ~]# vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar/base
prod:
- /srv/pillar/prod
#此段代碼定義了base環境下的Pillar文件保存在/srv/pillar/base目錄下。prod環境下的Pillar文件保存在/srv/pillar/prod下。
[root@linux-node1 ~]# mkdir -p /srv/pillar/{base,prod}
[root@linux-node1 ~]# tree /srv/pillar/
/srv/pillar/
├── base
└── prod
[root@linux-node1 ~]# systemctl restart salt-master
#創建base環境下的pillar文件爲apache
[root@linux-node1 ~]# vim /srv/pillar/base/apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
#與State相似,Pillar也有top file,也使用相同的匹配方式將數據應用到minion上。示例如下:
[root@linux-node1 ~]# vim /srv/pillar/base/top.sls
base:
'*':
- apache
[root@linux-node1 ~]# salt '*' pillar.items
linux-node1.example.com:
----------
apache:
httpd
linux-node2.example.com:
----------
apache:
httpd
#在base環境下,引用pillar
[root@linux-node1 ~]# vim /srv/salt/base/web/apache.sls
apache-install:
pkg.installed:
- name: {{ pillar['apache'] }}
apache-service:
service.running:
- name: {{ pillar['apache'] }}
- enable: True
[root@linux-node1 ~]# salt '*' state.highstate
linux-node2.example.com:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 15:15:13.424547
Duration: 940.333 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 15:15:14.366780
Duration: 55.706 ms
Changes:
Summary for linux-node2.example.com
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 996.039 ms
linux-node1.example.com:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 15:15:14.648492
Duration: 8242.769 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 15:15:22.891907
Duration: 42.651 ms
Changes:
Summary for linux-node1.example.com
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 8.285 s
總結:
1.pillar和狀態一樣,有pillar_roots,在master中配置
2.到配置的地方/srv/pillar/base下寫一個apache.sls
3.pillar必須在top file指定才能使用,在top.sls中指定所有的minion,都需要執行在base環境下的apache.sls
4.用之前查看是否能獲取到pillar值:salt '*' pillar.items
5.更改狀態配置,把name改爲一個pillar的引用,這是一個jinja的語法
#Grains VS Pillar
名稱 | 存儲位置 | 類型 | 採集方式 | 場景 |
---|---|---|---|---|
Grains | minion | 靜態 | minion啓動時,可以刷新 | 1.獲取信息 2.匹配 |
Pillar | master | 動態 | 指定,實時生效 | 1.匹配 2.敏感數據配置 |
三、jinja模板引擎
#簡介
#Jinja是基於python的模板引擎,在saltstack中我們使用yaml_jinja渲染器來根據模板生產對應的配置文件,對於不同的操作系統或者不同的情況通過jinja可以讓配置文件或者操作形成一種模板的編寫方式。
#jinja就是一個配置文件定義變量,然後根據minion的某些特性不同,調用變量得到不同的效果
#步驟:
1.File狀態使用template參數 - template: jiaja
2.模板文件裏面使用{{名稱}}
3.File狀態模塊要指定變量列表:
- default:
PORT: 8080
#根據系統區別安裝不同數據庫
#例如通過grains先獲取節點不同的操作系統分類,然後判斷,從而
在不同系統節點上安裝不同版本數據庫,db爲變量
[root@linux-node1 apache]# salt '*' grains.get os
linux-node2.example.com:
CentOS6
linux-node1.example.com:
CentOS7
{% if grains['os'] == 'CentOS6' %}
db: mysql
{% elif grains['os'] == 'Debian' %}
db: mariadb
{% endif %}
[root@server2 init]# cat mysql-install.sls
mysql:
pkg.installed:
- name: {{ pillar['db']}}