下文的案例是根據上一篇文章進行的修改。所以請優先讀取上一章博文內容《Saltstack_使用指南11_配置管理-狀態之間依賴關係》php
1 [root@salt100 ~]# salt --version 2 salt 2018.3.3 (Oxygen) 3 [root@salt100 ~]# salt-minion --version 4 salt-minion 2018.3.3 (Oxygen)
https://docs.saltstack.com/en/latest/topics/jinja/index.html
1 http://docs.jinkan.org/docs/jinja2/ 2 http://docs.jinkan.org/docs/jinja2/templates.html
修改了master或者minion的配置文件,那麼必須重啓對應的服務。html
1 # 注意有空格 2 這裏有兩種分隔符: {% ... %} 和 {{ ... }} 。前者用於執行諸如 for 循環 或賦值的語句,後者把表達式的結果打印到模板上。 3 {# ... #} 爲註釋語法
1 3步走: 2 1、告訴File模塊,你要使用jinja 3 - template: jinja 4 2、列出參數列表 5 - defaults: 6 HttpPort: 88 7 3、模板引用 8 {{ HttpPort }} 9 10 模板裏面支持:salt 遠程執行、grains 和 pillar 進行賦值
對上一章案例內容進行改造。web
添加 jinja 信息。apache
添加了 jinja 的好處:vim
一、 能夠把 mariadb.sls 也規整到 init.sls;架構
二、 這樣就是一個 SLS 文件對外,而不是多個 SLS;app
三、 在執行 SLS 的時候,直接總體/分批執行,而不是選定某個或某些 minion 執行;不須要指定 minion 目標,減小人爲出錯的可能性;測試
四、 後期維護方便ui
可參見:《Saltstack_使用指南05_數據系統-Pillar》spa
1 [root@salt100 pillar]# pwd 2 /srv/pillar 3 [root@salt100 pillar]# cat top.sls 4 base: 5 '*': 6 - web_pillar.service_appoint 7 8 # 下面的跟本章節無關,能夠無論 9 # 使用通配符 10 'salt0*': 11 - web_pillar.apache 12 - web_pillar.user # 引用 13 # 指定具體minion 14 'salt03': 15 - web_pillar.apache 16 - web_pillar.user # 引用 17 [root@salt100 pillar]# cat web_pillar/service_appoint.sls # pillar 的 SLS 18 {% if (grains['ip4_interfaces']['eth0'][0] == '172.16.1.11' and grains['host'] == 'salt01') 19 or (grains['ip4_interfaces']['eth0'][0] == '172.16.1.12' and grains['host'] == 'salt02') 20 or (grains['ip4_interfaces']['eth0'][0] == '172.16.1.13' and grains['host'] == 'salt03') 21 %} 22 # 註釋信息 須要頂格書寫 23 service_appoint: www 24 {% elif grains['ip4_interfaces']['eth0'][0] == '172.16.1.100' %} 25 service_appoint: mariadb 26 {% endif %}
使 pillar 生效
1 [root@salt100 pillar]# salt '*' saltutil.refresh_pillar # 刷新 2 [root@salt100 pillar]# salt '*' pillar.item service_appoint # 查看 pillar 中 service_appoint 的信息 3 salt03: 4 ---------- 5 service_appoint: 6 www 7 salt02: 8 ---------- 9 service_appoint: 10 www 11 salt100: 12 ---------- 13 service_appoint: 14 mariadb 15 salt01: 16 ---------- 17 service_appoint: 18 www
1 [root@salt100 file]# pwd 2 /srv/salt/lamp2/file 3 [root@salt100 file]# vim httpd.conf 4 # Listen 80 5 # 下面的是本次修改的部分 ★★★★★ 6 Listen {{ HttpPort }} 7 ……………… 8 # If your host doesn't have a registered DNS name, enter its IP address here. 9 # 10 #ServerName www.example.com:80 11 # 下面的是本次修改的部分 ★★★★★ 12 # 格式 ServerName 本機內網IP:Port 13 # 這樣的話,在 apache.sls 文件中就不用寫規則獲取 minion的內網IP了, 14 # 由於在狀態執行的時候,就會根據下文的 grains 規則獲得對應 minion 的內網IP 15 # ServerName {{ grains['ip4_interfaces']['eth0'][0] }}:{{ HttpPort }} 16 17 # 這裏是一個變量,如此的話,在 apache.sls 中須要寫規則獲取 minion 的內網IP 18 # 優先這種寫法,後期改變時,直接改 sls 文件便可。而不用改變該配置文件 19 ServerName {{ LocalInnerIP }}:{{ HttpPort }} 20 21 # 「#」 註釋,只是針對 httpd 服務,對於 jinja 仍然是可用的 ★★★★★ 22 # salt 模塊 支持 23 # hw_addr_eth0={{ HwAddr_eth0 }} 24 # grains 支持 25 # ip6_interfaces_eth0={{ IP6_Interface_eth0 }} 26 # pillar 支持 27 # pillar_user={{ Pillar_User }}
1 [root@salt100 lamp2]# pwd 2 /srv/salt/lamp2 3 [root@salt100 lamp2]# ll 4 total 16 5 -rw-r--r-- 1 root root 747 Jan 1 14:17 apache.sls 6 drwxr-xr-x 2 root root 75 Jan 1 14:33 file 7 -rw-r--r-- 1 root root 209 Jan 1 14:04 init.sls 8 -rw-r--r-- 1 root root 563 Dec 31 15:42 mariadb.sls 9 -rw-r--r-- 1 root root 346 Dec 31 15:31 php.sls 10 [root@salt100 lamp2]# cat apache.sls 11 apache-service: 12 pkg.installed: 13 - name: httpd 14 15 file.managed: 16 - name: /etc/httpd/conf/httpd.conf 17 - source: salt://lamp2/file/httpd.conf 18 - user: root 19 - gourp: root 20 - mode: 644 21 - backup: minion 22 - require: # 我依賴誰 23 - pkg: apache-service # 依賴 apache-service 中 pkg 的安裝包 24 # 新加 jinja 內容 # 本次修改內容 ★★★★★ 25 - template: jinja 26 - defaults: 27 LocalInnerIP: {{ grains['ip4_interfaces']['eth0'][0] }} 28 HttpPort: 8088 29 # salt遠程執行模塊 支持 ★★★★★ 30 HwAddr_eth0: {{ salt['network.hw_addr'] ('eth0') }} # 注意 ] ( 之間的空格 31 # grains 支持 【其實 defaults 下的第一行就是,這裏在重複一遍】 32 IP6_Interface_eth0: {{ grains['ip6_interfaces']['eth0'][0] }} 33 # pillar 支持 34 Pillar_User: {{ pillar['level1']['level2']['my_user'] }} 35 36 service.running: 37 - name: httpd 38 - enable: True 39 - reload: True 40 - require: # 我依賴誰 41 - pkg: apache-service 42 - watch: # 我監控誰 43 # 一旦發生變化,就重加載服務 44 - file: apache-service # 監控 apache-service 中 file 的文件
1 [root@salt100 lamp2]# pwd 2 /srv/salt/lamp2 3 [root@salt100 lamp2]# ll 4 total 16 5 -rw-r--r-- 1 root root 747 Jan 1 14:17 apache.sls 6 drwxr-xr-x 2 root root 75 Jan 1 14:33 file 7 -rw-r--r-- 1 root root 209 Jan 1 14:04 init.sls 8 -rw-r--r-- 1 root root 563 Dec 31 15:42 mariadb.sls 9 -rw-r--r-- 1 root root 346 Dec 31 15:31 php.sls 10 [root@salt100 lamp2]# cat init.sls # 根據 pillar 來區分,哪些 minion 執行哪些 SLS 文件 11 include: # 我包含誰 12 {% if pillar['service_appoint'] == 'www' %} 13 - lamp2.apache 14 - lamp2.php 15 {% elif pillar['service_appoint'] == 'mariadb' %} 16 - lamp2.mariadb 17 {% endif %}
1 # 測試一下,看是否可執行,有沒有什麼異常 2 [root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init test=True 3 # 根據 init.sls 信息,選取覆蓋 if 條件中全部狀況的 minion 並測試一下,看是否正常 4 [root@salt100 lamp2]# salt -L 'salt01,salt100' state.sls lamp2.init test=True 5 # 單個執行,並查看返回狀況 6 # 這時可在 salt01 機器,經過 ps -ef | grep 'httpd' 和 netstat -lntup | grep 'httpd' 查看 7 # 可見 httpd 已經重加載,而且端口從 80 改成了 8088 8 [root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init 9 [root@salt100 lamp2]# salt '*' state.sls lamp2.init # 批量執行,並查看返回狀況
[root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init test=True # 對應的截圖
對應 salt 遠程執行、grains、pillar 的狀況
1 [root@salt100 ~]# salt 'salt01' network.hw_addr eth0 2 salt01: 3 00:0c:29:95:1b:7a 4 [root@salt100 ~]# salt 'salt01' grains.item ip6_interfaces:eth0 5 salt01: 6 ---------- 7 ip6_interfaces:eth0: 8 - fe80::20c:29ff:fe95:1b7a 9 [root@salt100 ~]# salt 'salt01' pillar.item level1:level2:my_user 10 salt01: 11 ---------- 12 level1:level2:my_user: 13 lisi