1. 程式人生 > >2018年7月1日筆記

2018年7月1日筆記

復雜 web stat pri 其它 init 文件內容 判斷 示例

  • 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日筆記