Linux記錄-salt分析


salt-master建立分組

如dn: 'L@dnxxx,dyyy'

salt -N dn  state.apply  hadoop test=true

salt -N dn  cmd.run  'ls -ll /'

salt -N dn  test.ping

salt 'dnxxx'  test.ping

salt-minion修改minion配置:master   id

salt-key   -L

salt-key   -A

systemctl start salt-minion.service

systemctl start salt-master.service

apache:
  pkg.installed: []
  service.running:
    - watch:
      - pkg: apache
      - file: /etc/httpd/conf/httpd.conf
      - user: apache
  user.present:
    - uid: 87
    - gid: 87
    - home: /var/www/html
    - shell: /bin/nologin
    - require:
      - group: apache
  group.present:
    - gid: 87
    - require:
      - pkg: apache

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://apache/httpd.conf
    - user: root
    - group: root
    - mode: 644
目錄文件:/etc/salt/master
interface: 192.168.0.1 ---接口(默認是0.0.0.0)
ipv6: True   ---偵聽ipv6
publish_port: 4505 ---發布端口
master_id: MasterOfMaster ---發布master傳遞給minion的id,返回請求給主服務器,這必須與配置syndic的字符串相同
user: root ---用戶運行salt進程
enable_ssh_minions: True  ---是否啟用salt-ssh命令
ret_port: 4506  ---接收端口
pidfile: /var/run/salt-master.pid  ---pidfile文件所在位置
root_dir: /   ---系統運行根目錄
conf_file: /etc/salt/master  ---配置文件
pki_dir: /etc/salt/pki/master  ---存儲pki身份驗證密鑰的目錄
extension_modules: /root/salt_extmods   ---自定義擴展模塊(modules、states、grains、proxy、pillar)
module_dirs:
  - /var/cache/salt/minion/extmods   ---自定義擴展目錄
cachedir: /var/cache/salt/master ---緩存信息(如salt執行的作業信息)
verify_env:True  ---啟動時驗證並設置配置目錄的權限
keep_jobs : 24  ---保留舊作業的小時數
gather_job_timeout : 10   ---客戶端請求有關正在運行的作業等待的秒數
TIMEOUT:5 ---設置salt命令和api的默認超時
LOOP_INTERVAL:60  ---loop_interval選項控制主維護過程檢查周期的秒數。此過程更新文件服務器后端,清除作業緩存並執行調度程序。
OUTPUT:nested  ---設置salt命令使用的默認輸出器。
outputter_dirs : [] ---用於搜索salt輸出器的其他目錄列表。
OUTPUT_FILE:/path /output/file ---設置salt命令使用的默認輸出文件。默認是輸出到CLI而不是文件。功能與“--out-file”CLI選項的功能相同,僅將其設置為所有salt命令的單個文件。
SHOW_TIMEOUT:TRUE ---是否啟用顯示超時
SHOW_JID:False  --是否啟用顯示JID
color:True ---默認輸出為彩色
color_theme:/etc/salt/color_theme ---顏色主題路徑
cli_summary:false 是否顯示minions的數量
sock_dir:/var/run/salt/master  ---套接字目錄
enable_gpu_grains : True ---是否啟用GPU
job_cache:true ---主服務器臨時作業緩存(大型部署)
minion_data_cache:True ---minion數據緩存
cache: consul/localfs ---緩存子系統模塊用於minion數據緩存。
memcache_expire_seconds : 30  ---Memcache是​​一個額外的緩存層,可以在內存中保留從minion數據緩存中獲取有限數量的有限數據,從而使緩存操作更快。它對localfs 緩存驅動程序沒有多大意義,但有助於更復雜的驅動程序,如consul。此選項設置memcache項目到期時間。默認設置為0 禁用memcache。
memcache_max_items : 1024  ---memcache項目限制
memcache_full_cleanup :True  ---緩存已滿會清除其存儲空間
memcache_debug:True  ---啟用收集memcache統計信息並記錄在調試日志級別
ext_job_cache : redis  ---默認返回者-minion,也會禁用主服務器的作業緩存
event_return :
  -  syslog 
  -  splunk   ---記錄事件的返回者
event_return_queue : 0  ---在繁忙的系統上,啟用event_returns會對返回者造成相當大的存儲系統負載。事件可以在主服務器上排隊,並使用單個事務以批處理方式存儲多個事件。默認情況下,事件不會排隊。
event_return_whitelist :
  -  salt / master / a_tag 
  -  salt / run / * / ret     ---僅返回與白名單中的標記匹配的事件。
event_return_blacklist :
  -  salt / master / not_this_tag 
  -  salt / wheel / * / ret  ---存儲所有事件將_except_標記返回黑名單。
