saltstack管理八之經常使用執行模塊

經常使用執行模塊html



全部執行模塊: http://docs.saltstack.cn/zh_CN/latest/ref/states/all/index.htmlmysql

經常使用模塊:cmd, cron, file, mount, ntp, pkg, service, user, groupnginx


##先看一個簡單的例子:
salt:
  pkg.latest:
    - name: salt
  service.running:
    - names:                     #多個值,一行一個,且爲names,複數
      - 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:               #若是隻有一個函數,這樣寫是錯誤的
要改爲:
/dbdata:
  file:
    - directory

    cmd模塊:web

name:要執行的命令,記住該命令將會在salt-minion的路徑和權限下執行
onlyif:用於檢查的命令,僅當``onlyif``選項指向的命令返回true時才執行name定義的命令
unless:用於檢查的命令,僅當``unless``選項指向的命令返回false時才執行name指向的命令
cwd:執行命令時的當前工做目錄,默認是/root
user:以指定用戶身份運行命令
group:以指定用戶組身份運行命令
shell:用於執行命令的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這個文件,纔會執行這個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 這個目錄,纔會執行name後命令
    - require:
      - file: nginx_source
##unless:後面的條件不知足(條件爲假)時纔會執行
##onlyif:條件爲真時執行
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`          ##反逗點調用shell命令(tab鍵上面那個)


   cron模塊:sql

minute:分
hour:時
daymonth:日
month:月
dayweek:周
user:用戶名
present:建立計劃任務
name:計劃任務內容
[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後面的命令改了,則是從新建立了一個計劃任務

##刪除一個計劃任務:
##如上面的例子:
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模塊:shell

        注意:只有file模塊裏纔可使用template函數apache

.sls文件1:
/tmp/salt/:
  file:
    - directory                 #目錄不存在,則建立目錄
    - name: /tmp/salt/
    - user: nobody
    - group: nobody
    - file_mode: 644            #與recurse遞歸函數一塊兒用
    - dir_mode: 755             #文件權限644,目錄權限755
    - makedirs: True
    - recurse:                 #遞歸目錄權限,包括用戶和權限
      - user                   #若原本此目錄就存在,且此目錄下有不少文件,則recurse函數會把此目錄和目錄下的全部文件的權限都修改(nobody 644 755)
      - group
      - mode                   #文件644,目錄755,就是上面的file_mode和dir_mode
      #- ignore_files           #忽略文件
      #- ignore_dirs

/tmp/salt/file:
  file:
    - managed                   #建立文件
    - name: /tmp/salt/file
    - source: salt://web/files/httpd.conf
    - user: nobody
    - group: nobody               #若此文件原本就存在,則會修改此文件的權限(nobody 644)
    - mode: 644
    #- backup: minion
    #- template: jinja          #調用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 }}              #直接調用變量
    - 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函數能夠直接建立dir1目錄,再建立file1文件

    group模塊:django

absent:刪除用戶組
name:與absent一塊兒用,則是刪除的用戶組名
present:管理用戶組,不存在則建立;存在則管理其屬性
name:與present一塊兒用,則是被管理的用戶組名
##下面的屬性全都是與present一塊兒用的##
gid:組ID分配給命名組;若是留空,那麼下一個可用的組ID將被分配
system:命名組是不是一個系統組,這本質上是groupadd「-r」選項
addusers:添加更多的用戶列表做爲組成員
delusers:確保這些用戶從組成員中刪除
members:用新成員的名單替換現有組成員。
##注:選項'members'和'adduser/delusers'是相互排斥的,不能一塊兒使用
cheese:
  group.present:            #用戶組不存在,則建立;若存在,則管理,包括將用戶添加到此組中或將用戶從組中移除
    - gid: 7648
    - system: True
    - addusers:
      - user1               #將user1添加到組中
      - users2
    - delusers:
      - foo

      
cheese:
  group.present:
    - gid: 7648
    - system: True
    - members:              #只有這4個用戶屬於這個組
      - foo
      - bar
      - user1
      - user2

    iptables模塊:bash

http://docs.saltstack.cn/zh_CN/latest/ref/states/all/salt.states.iptables.html#module-salt.states.iptables 服務器


    lvm模塊:

/dev/sda:
  lvm:
    - pv_present           #建立pv
    #-name: /dev/sda

my_vg:
  lvm.vg_present:          #建立vg
    - devices: /dev/sda    #指定pv

lvroot:
  lvm.lv_present:
    - vgname: my_vg        #指定vg
    - name: lvroot
    - size: 10G
    #- stripes: 5
    #- stripesize: 8K

    mount模塊:

/mnt/sdb:                        #標識,沒有name函數則表示掛載點
  mount.mounted:
    - device: /dev/sdb1          #掛載的設備名
    #- name: /mnt/sdb            #掛載點
    - fstype: ext4
    - mkmnt: True                #掛載點不存在則自動建立,最好將其設置爲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函數,一行一個
      - gcc
      - cmake
      - make
    #- name: httpd       #安裝的軟件包名,與pkgs一塊兒用時,此函數將被忽略
    
##installed:安裝軟件包
##latest:將軟件更新到最新
##removed:卸載軟件包
##pkgs:安裝多個軟件包時,一次所有安裝(推薦)
##names:安裝多個軟件包時,一次安裝一個,需安裝屢次(不推薦)

    service模塊:

httpd:
  service:
    - running               #使服務處於運行狀態
    - enable: True          #設置開機自動啓動
    - reload: True          #watch函數下監控的/etc/httpd/conf/httpd.conf文件發生變化,則會從新加載reload;若reload函數不存在或reload值爲False,則會從新啓動restart
    - watch:
      - file: /etc/httpd/conf/httpd.conf
    - require:
      - pkg: httpd
      
##dead:使服務處於stop狀態

##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函數或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               #設置爲系統用戶
    - groups:                    #設置用戶的所屬組
      - nobody                   #把user1用戶加入到nobody組中,且僅屬於nobody組;若是用戶本來在jeff組中,執行後用戶只在nobody組中,再也不屬於jeff組了
      #- group1
      
##absent:刪除用戶
##force:強制刪除用戶(即使用戶正在登錄)





實例:

    公司來新的員工,須要在全部的服務器上添加一個普通帳號:

##先建立MD5加密密碼
[root@dbm133 ~]# openssl passwd -1 -salt 'shencj'       ##用戶名,如這個shencj用戶能夠不存在;可是必須和下面建立的新用戶對應
Password:                                               ##輸入密碼
$1$shencj$i3JtzHYM7hFcNP63VLK..1                        ##生成的加密密碼
##定義pillar變量
[root@dbm133 ~]# cat /srv/pillar/user/init.sls 
username: shencj
password: '$1$shencj$i3JtzHYM7hFcNP63VLK..1'
##建立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端數據推送
[root@dbm133 ~]# salt '*' state.sls user.adduser
相關文章
相關標籤/搜索