常用模塊:cmd, cron, file, mount, ntp, pkg, service, user, group
先看一個(gè)簡(jiǎn)單的例子:
salt:
pkg.latest:
- name: salt
service.running:
- names: #多個(gè)值,一行一個(gè),且為names,復(fù)數(shù)
- salt-master
- salt-minion
- require:
- pkg: salt
- watch:
- file: /etc/salt/minion
/etc/salt/minion:
file.managed:
- source: salt://salt/minion
- user: root
- group: root
- mode: 644
- require:
- pkg: salt
##一個(gè)小的注意:
/dbdata:
file.directory: #如果只有一個(gè)函數(shù),這樣寫是錯(cuò)誤的
要改成:
/dbdata:
file:
- directory
cmd模塊
name:要執(zhí)行的命令,記住該命令將會(huì)在salt-minion的路徑和權(quán)限下執(zhí)行
onlyif:用于檢查的命令,僅當(dāng)``onlyif``選項(xiàng)指向的命令返回true時(shí)才執(zhí)行name定義的命令
unless:用于檢查的命令,僅當(dāng)``unless``選項(xiàng)指向的命令返回false時(shí)才執(zhí)行name指向的命令
cwd:執(zhí)行命令時(shí)的當(dāng)前工作目錄,默認(rèn)是/root
user:以指定用戶身份運(yùn)行命令
group:以指定用戶組身份運(yùn)行命令
shell:用于執(zhí)行命令的shell,默認(rèn)shell grain
run:運(yùn)行name后的命令
[root@test81 ~]# cat install.sls
nginx_source:
file.managed:
- name: /tmp/nginx-1.4.5.tar.gz
- unless: test -f /tmp/nginx-1.4.5.tar.gz ##若minion端不存在/tmp/nginx-1.4.5.tar.gz這個(gè)文件,才會(huì)執(zhí)行這個(gè)file模塊
- source: salt://nginx/files/nginx-1.4.5.tar.gz
tar_nginx:
cmd.run:
- cwd: /usr/local/src ##當(dāng)前工作目錄
- name: tar zxvf nginx-1.4.5.tar.gz
- unless: test -d /usr/local/src/nginx-1.4.5 ##若minion端不存在/usr/local/src/nginx-1.4.5 這個(gè)目錄,才會(huì)執(zhí)行name后命令
- require:
- file: nginx_source
##unless:后面的條件不滿足(條件為假)時(shí)才會(huì)執(zhí)行
##onlyif:條件為真時(shí)執(zhí)行
ntpdate_cron:
cron:
- present
- name: /usr/sbin/ntpdate pool.ntp.org
- minute: '*/30'
- require:
- cmd: isntp
isntp:
cmd:
- run
- name: yum -y install ntp
- unless: test ! -z `rpm -qa ntp` ##反逗點(diǎn)調(diào)用shell命令(tab鍵上面那個(gè))
cron模塊
minute:分
hour:時(shí)
daymonth:日
month:月
dayweek:周
user:用戶名
present:創(chuàng)建計(jì)劃任務(wù)
name:計(jì)劃任務(wù)內(nèi)容
[root@scj cron]# cat cron.sls
mysql_cron:
cron:
- present
- name: cd /tmp/scripts;./mysql_backup.sh
- user: root
- minute: 0
- hour: 1
#- daymonth:
#- month:
#- dayweek:
#- minute: "*/5"
##修改計(jì)劃任務(wù):
##如上面的例子:
mysql_cron:
cron:
- present
- name: cd /tmp/scripts;./mysql_backup.sh
- user: root
- minute: 0
- hour: 2 #將1改為2
#- daymonth:
#- month:
#- dayweek:
#- minute: "*/5"
注意:以name后面的命令為主
可以理解為name后面的命令是唯一鍵
若把name后面的命令改了,則是重新創(chuàng)建了一個(gè)計(jì)劃任務(wù)
##刪除一個(gè)計(jì)劃任務(wù):
##如上面的例子:
mysql_cron:
cron:
- absent ##absent刪除計(jì)劃任務(wù)
- name: cd /tmp/scripts;./mysql_backup.sh ##只要保證name后命令不變,能匹配到
- user: root
- minute: 0
- hour: 2
#- daymonth:
#- month:
#- dayweek:
#- minute: "*/5"
file模塊:只有file模塊才能用template函數(shù)
.sls文件1:
/tmp/salt/:
file:
- directory #目錄不存在,則創(chuàng)建目錄
- name: /tmp/salt/
- user: nobody
- group: nobody
- file_mode: 644 #與recurse遞歸函數(shù)一起用
- dir_mode: 755 #文件權(quán)限644,目錄權(quán)限755
- makedirs: True
- recurse: #遞歸目錄權(quán)限,包括用戶和權(quán)限
- user #若本來(lái)此目錄就存在,且此目錄下有很多文件,則recurse函數(shù)會(huì)把此目錄和目錄下的所有文件的權(quán)限都修改(nobody 644 755)
- group
- mode #文件644,目錄755,就是上面的file_mode和dir_mode
#- ignore_files #忽略文件
#- ignore_dirs
/tmp/salt/file:
file:
- managed #創(chuàng)建文件
- name: /tmp/salt/file
- source: salt://web/files/httpd.conf
- user: nobody
- group: nobody #若此文件本來(lái)就存在,則會(huì)修改此文件的權(quán)限(nobody 644)
- mode: 644
#- backup: minion
#- template: jinja #調(diào)用pillar變量和grains變量
- require:
- file: /tmp/salt/
.sls文件2:
{% set site_user = 'testuser' %} #定義變量
{% set site_name = 'test_site' %}
{% set project_name = 'test_proj' %}
{% set sites_dir = 'test_dir' %}
django-project:
file.recurse:
- name: {{ sites_dir }}/{{ site_name }}/{{ project_name }}
- user: {{ site_user }} #直接調(diào)用變量
- dir_mode: 2775
- file_mode: '0644'
- template: jinja #指定template: jinja
- source: salt://project/templates_dir
- include_empty: True
.sls文件3:
/etc/http/conf/http.conf:
file.managed:
- source: salt://apache/http.conf
- user: root
- group: root
- mode: 644
- template: jinja
- defaults: #默認(rèn)變量,多個(gè)一行一個(gè)
custom_var: "default value" #這些變量將會(huì)在salt://apache/http.conf這個(gè)文件里使用
other_var: 123
{% if grains['os'] == 'Ubuntu' %} ##if語(yǔ)句要定格##
- context: #以context下的變量為準(zhǔn),沒有時(shí)再用defaults下的變量
custom_var: "override" #這里以這個(gè)變量為準(zhǔn),defaults里的是無(wú)效的
{% endif %}
.sls文件4:
/tmp/dir1/file1:
file:
- managed
- makedirs: True
##若minion端沒有dir1目錄,使用makedirs函數(shù)可以直接創(chuàng)建dir1目錄,再創(chuàng)建file1文件
group模塊:
absent:刪除用戶組
name:與absent一起用,則是刪除的用戶組名
present:管理用戶組,不存在則創(chuàng)建;存在則管理其屬性
name:與present一起用,則是被管理的用戶組名
##下面的屬性全都是與present一起用的##
gid:組ID分配給命名組;如果留空,那么下一個(gè)可用的組ID將被分配
system:命名組是否是一個(gè)系統(tǒng)組,這本質(zhì)上是groupadd“-r”選項(xiàng)
addusers:添加更多的用戶列表作為組成員
delusers:確保這些用戶從組成員中刪除
members:用新成員的名單替換現(xiàn)有組成員。
##注:選項(xiàng)'members'和'adduser/delusers'是相互排斥的,不能一起使用
cheese:
group.present: #用戶組不存在,則創(chuàng)建;若存在,則管理,包括將用戶添加到此組中或?qū)⒂脩魪慕M中移除
- gid: 7648
- system: True
- addusers:
- user1 #將user1添加到組中
- users2
- delusers:
- foo
cheese:
group.present:
- gid: 7648
- system: True
- members: #只有這4個(gè)用戶屬于這個(gè)組
- foo
- bar
- user1
- user2
mount模塊:
/mnt/sdb: #標(biāo)識(shí),沒有name函數(shù)則表示掛載點(diǎn)
mount.mounted:
- device: /dev/sdb1 #掛載的設(shè)備名
#- name: /mnt/sdb #掛載點(diǎn)
- fstype: ext4
- mkmnt: True #掛載點(diǎn)不存在則自動(dòng)創(chuàng)建,最好將其設(shè)置為True
- opts:
- defaults
/srv/bigdata:
mount:
- mounted:
- device: UUID=066e0200-2867-4ebe-b9e6-f30026ca2314
- fstype: xfs
- opts: nobootwait,noatime,nodiratime,nobarrier,logbufs=8
#- dump: 0 #默認(rèn)是0
#- pass_num: 2 #默認(rèn)是0
#- persist: True #是不是將其寫入/etc/fstab文件里,默認(rèn)是True,寫入
- mkmnt: True
##dump: The dump value to be passed into the fstab, Default is 0
##pass_num: The pass value to be passed into the fstab, Default is 0
pkg模塊:
mypkgs:
pkg.installed:
- pkgs: #安裝多個(gè)軟件包,用pkgs函數(shù),一行一個(gè)
- gcc
- cmake
- make
#- name: httpd #安裝的軟件包名,與pkgs一起用時(shí),此函數(shù)將被忽略
##installed:安裝軟件包
##latest:將軟件更新到最新
##removed:卸載軟件包
##pkgs:安裝多個(gè)軟件包時(shí),一次全部安裝(推薦)
##names:安裝多個(gè)軟件包時(shí),一次安裝一個(gè),需安裝多次(不推薦)
service模塊:
httpd:
service:
- running #使服務(wù)處于運(yùn)行狀態(tài)
- enable: True #設(shè)置開機(jī)自動(dòng)啟動(dòng)
- reload: True #watch函數(shù)下監(jiān)控的/etc/httpd/conf/httpd.conf文件發(fā)生變化,則會(huì)重新加載reload;若reload函數(shù)不存在或reload值為False,則會(huì)重新啟動(dòng)restart
- watch:
- file: /etc/httpd/conf/httpd.conf
- require:
- pkg: httpd
##dead:使服務(wù)處于stop狀態(tài)
##reload值為True:
ID: httpd
Function: service.running
Result: True
Comment: Service reloaded ##reload服務(wù)
Started: 14:56:31.920445
Duration: 1702.923 ms
Changes:
----------
httpd:
True
##不存在reload函數(shù)或reload值為False:
ID: httpd
Function: service.running
Result: True
Comment: Service restarted ##restart服務(wù)
Started: 14:58:05.723261
Duration: 1193.026 ms
Changes:
----------
httpd:
True
user模塊:
user1:
user:
- present
#- name: user1
#- home: /home/user1
#- shell: /bin/bash
- uid: 600
- gid: 600
- system: True #設(shè)置為系統(tǒng)用戶
- groups: #設(shè)置用戶的所屬組
- nobody #把user1用戶加入到nobody組中,且僅屬于nobody組;如果用戶原本在jeff組中,執(zhí)行后用戶只在nobody組中,不再屬于jeff組了
#- group1
##absent:刪除用戶
##force:強(qiáng)制刪除用戶(即便用戶正在登陸)
公司新來(lái)個(gè)員工在服務(wù)器上添加普通賬號(hào):
##先創(chuàng)建MD5加密密碼
[root@dbm133 ~]# openssl passwd -1 -salt 'shencj' ##用戶名,如這個(gè)shencj用戶可以不存在;但是必須和下面創(chuàng)建的新用戶對(duì)應(yīng)
Password: ##輸入密碼
$1$shencj$i3JtzHYM7hFcNP63VLK..1 ##生成的加密密碼
##定義pillar變量
[root@dbm133 ~]# cat /srv/pillar/user/init.sls
username: shencj
password: '$1$shencj$i3JtzHYM7hFcNP63VLK..1'
##創(chuàng)建state的.sls文件
[root@dbm133 ~]#cat /srv/salt/user/adduser.sls
{{ pillar['username'] }}:
user:
- present
# - uid: 1001
# - gid: 1001
- password: {{ pillar['password'] }}
- groups:
- nobody
/home/{{ pillar['username'] }}/.ssh:
file:
- directory
- require:
- user: {{ pillar['username'] }}
/home/{{ pillar['username'] }}/.ssh/authorized_keys:
file:
- managed
- source: salt://files/authorized_keys
- mode: 400
- user: {{ pillar['username'] }}
- group: {{ pillar['username'] }}
- require:
- file: /home/{{ pillar['username'] }}/.ssh
##master端數(shù)據(jù)推送
[root@dbm133 ~]# salt '*' state.sls user.adduser