max_event_size : 1048576  ---傳遞非常大的事件會導致minion消耗大量內存。該值調整允許進入主事件總線的消息的最大大小。該值以字節表示。
master_job_cache : redis  ---指定要用於作業緩存的返回者。作業緩存只能與salt master進行交互,因此不需要從minions訪問。
enforce_mine_cache :false  ---默認情況下,當禁用minion_data_cache時,它將停止工作,因為它基於緩存數據,通過啟用此選項,我們只顯示mine系統的緩存。
max_minions : 100  ---主服務器允許的最大連接數
con_cache:True  ---如果在大型安裝中使用max_minions,則主服務器可能會遇到高負載情況,因為必須檢查每個身份驗證的已連接的minions數。此緩存為所有MWorker進程提供所有連接的minions的minion-id,並極大地提高了max_minions的性能。
presence_events:false ---是否尋找積極連接的minoin
ping_on_rotate :false ---秘鑰每24小時輪換一次,ping所有的minions
TRANSPORT:zeromq  ---支持zeromq、raet、tcp三種傳輸
transport_opts :
  tcp :
    publish_port : 4605 
    ret_port : 4606 
  zeromq : []
MASTER_STATS:False  ---啟用主統計信息可以從主事件總線觸發運行時吞吐量和統計信息事件。這些事件將報告在主服務器上運行的功能以及這些運行在給定時間段內平均花費的時間。
MASTER_STATS_EVENT_ITER:60  ---解雇master_stats事件的時間(以秒為單位)。這只會在接收到主設備的請求時觸發,空閑主設備不會觸發這些事件。
sock_pool_size : 15  ---為了避免在將數據寫入套接字時阻塞等待,我們支持Salt應用程序的套接字池。
ipc_mode : ipc  ---ipc策略。(即套接字與tcp等)Windows平台缺少POSIX IPC,必須依賴基於TCP的進程間通信。在Windows上默認ipc_mode 設置為tcp。
tcp_master_pub_port : 4512 ---如果ipc_mode是TCP,則應發布主節點事件的TCP端口。
tcp_master_pull_port : 4513 ---TCP端口,如果ipc_mode是TCP ,則應該在該端口上提取主節點的事件。
tcp_master_publish_pull : 4514 ---主端口上的事件應該被拉出的TCP端口,然后重新發布到主服務器上的事件總線上。
tcp_master_workers : 4515  ---用於mworkers連接到主服務器的TCP端口。
auth_events:True ---主服務器是否啟用觸發身份驗證事件
minion_data_cache_events :True ---主服務器是否啟用觸發minion數據緩存事件,當minion請求minion數據高速緩存刷新時會觸發Minion數據高速緩存事件。
-------------------------------------------------------
salt-ssh配置
roster: cache ---默認為flat,使用名單模塊
roster_defaults :
  user : daniel 
  sudo : True 
  priv : /root/.ssh/id_rsa 
  tty : True  ---所有名單都將繼承的默認設置
roster_file : / root / roster  ---傳入salt-ssh flat名單文件的替代位置。
rosters:
 - /etc/salt/roster.d
 - /opt/salt/some/more/rosters
ssh_passwd: ''  ---密碼
ssh_port: 22   ---端口
ssh_scan_ports: 22 
ssh_scan_timeout: 0.01
ssh_sudo: False
ssh_timeout: 60
ssh_user: root
ssh_log_file: /var/log/salt/ssh
ssh_minion_opts:
  gpg_keydir: /root/gpg
ssh_use_home_key: False
ssh_identities_only: False
ssh_list_nodegroups:
  groupA: minion1,minion2
  groupB: minion1,minion3
THIN_EXTRA_MODS : None  ---Thin附加模塊列表
MIN_EXTRA_MODS:None  ---與thin_extra_mods類似的附加模塊列表
----------------------------------------------------------------------------
Master安全設置
open_mode:false  ---打開模式應該只在短時間內用於清理pki鍵。要打開打開模式,請將此值設置為True。
auto_accept: false   ---自動接受來自minion的所有傳入公鑰
keysize:2048 ---秘鑰大小
autosign_timeout:120 ---自動接受在pki_dir / minion_autosign / keyid中找到匹配名稱的傳入公鑰的時間(以分鍾為單位)。
AUTOSIGN_FILE:not defined
AUTOREJECT_FILE:not defined
autosign_grains_dir:not defined
permissive_pki_access:false  ---是否啟用對salt秘鑰的允許訪問
publisher_acl:
  fred:
    - test.ping
    - pkg.*   
publisher_acl_blacklist:
  users:
    - root
    - '^(?!sudo_).*$'   #  all non sudo users
  modules:
    - cmd.*
    - test.echo
sudo_acl: False  ---強制publisher_acl以及publisher_acl_blacklist用戶何時可以訪問salt命令。
external_auth :
  pam :
    fred :
      -  test.*
token_expire : 43200  ---口令生效的時間(以秒為單位)
token_expire_user_override :
  pam :
    -  fred 
    -  tom 
  ldap :
    -  gary
