2018年7月1日筆記
- pillar
Pillar在salt中是非常重要的組成部分,利用它可以完成很強大的功能,它可以指定一些信息到指定的minion上,不像grains一樣是分發到所有Minion上的,它保存的數據可以是動態的,Pillar以sls來寫的,格式是鍵值對
適用情景:
1.比較敏感的數據,比如密碼,key等
2.特殊數據到特定Minion上
3.動態的內容
4.其他數據類型
查看Minion的Pillar信息
salt ‘*‘ pillar.items
查看某個Pillar值
salt ‘*‘ pillar.item <key> #只能看到頂級的 salt ‘*‘ pillar.get <key>:<key> #可以取到更小粒度的
編寫pillar數據
1.指定pillar_roots,默認是/srv/pillar(可通過修改master配置文件修改),建立目錄
mkdir /srv/pillar
cd /srv/pillar
2.編輯一個pillar數據文件
vim test1.sls name: ‘salt‘ users: hadoop: 1000 redhat: 2000 ubuntu: 2001
3.建立top file指定minion到pillar數據文件
vim top.sls base: ‘*‘: - test1
4.刷新Pillar數據
salt ‘*‘ saltutil.refresh_pillar
5.測試
salt ‘*‘ pillar.get name
salt ‘*‘ pillar.item name
在state中通過jinja使用pillar數據
vim /srv/salt/user.sls {% for user, uid in pillar.get(’users’, {}).items() %} ##pillar.get(‘users‘,{})可用pillar[‘users‘]代替,前者在沒有得到值的情況下,賦默認值 {{user}}: user.present: - uid: {{uid}} {% endfor %}
當然也可以不使用jinja模板
vim /srv/salt/user2.sls
{{ pillar.get(‘name‘,‘‘) }}:
user.present:
- uid: 2002
通過jinja模板配合grains指定pillar數據
/srv/pillar/pkg.sls pkgs: {% if grains[’os_family’] == ’RedHat’ %} apache: httpd vim: vim-enhanced {% elif grains[’os_family’] == ’Debian’ %} apache: apache2 vim: vim {% elif grains[’os’] == ’Arch’ %} apache: apache vim: vim {% endif %}
- grains
服務器的一些靜態信息,這裏強調的是靜態,就是不會變的東西,比如說os是centos,如果不會變化,除非重新安裝系統
定義minion的grains可以寫在/etc/salt/minion中格式如下
grains: roles: - webserver - memcache deployment: datacenter4 cabinet: 13 cab_u: 14-15
或者寫在/etc/salt/grains中,格式如下
roles: - webserver - memcache deployment: datacenter4 cabinet: 13 cab_u: 14-15
也可以在master中編寫grains的模塊,同步到minion中,用Python來寫很簡單的
1.在/srv/salt中建立_grains目錄
mkdir /srv/salt/_grains
2.編寫grains文件,需要返回一個字典
vim test1.py def hello(): ##函數名字無所謂,應該是所有函數都會運行 agrain = {} agrain[‘hello‘] = ‘saltstack‘ return agrain ##返回這個字典
3.同步到各個minion中去
salt ‘*‘ saltutil.sync_grains salt ‘*‘ saltutil.sync_all salt ‘*‘ state.highstate
4.驗證
salt ‘*‘ grains.item hello
-
使用 salt state
它的核心是寫sls(SaLt State file)文件,sls文件默認格式是YAML格式(以後會支持XML),並默認使用jinja模板,YAML與XML類似,是一種簡單的適合用來傳輸數據的格式,而jinja是根據django的模板語言發展而來的語言,簡單並強大,支持for if 等循環判斷。salt state主要用來描述系統,軟性,服務,配置文件應該出於的狀態,常常被稱為配置管理!
通常state,pillar,top file會用sls文件來編寫。state文件默認是放在/srv/salt中,它與你的master配置文件中的file_roots設置有關
示例: apache.sls文件內容 ##/srv/salt/apahce.sls,以後沒有用絕對路徑意思就是在/srv/salt下
apache: ##state ID,全文件唯一,如果模塊沒跟-name默認用的ID作為-name pkg: ##模塊 - installed ##函數 #- name: apache ##函數參數,可以省略 service: ##模塊 - running ##函數 #- name: apache ##函數參數,這個是省略的,也可以寫上 - require: ##依賴系統 - pkg: apache ##表示依賴id為apache的pkg狀態
下面來解釋上面示例的意思:
聲明一個叫apache的狀態id,該id可以隨意,最好能表示一定意思
pkg代表的是pkg模塊
installed是pkg模塊下的一個函數,描述的是狀態,該函數表示apache是否部署,返回值為True或者False,為真時,表示狀態OK,否則會去滿足該狀態(下載安裝apache),如果滿足不了會提示error,在該模塊上面省略了參數-name: apache,因為ID為apache,這些參數是模塊函數需要的(可以去查看源碼)
service是指的service模塊,這個模塊下主要是描述service狀態的函數,running狀態函數表示apache在運行,省略-name不在表述,-require表示依賴系統,依賴系統是state system的重要組成部分,在該處描述了apache服務的運行需要依賴apache軟件的部署,這裏就要牽涉到sls文件的執行,sls文件在salt中執行時無序(如果沒有指定順序,後面會講到order),假如先執行了service這個狀態,它發現依賴pkg包的安裝,會去先驗證pkg的狀態有沒有滿足,如果沒有依賴關系的話,我們可以想象,如果沒有安裝apache,apache 的service肯定運行會失敗的,我們來看看怎麽執行這個sls文件:
salt ‘*‘ state.sls apache
在命令行裏這樣執行就ok了,.sls不要寫,如果在目錄下,將目錄與文件用’.’隔開,如: httpd/apache.sls –> httpd.apache
或者
salt ‘*‘ state.highstate
這需要我們配置top file執定哪個minion應用哪個狀態文件
top.sls內容
base: ‘*‘: - apache
下面我們繼續看一些比較復雜的:
ssh/init.sls文件內容
openssh-client: pkg.installed /etc/ssh/ssh_config: file.managed: - user: root - group: root - mode 644 - source: salt://ssh/ssh_config - require: - pkg: openssh-client
ssh/server.sls文件內容
include: - ssh openssh-server: pkg.installed sshd: service.running: - require: - pkg: openssh-client - pkg: openssh-server - file: /etc/ssh/banner - file: /etc/ssh/sshd_config /etc/ssh/sshd_config: file.managed: - user: root - group: root - mode: 644 - source: salt://ssh/sshd_config - require: - pkg: openssh-server /etc/ssh/banner: file: - managed - user: root - group: root - mode: 644 - source: salt://ssh/banner - require: - pkg: openssh-server
ssh/init.sls,學過Python的都知道目錄下面的init文件是特殊文件,它怎麽特殊呢,它特殊在當我們應用目錄時會應用該文件的內容,如我們執行 salt ‘*’ state.sls ssh時應用的就是init.sls文件,明白了嗎?再看裏面的內容,前兩行我們已經看過了,是描述某個rpm包有沒有安裝的,第三行是ID,也可以用來表示-name,以省略-name,file.managed是file模塊與函數managed的快捷寫法,看server.sls下最後就知道了,managed它描述了某個文件的狀態,後面跟的是managed的參數,user,group,mode你們一看就知道什麽意思了,關於這個source是指從哪下載源文件,salt://ssh/sshd_config是指的從salt的文件服務器裏面下載,salt文件服務器其實就是file_roots默認/srv/salt/明白了嗎,所以salt://ssh/sshd_config指的就是 /srv/salt/ssh/sshd_config,出來用salt的文件服務器,也可以用http,ftp服務器。- require是依賴系統不表,以後會詳細說它的。再往下是server.sls文件,include表示包含意思,就是把ssh/init.sls直接包含進來
這時你會看到/srv/salt的目錄樹是:
ssh/init.sls ssh/server.sls ssh/banner ssh/ssh_config ssh/sshd_config
下面再來看一個官方樣例:
ssh/custom-server.sls 文件內容
include: - ssh.server extend: /etc/ssh/banner: file: - source: salt://ssh/custom-banner
python/mod_python.sls文件內容
include: - apache extend: apache: service: - watch: - pkg: mod_python
首先我們include的別的文件,但是裏面的內容並不是全部符合我們的要求,這時我們就需要用extend來重寫部分內容,特殊的是依賴關系都是追加。custom-server.sls文件意思是包含ssh/server.sls,擴展/etc/ssh/banner,重新其source而其它的如user,group等不變,與include一致。 mode_python.sls文件意思是把apache.sls包含進來,想apache-service是追加了依賴關系(watch也是依賴系統的函數).
常用狀態配置 salt-states-master.zip
2018年7月1日筆記