常用模塊:cmd, cron, file, mount, ntp, pkg, service, user, group
先看一個簡單的例子:
salt:
pkg.latest:
- name: salt
service.running:
- names: #多個值,一行一個,且為names,復數(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
##一個小的注意:
/dbdata:
file.directory: #如果只有一個函數(shù),這樣寫是錯誤的
要改成:
/dbdata:
file:
- directory
cmd模塊
name:要執(zhí)行的命令,記住該命令將會在salt-minion的路徑和權(quán)限下執(zhí)行
onlyif:用于檢查的命令,僅當``onlyif``選項指向的命令返回true時才執(zhí)行name定義的命令
unless:用于檢查的命令,僅當``unless``選項指向的命令返回false時才執(zhí)行name指向的命令
cwd:執(zhí)行命令時的當前工作目錄,默認是/root
user:以指定用戶身份運行命令
group:以指定用戶組身份運行命令
shell:用于執(zhí)行命令的shell,默認shell grain
run:運行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這個文件,才會執(zhí)行這個file模塊
- source: salt://nginx/files/nginx-1.4.5.tar.gz
tar_nginx:
cmd.run:
- cwd: /usr/local/src ##當前工作目錄
- 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 這個目錄,才會執(zhí)行name后命令
- require:
- file: nginx_source
##unless:后面的條件不滿足(條件為假)時才會執(zhí)行
##onlyif:條件為真時執(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ào)用shell命令(tab鍵上面那個)
cron模塊
minute:分
hour:時
daymonth:日
month:月
dayweek:周
user:用戶名
present:創(chuàng)建計劃任務
name:計劃任務內(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"
##修改計劃任務:
##如上面的例子:
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)建了一個計劃任務
##刪除一個計劃任務:
##如上面的例子:
mysql_cron:
cron:
- absent ##absent刪除計劃任務
- 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 #若本來此目錄就存在,且此目錄下有很多文件,則recurse函數(shù)會把此目錄和目錄下的所有文件的權(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 #若此文件本來就存在,則會修改此文件的權(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: #默認變量,多個一行一個
custom_var: "default value" #這些變量將會在salt://apache/http.conf這個文件里使用
other_var: 123
{% if grains['os'] == 'Ubuntu' %} ##if語句要定格##
- context: #以context下的變量為準,沒有時再用defaults下的變量
custom_var: "override" #這里以這個變量為準,defaults里的是無效的
{% 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分配給命名組;如果留空,那么下一個可用的組ID將被分配
system:命名組是否是一個系統(tǒng)組,這本質(zhì)上是groupadd“-r”選項
addusers:添加更多的用戶列表作為組成員
delusers:確保這些用戶從組成員中刪除
members:用新成員的名單替換現(xiàn)有組成員。
##注:選項'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個用戶屬于這個組
- foo
- bar
- user1
- user2
mount模塊:
/mnt/sdb: #標識,沒有name函數(shù)則表示掛載點
mount.mounted:
- device: /dev/sdb1 #掛載的設備名
#- name: /mnt/sdb #掛載點
- fstype: ext4
- mkmnt: True #掛載點不存在則自動創(chuàng)建,最好將其設置為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 #默認是0
#- pass_num: 2 #默認是0
#- persist: True #是不是將其寫入/etc/fstab文件里,默認是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: #安裝多個軟件包,用pkgs函數(shù),一行一個
- gcc
- cmake
- make
#- name: httpd #安裝的軟件包名,與pkgs一起用時,此函數(shù)將被忽略
##installed:安裝軟件包
##latest:將軟件更新到最新
##removed:卸載軟件包
##pkgs:安裝多個軟件包時,一次全部安裝(推薦)
##names:安裝多個軟件包時,一次安裝一個,需安裝多次(不推薦)
service模塊:
httpd:
service:
- running #使服務處于運行狀態(tài)
- enable: True #設置開機自動啟動
- reload: True #watch函數(shù)下監(jiān)控的/etc/httpd/conf/httpd.conf文件發(fā)生變化,則會重新加載reload;若reload函數(shù)不存在或reload值為False,則會重新啟動restart
- watch:
- file: /etc/httpd/conf/httpd.conf
- require:
- pkg: httpd
##dead:使服務處于stop狀態(tài)
##reload值為True:
ID: httpd
Function: service.running
Result: True
Comment: Service reloaded ##reload服務
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服務
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 #設置為系統(tǒng)用戶
- groups: #設置用戶的所屬組
- nobody #把user1用戶加入到nobody組中,且僅屬于nobody組;如果用戶原本在jeff組中,執(zhí)行后用戶只在nobody組中,不再屬于jeff組了
#- group1
##absent:刪除用戶
##force:強制刪除用戶(即便用戶正在登陸)
公司新來個員工在服務器上添加普通賬號:
##先創(chuàng)建MD5加密密碼
[root@dbm133 ~]# openssl passwd -1 -salt 'shencj' ##用戶名,如這個shencj用戶可以不存在;但是必須和下面創(chuà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