keep_acl_in_token :false ---是否保存身份驗證列表到口令文件里
eauth_acl_module : django
file_recv:false ---允許minion將文件推送到master
file_recv_max_size : 100  ---推送文件的大小設置
master_sign_pubkey :True ---使用主公鑰的加密簽名對主auth-reply進行
MASTER_SIGN_KEY_NAME: master_sign ---可以自定義的簽名密鑰對的名稱,不帶后綴。
MASTER_PUBKEY_SIGNATURE:master_pubkey_signature 
--------------------------------------------------------------------------------------
MASTER LARGE SCALE TUNING SETTINGS
max_open_files: 100000  ---最大打開文件數
worker_threads: 5  ---工作線程
pub_hwm : 1000  ---zeromq高位標記
zmq_backlog : 1000  ---zeromq的log
----------------------------------------------------------------------------------------
主服務器log設置
log_file : / var / log / salt / master
log_file : file:/// dev / log
log_file : udp:// loghost:10514
log_level :warning
log_level_logfile :warning
log_datefmt: '%H:%M:%S'
log_datefmt_logfile: '%Y-%m-%d %H:%M:%S'
log_fmt_console: '%(colorlevel)s %(colormsg)s'
log_fmt_console: '[%(levelname)-8s] %(message)s'
log_fmt_logfile: '%(asctime)s,%(msecs)03d [%(name)-17s][%(levelname)-8s] %(message)s'
----------------------------------------------------------------------------------------------------
NODE GROUPS
nodegroups:
  group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com'
  group2: 'G@os:Debian and foo.domain.com'
  group3: 'G@os:Debian and N@group1'
  group4:
    - 'G@foo:bar'
    - 'or'
    - 'G@foo:baz'
---------------------------------------------------------------------------------------------------------
RANGE CLUSTER SETTINGS
range_server: range:80
DEFAULT_INCLUDE:master.d/*.conf
# Include files from a master.d directory in the same
# directory as the master config file
include: master.d/*

# Include a single extra file into the configuration
include: /etc/roles/webserver

# Include several files and the master.d directory
include:
  - extra_config
  - master.d/*
  - /etc/roles/webserver
------------------------------------------------------------------------------------------------------------
KEEPALIVE SETTINGS-TCP
tcp_keepalive: True
tcp_keepalive_cnt: -1
tcp_keepalive_idle: 300
tcp_keepalive_intvl': -1
yum install salt-master
yum install salt-minion
yum install salt-ssh
yum install salt-syndic
yum install salt-cloud

systemctl enable salt-master.service
systemctl start salt-master.service
systemctl enable salt-minion.service
systemctl start salt-minion.service

配置目錄
/etc/salt
/var/cache/salt
/var/log/salt
/var/run/salt

firewall-cmd --permanent --zone=<zone> --add-port=4505-4506/tcp
firewall-cmd --reload
-A INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT
-A INPUT -m state --state new -m tcp -p tcp --dport 4506 -j ACCEPT

SaltStack是(C/S)架構的集中化管理平台,SaltStack基於Python語言,
采用zeromq消息隊列進行通信(tcp,ipc)。
一. 部署環境
系統:centos7.3
centos7默認防火牆是firewall,修改為iptables(方法自行百度)
salt-master:192.168.1.100
salt-minion-1:192.168.1.200
salt-minion-2:192.168.1.300
1.1 查看centos的版本和內核版本以及安裝配置阿里雲yum源
#cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

1.2 安裝epel-release和salt-master工具包
#yum install epel-release -y
#yum install salt-master -y

1.3 配置saltstatck開機自啟動服務
#systemctl enable salt-master.service

1.4 啟動saltstack master服務
#systemctl start salt-master

1.5 檢查saltstack端口及進程的運行狀態
  4505是saltstack管理服務器發送命令消息的端口,4506是消息返回時所用的端口,saltstack一般是啟動多個進程並發工作的
#netstat -ntlp|grep python
tcp 0 0 120.76.40.16:4505 0.0.0.0:* LISTEN 4916/python 
tcp 0 0 120.76.40.16:4506 0.0.0.0:* LISTEN 4936/python
#ps -aux |grep salt-master|grep -v grep
root 4906 0.0 0.0 314468 27816 ? Ss 10:47 0:00 /usr/bin/python /usr/bin/salt-master
root 4915 0.3 0.1 414628 37948 ? Sl 10:47 0:36 /usr/bin/python /usr/bin/salt-master
root 4916 0.0 0.0 396528 23580 ? Sl 10:47 0:00 /usr/bin/python /usr/bin/salt-master
root 4917 0.0 0.0 396528 25920 ? Sl 10:47 0:00 /usr/bin/python /usr/bin/salt-master
root 4920 0.0 0.0 314468 22936 ? S 10:47 0:00 /usr/bin/python /usr/bin/salt-master
root 4923 0.0 0.0 1057776 32016 ? Sl 10:47 0:01 /usr/bin/python /usr/bin/salt-master
root 4924 0.0 0.1 1205240 34072 ? Sl 10:47 0:01 /usr/bin/python /usr/bin/salt-master
root 4928 0.0 0.1 1205976 34252 ? Sl 10:47 0:01 /usr/bin/python /usr/bin/salt-master
root 4931 0.0 0.1 1206252 34200 ? Sl 10:47 0:01 /usr/bin/python /usr/bin/salt-master
root 4933 0.0 0.0 1057964 32280 ? Sl 10:47 0:01 /usr/bin/python /usr/bin/salt-master
root 4936 0.0 0.0 691476 23472 ? Sl 10:47 0:00 /usr/bin/python /usr/bin/salt-master
1.6 配置iptables防火牆)(ps:注意selinux狀態,阿里雲服務器默認是disabled)
#vim /etc/systconfig/iptables加入兩行
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4505 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4506 -j ACCEPT
#systemctl restart iptables

salt master 會啟動兩個端口 tcp 4505和tcp 4506
more /etc/salt/master |grep 450
#publish_port: 4505
#ret_port: 4506
#syndic_master_port: 4506
其中 tcp 4506 是master的端口,在minion配置文件中能看到,允許minion訪問后 執行salt-key時 會獲取到

2.配置salt-minion
2.1 查看centos的版本和內核版本以及安裝配置阿里雲yum源
#cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2.2 安裝epel-release和salt-minion工具包
#yum install epel-release -y
#yum install salt-minion -y

2.3 配置minion配置
master參數指定master 的ip (或者主機名),必配參數,如果minion啟動時不能解析到master 主機,啟動會失敗;
#sed -i 's/#master: salt/master: 192.168.1.100/g' /etc/salt/minion

id參數設置salt-minion名,默認未設置,minio名取主機hostname中設定的主機名
#sed -i 's/#id:/id: 192.168.200/g' /etc/salt/minion

2.4 配置saltstatck開機自啟動服務
#systemctl enable salt-minion

2.5 啟動saltstack minion服務
#systemctl start salt-minion
3.其他minion同樣配置 
4.saltstack具體操作
# salt-key -L                                #查看salt-key
Accepted Keys:
salt-minion-01
salt-minion-02
Denied Keys:
Unaccepted Keys:
Rejected Keys:

# salt-key -A -y                      #添加salt-key
The following keys are going to be accepted:
Unaccepted Keys:
salt-minion-01
salt-minion-02
Key for minion salt-minion-01 accepted.
Key for minion salt-minion-02 accepted.

# salt-key -L                                #查看salt-key
Accepted Keys:
salt-minion-01
salt-minion-02
Denied Keys:
Unaccepted Keys:
Rejected Keys:

salt-key -a  slaver.test.com
說明:-a :accept ,-A:accept-all,-d:delete,-D:delete-all。可以使用 salt-key 命令查看到已經簽名的客戶端。此時我們在客戶端的 /etc/salt/pki/minion 目錄下面會多出一個minion_master.pub 文件。

# salt salt-minion* test.ping        #簡單測試
示例1: salt '*' test.ping                  //檢測通訊是否正常,也可以指定其中一個 'slaver.test.com'
示例2:  salt '*' cmd.run   'df -h'        //遠程執行命令

說明: 這里的 * 必須是在 master 上已經被接受過的客戶端,可以通過 salt-key 查到,通常是我們已經設定的 id 值。關於這部分內容,它支持通配、列表以及正則。 比如兩台客戶端 web10、web11, 那我們可以寫成  salt 'web*'    salt 'web1[02]'  salt -L 'web10,web11'   salt -E 'web(10|11)' 等形式,使用列表,即多個機器用逗號分隔,而且需要加-L,使用正則必須要帶-E選項。 它還支持 grains 和 pillar,分別加 -G 和 -I 選項,下面會介紹到。


salt-minion-01:
    True
salt-minion-02:
    True

# salt salt-minion* cmd.run 'uname -r'        #運行linux命令
salt-minion-01:
    3.10.0-327.el7.x86_64
salt-minion-02:
    3.10.0-327.el7.x86_64

salt '*' test.ping  ##  '*' 表示所有的minion,可以輸入指定的minion_id,或者使用正則匹配 匹配指定的minion

認證過程
啟動minion服務后,會產生一個密鑰對,然后minion會根據配置的master地址去連接master,並嘗試把公鑰發給master,minion_id表示minio的身份。

在master上可以使用salt-key來查看密鑰認證的情況,直到密鑰認證后,master和minion就可以通信了,我們就可以通過state模塊來管理minion。
minon密鑰目錄
 ll /etc/salt/pki/minion/
total 12
-rw-r--r--. 1 root root  450 Nov 15 09:59 minion_master.pub  ##認證通過后master發過來的master公鑰
-r--------. 1 root root 1674 Nov 15 09:58 minion.pem
-rw-r--r--. 1 root root  450 Nov 15 09:58 minion.pub
在minion服務沒有啟動時,pki目錄是不存在的。minion服務啟動后,會創建pki目錄,minion目錄和密鑰對。
我們可以把pki目錄刪除,然后重啟服務會重新生成pik目錄。

master密鑰目錄
 ll /etc/salt/pki/master/minions
-rw-r--r--. 1 root root 450 Nov 15 17:59 cong-49  ##已通過的minion密鑰
master接受minion的公鑰后會存放在/etc/salt/pki/master/minions目錄下,以minion的id來命名。
同時master會把自身的公鑰發給minion。
 
master端的pki目錄千萬不要刪除,因為這個目錄包含了所有minion的認證密鑰。不過我們可以刪除指定minion的密鑰文件。
也可以 用命令salt-key刪除指定minion的key認證

在master把對應的minion的key刪掉:
salt-key -d 192.168.1.49

查看密鑰保存目錄是否存在對應mining的密鑰key,如果存在刪除它
[root@cong-33 nginx]# ll /etc/salt/pki/master/minions

minion端
停止minion服務: 
[root@cono-49 ~]# /etc/init.d/salt-minion stop
刪除key目錄讓其重新生成:

rm -rf /etc/salt/pki
啟動服務
/etc/init.d/salt-minion start
 
salt-key命令
salt-key -L  列出master的key認證情況
salt-key -a minion_id  通過指定minion的key認證
salt-key -A   批量通過minion的key認證
salt-key -d minion_id 刪除指定minion的key認證
salt-key -D   批量刪除minion的key認證

minion沒有監聽端口的。minion在通過與master的key認證后一直與master的4505端口保持連接。
master監聽4505和4506兩個端口,
4505是消息發布端口,
4506是消息接收端口,接收執行返回結果和命令執行情況的
一、salt常用命令
1.salt 該命令執行salt的執行模塊,通常在master端運行,也是我們最常用到的命令
salt [options] '<target>' <function> [arguments]
如: salt '*' test.ping

2.salt-run 該命令執行runner(salt帶的或者自定義的,runner以后會講),通常在master端執行,比如經常用到的manage
salt-run [options] [runner.func]
salt-run manage.status   ##查看所有minion狀態
salt-run manage.down     ##查看所有沒在線minion
salt-run manged.up       ##查看所有在線minion

3.salt-key 密鑰管理,通常在master端執行
salt-key [options]
salt-key -L              ##查看所有minion-key
salt-key -a <key-name>   ##接受某個minion-key
salt-key -d <key-name>   ##刪除某個minion-key
salt-key -A              ##接受所有的minion-key
salt-key -D              ##刪除所有的minion-key

4.salt-call 該命令通常在minion上執行,minion自己執行可執行模塊,不是通過master下發job
salt-call [options] <function> [arguments]
salt-call test.ping           ##自己執行test.ping命令
salt-call cmd.run 'ifconfig'  ##自己執行cmd.run函數

5.salt-cp 分發文件到minion上,不支持目錄分發,通常在master運行
salt-cp [options] '<target>' SOURCE DEST
salt-cp '*' testfile.html /tmp
salt-cp 'test*' index.html /tmp/a.html

6.salt-ssh 0.17.1版本加入的salt-ssh

7.salt-master master運行命令
salt-master [options]
salt-master            ##前台運行master
salt-master -d         ##后台運行master
salt-master -l debug   ##前台debug輸出

8.salt-minion minion運行命令
salt-minion [options]
salt-minion            ##前台運行
salt-minion -d         ##后台運行
salt-minion -l debug   ##前台debug輸出

9.salt-syndic syndic是salt的代理,以后會說到

二、普通用戶執行salt
普通用戶執行salt兩種方案:1,salt ACL 2.salt external_auth
1.ACL
1) 設置master配置文件
client_acl:
    monitor:
     - test*:
    - test.*
    dev:
     - service.*
    sa:
     - .*
2) 重啟Master
service salt-master restart
3) 目錄和文件權限
chmod +r /etc/salt/master
chmod +x /var/run/salt
chmod +x /var/cache/salt
4) 測試
# su - monitor
# salt 'test*' test.ping
# exit; su - sa
# salt '*' test.ping
# salt '*' cmd.run 'uptime'
# exit;
2.external_auth
1) 修改master配置文件
 external_auth:
pam: monitor: – ‘test‘: – test. sa: – .* – 2) 3)與ACL相同
4) 測試
# salt -a pam 'test*' test.ping    ##會提示輸入賬號密碼,所以external_auth與當前用戶無關
   username: monitor
       password:
 # su - monitor
 # salt -a pam '*' cmd.run 'uptime'
username: sa
password:
5) 使用Token不必每次都輸入賬號密碼,使用external_auth每次都是需要密碼的,這樣多麻煩,這里引入了Token,它會保存一串字符到在當前用戶家目錄下.salt_token中,在有效時間內使用external_auth是不需要輸入密碼的,默認時間12hour,可以通過master配置文件修改
# salt -T -a pam '*' test.ping
username: sa
password:
#salt -a pam '*' test.ping #不會提示輸入密碼了

三、target
指定你的命令或者模塊應用哪寫Minion上
1.globbing 默認
salt 'test*' test.ping
2.RE 正則
salt -E 'web1-(pro|devel)' test.ping
3.List 列表
salt -L '127.0.0.1, test*' test.ping
4.grains
salt -G 'os:CentOS' test.ping
 
#查看所有grains鍵/值
salt 'test*' grains.items
#查看所有grains項
salt 'test*' grains.ls
查看某個grains的值
salt 'test*' grains.item num_cpus
在top file中匹配grains
'node_type:web':
  - match: grain         #沒有s
  - webserver

top file中使用jinja模板
{% set self = grains['node_type'] %}
    - match: grain
- {{ self }}

5.nodegroups 其實就是對Minion分組
首先在master的配置文件中對其分組,推薦寫到/etc/salt/master.d/中一個獨立的配置文件中,比如nodegroup.conf
vim /etc/salt/master.d/nodegroup.conf 
#寫到master中也是這個格式,master.d中*.conf是默認動態加載的
nodegroups:
 test1: 'L@test1,test2 or test3*'
 test2: ‘G@os:CenOS or test2'
 
salt -N test1 test.ping                #-N指定groupname
 
在top file中使用nodegroups
 
'test1':
 - match: nodegroup                   ##意沒s
 - webserver

6.混合指定,就是將以上的混合起來用
G Grains glob G@os:Ubuntu
 E PCRE Minion ID E@web\d+\.(dev|qa|prod)\.loc
 P Grains PCRE P@os:(RedHat|Fedora|CentOS)
 L List of minions L@minion1.example.com,minion3.domain.com or bl*.domain.com
 I Pillar glob I@pdata:foobar
 S Subnet/IP address S@192.168.1.0/24 or S@192.168.1.100
 R Range cluster R@%foo.bar
 
 salt -C 'G@os:CentOS and L@127.0.0.1,192.168.1.12' test.ping

top file 指定:
'webserver* and G:CentOS or L@127.0.0.1,test1':
   - match: compound
- webserver

7.一次在n個minion上執行
-b n
--batch-size n
示例:
salt '*' -b 5 test.ping 5個5個的ping

四、遠程批量執行
格式:
salt '<target>' <function> [argument]
注: function是salt帶的或自己寫的可執行模塊里面的function,自帶的所有列表http://docs.saltstack.com/ref/modules/all/index.html?highlight=full%20list%20builtin 實例:

salt '*' at.at 10.10am 'uptime'
salt '*' test.ping

五、多Master
1.在另一台機器上安裝salt-master
yum -y install salt-master
2.將原來master上的master密鑰拷貝到新的master是一份
scp /etc/salt/pki/master/master* newmaster:/etc/salt/pki/master/
3.啟動新的Master
service salt-master start
4.修改minion配置文件/etc/salt/minion設置兩個master
 master:
   - master1
- master2
5.重啟minion
service salt-minion restart
6.在新的master上接受所有key
salt-key -L
salt-key -A
注意:
1.2個master並不會共享Minion keys,一個master刪除了一個key不會影響另一個
2.不會自動同步File_roots,所以需要手動去維護,如果用git就沒問題了
3.不會自動同步Pillar_Roots,所以需要手工去維護,也可以用git
4.Master的配置文件也是獨立的

六、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
***********模塊***********
查看模塊列表module
salt 'minion' sys.list_modules
查看指定module的function用法
salt 'minion' sys.list_functions file
查看指定模塊的詳細用法
salt 'minion' sys.doc cmd

***********模塊使用說明***********
查看配置管理state模塊列表
salt 'minion' sys.list_state_modules
查看配置管理sate列表指定模塊所有方法列表
salt 'minion' sys.list_state_functions svn
查看配置管理state列表指定模塊詳細用法
salt 'minion' sys.state_doc file
查看配置管理state列表指定模塊的方法分支
salt 'minion' sys.state_doc file.managed

***********pillar變量***********
查看主機對應的所有pillar變量值
salt '*' pillar.data
salt '*' pillar.items
查看主機對應的多個pillar變量值
salt '*' pillar.item roles appname
修改pillar值后需要刷新pillar數據
salt '*' saltutil.refresh_pillar
查看pillar模塊詳細用法,其他類似
salt 'minion' sys.doc pillar
查看pillar的相關方法
salt 'minion' sys.list_functions pillar
"""
shuke:
    - pillar.data
    - pillar.ext
    - pillar.get
    - pillar.item
    - pillar.items
    - pillar.raw
"""

***********grains變量***********
查看模塊用法
salt 'minion' sys.list_functions grains
查看item項
salt 'minion' grains.ls
查看所有iteams
salt 'minion' grains.items
獲得某個item值
salt 'minion' grains.get os
同步_grains目錄下的py腳本至minion
salt 'minion' saltutil.sync_all
如果py模塊有修改,修改后進行重載
salt 'minion' sys.reload_modules

***********minions在線狀態***********
查看所有minion狀態
salt-run manage.status
查看所有minion在線狀態
salt-run manage.up
查看所有minion不在線狀態
salt-run manage.down

***********key管理***********
salt-key 密鑰管理,通常在master端執行
salt-key [options]
salt-key -L              ##查看所有minion-key
salt-key -a <key-name>   ##接受某個minion-key
salt-key -d <key-name>   ##刪除某個minion-key
salt-key -A              ##接受所有的minion-key
salt-key -D              ##刪除所有的minion-key

***********salt-call相關***********
salt-call 該命令通常在minion上執行,minion自己執行可執行模塊,不是通過master下發job
salt-call [options] <function> [arguments]
salt-call test.ping           			##自己執行test.ping命令
salt-call cmd.run 'ifconfig'  			##自己執行cmd.run函數

***********文件分發***********
salt-cp 分發文件到minion上,不支持目錄分發,通常在master運行
salt-cp [options] '<target>' SOURCE DEST
salt-cp '*' testfile.html /tmp
salt-cp 'test*' index.html /tmp/a.html
salt 'S1_0_001_Room' cp.get_dir salt://package /tmp -v  同步目錄
salt 'S1_0_001_Room' cp.get_file salt://package/minions.tar.gz /tmp/minions.tar.gz gzip=5    同步文件

**********其他***********
salt-run jobs.active            #查看所有minion當前正在運行的jobs
salt '*' saltutil.running       # 查看正在運行的任務,找到jid
salt '*' saltutil.kill_job jid  # 根據jid殺掉任務
salt '*' saltutil.clear_cache   # 清除minion緩存

執行單個命令
salt 'minion' cmd.run 'ps -ef | grep mongod'

測試單個sls模塊
salt 'minion' state.sls nginx test=True

執行前進行測試
salt 'minion' state.highstate test=True

在所有minion上執行狀態:
salt 'minion' sate.highstate

獲取執行jib任務的md5值
salt 'minion' hashutil.md5_digest 20170202150211366486

low數據可以使用state.show_lowstate方法查看
salt 'minion' state.show_lowstate --out yaml

High State數據可以使用state.show_hoghstate方法查看
salt 'minion' state.show_highstate --out yaml

#查看highstate
salt 'minion' state.show_highstate
#查看lowdata
salt 'minion' state.show_lowstate

#執行所有top.sls
salt '*' state.apply

#執行指定環境下top.sls
salt '*' state.apply saltenv=dev

注:
name:要執行的命令,記住該命令將會在salt-minion的路徑和權限下執行
onlyif:用於檢查的命令,僅當``onlyif``選項指向的命令返回true時才執行name定義的命令
unless:用於檢查的命令,僅當``unless``選項指向的命令返回false時才執行name指向的命令

查看wyd用戶下進程
salt -N 'Z1_S2' cmd.run 'su -c "ps -u wyd | grep -v top | grep -v bash | grep -v sshd | grep -v grep | grep -v ps | grep -v CMD " wyd'

state中(鈎子函數)
requisiterequisite:require/watch/onchanges/onfail/use/prereq/require_in(反轉)

========Targeting Minion=======
#Glob(默認)
salt '*' test.ping
salt \* test.ping

#PCRE 正則表達式
salt -E '^[m|M]in.[e|o|u]n$' test.ping = salt -E '^[mM]in.[eou]n$' test.ping

#list
salt -L web1,web2,db1 test.ping

#Subnet
salt -S 192.168.1.100 test.ping
salt -S 192.168.0.0/16 test.ping

#Grain
salt -G 'os:ubuntu' test.ping
salt -G 'os_family:Debian' test.ping
salt -G 'ip_interfaces:eth0:192.168.1.100' test.ping
salt -G 'ipv6:::1' test.ping
salt --grain-pcre 'os:red(hat|flag)' test.ping

#Pillar
salt -I 'my_var:my_val' test.ping

#混合(Compound)
salt -C 'G@os:Ubuntu,I@role:web,S@192.168.1.100/24' test.ping
salt -C 'min* or *ion' test.ping
salt -C 'web* or *qa,G@os:Arch' test.ping

#Nodegroup
salt -N webdev test.ping

添加計划任務
salt 'S1_*_Center' cron.set_job root   '0' '5' '*' '*' '*'  '/usr/sbin/logrotate -vf /etc/logrotate.d/acl >/tmp/cutacl_log 2>&1' identifier=cutacl

刪除計划任務
salt -C 'E@S1_(10001|10002|10003)_*' cron.rm_job wyd 'cd /data/wyd/game_server_1.2.0/log;find . -type f -mtime +15 -name "*.log*" -exec rm -rf {} \; 2>&1' identifier='clear log'
SLS文件
簡述
SLS(代表SaLt State文件)是Salt State系統的核心。SLS描述了系統的目標狀態,由格式簡單的數據構成。這經常被稱作配置管理

top.sls
top.sls 是配置管理的入口文件,一切都是從這里開始,在master 主機上,默認存放在/srv/salt/目錄. 
top.sls 默認從 base 標簽開始解析執行,下一級是操作的目標,可以通過正則,grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件,不包換擴展名。

創建 /srv/salt/top.sls

通過正則進行匹配的示例,
base:
  '*':
    - webserver
通過分組名進行匹配的示例,必須要有 - match: nodegroup
base:
  group1:
    - match: nodegroup    
    - webserver
通過grain模塊匹配的示例,必須要有- match: grain
base:
  'os:Fedora':
    - match: grain
    - webserver
准備好top.sls文件后,編寫一個state文件

/srv/salt/webserver.sls
apache:                 # 標簽定義
  pkg:                  # state declaration
    - installed         # function declaration
第一行被稱為(ID declaration) 標簽定義,在這里被定義為安裝包的名。注意:在不同發行版軟件包命名不同,比如 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2
第二行被稱為(state declaration)狀態定義, 在這里定義使用(pkg state module)
第三行被稱為(function declaration)函數定義, 在這里定義使用(pkg state module)調用 installed 函數
最后可以在終端中執行命令來查看結果:

salt '*' state.highstate
或附件 test=True參數 測試執行

salt '*' state.highstate -v test=True 
主控端對目標主機(targeted minions)發出指令運行state.highstatem模塊,目標主機首先會對top.sls下載,解析,然后按照top.sls內匹配規則內的定義的模塊將被下載,解析,執行,然后結果反饋給 master.

SLS文件命名空間
注意在以上的例子中,SLS文件 webserver.sls 被簡稱為webserver. SLS文件命名空間有如下幾條基本的規則:

SLS文件的擴展名 .sls 被省略。 (例如. webserver.sls 變成 webserver)
子目錄可以更好的組織,每個子目錄都由一個點來表示.(例如 webserver/dev.sls 可以簡稱為 webserver.dev)
如果子目錄創建一個init.sls的文件,引用的時候僅指定該目錄即可. (例如 webserver/init.sls 可以簡稱為 webserver)
如果一個目錄下同時存在webserver.sls 和 webserver/init.sls,那么 webserver/init.sls 將被忽略,SLS文件引用的webserver將只引用webserver.sls
state多文件示例
下面是一個state多文件示例,

apache/init.sls
apache/httpd.conf
ssh/init.sls
ssh/server.sls
ssh/banner
ssh/ssh_config
ssh/sshd_config
創建一個引用這些目錄的 server.sls

server:
  - apache
  - ssh
state的層級關系
include 示例:
include 包含某個state文件
/srv/salt/apache.sls

apache:
  pkg:
    - installed
  service:
    - running 
    - require:
      - pkg: apache
使用 include 可以包換有state文件而不必重新寫

/srv/salt/apache-custom.sls
include: 
  apache 
extend 示例:
extend 與include配合使用,作用是 修改,或擴展引用的state文件的某個字段
/srv/salt/apache.sls

apache:
  pkg:
    - installed
  service:
    - running 
    - require:
      - pkg: apache
extend默認是替換引用文件的某個字段的屬性,如例

/srv/salt/apache-change.sls
include: 
  - apache 
extend:
  apache  
    pkg:
      - name: vim
      - installed     
當extend與watch,或require結合使用的時候,則是擴展某個字段的屬性,如例:

/srv/salt/apache-custom.sls
include: 
  - apache 
extend:
  apache  
    service:
      - watch:
        - file: /etc/redis.conf      
state的邏輯關系列表
match: 配模某個模塊,比如 match: grain match: nodegroup
require: 依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個
watch: 在某個state變化時運行此模塊
order: 優先級比require和watch低,有order指定的state比沒有order指定的優先級高
state的邏輯關系實例
require:依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個
httpd:                                  # maps to "name"
  pkg:    
    - installed  
  file:                                # maps to State module filename
    - managed:                          # maps to the managed function in the file State module
    - name: /etc/httpd/conf/httpd.conf  # one of many options passed to the manage function
    - source: salt://httpd/httpd.conf
    - require:  
      - pkg: httpd
watch:在某個state變化時運行此模塊,watch除具備require功能外,還增了關注狀態的功能。
redis:
  pkg:
    - latest
  file.managed:
    - source: salt://redis/redis.conf
    - name: /etc/redis.conf
    - require:
      - pkg: redis
  service.running:
    - enable: True
    - watch:
      - file: /etc/redis.conf
      - pkg: redis
order:優先級比require和watch低,有order指定的state比沒有order指定的優先級高
vim:
  pkg.installed:
    - order: 1
想讓某個state最后一個運行,可以用last

進階主題:模板
使用模板來精簡SLS,使SLS可以使用python的 循環,分支,判斷 等邏輯
{% for item in ['tmp','test'] %}
/opt/{{ item }}:
  file.directory:
    - user: root
    - group: root
    - mode: 755
    - makedirs: True
{% endfor %}
```markdown
httpd:
  pkg.managed:
{% if grains['os'] == 'Ubuntu' %}
    - name: apache2
{% elif grains['os'] == 'CentOS' %}
    - name: httpd
{% endif %}
    - installed
通過加載jinja模板引擎,可以模板配置文件按照預訂條件來生成最終的配置文件
/opt/test.conf

{% if grains['os'] == 'Ubuntu' %}
host: {{ grains['host'] }}
{% elif grains['os'] == 'CentOS' %}
host: {{ grains['fqdn'] }}
{% endif %}
```markdown
/opt/test.conf:
  file.managed:
    - source: salt://test.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja

#########################################

scp與rsync  遠程同步拷貝

#########################################

swapoff -a關掉

永久生效:

echo "vm.swappiness = 0">> /etc/sysctl.conf    

(盡量不使用交換分區,注意不是禁用)

刷新
SWAP

可以執行命令刷新一次SWAP(將SWAP里的數據轉儲回內存,並清空SWAP里的數據)

swapoff -a && swapon -a

sysctl -p  (執行這個使其生效,不用重啟)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM