一、state和之前執(zhí)行模塊的區(qū)別
執(zhí)行模塊是過程式的,而狀態(tài)模塊是描述式的。當(dāng)連續(xù)幾次調(diào)用同一個執(zhí)行模塊時,實(shí)際上是執(zhí)行相同的邏輯和指令。狀態(tài)模塊則恰恰相反,它們只執(zhí)行必要的工作,在目標(biāo)minion上創(chuàng)建根據(jù)描述文件指定的狀態(tài)。

連續(xù)執(zhí)行 pkg.install

連續(xù)執(zhí)行 state配置
# /srv/salt/vsftpd.sls
install_vsftpd:
pkg.installed:
- name: vsftpd
從上面的例子上可以看到 pkg.install 只是運(yùn)行了 yum install vsftpd -y 的命令,而 state 模塊會先判斷 vsftpd 軟件是否已經(jīng)安裝了,如果沒有安裝就進(jìn)行安裝操作,如果已經(jīng)安裝過了就什么都不做。所有的狀態(tài)描述都會遵循這個原則,只有在檢測到真實(shí)狀態(tài)和所需狀態(tài)不同的時候才會執(zhí)行功能。
二、state模塊的語法
SLS配置文件使用YAML語言描述,主要有以下規(guī)則:
- 1、縮進(jìn):YAML使用了固定的縮進(jìn)風(fēng)格來表示數(shù)據(jù)層級的關(guān)系(和Python用縮進(jìn)來進(jìn)行流程控制一樣),每個縮進(jìn)級別可以使用2個或者4個空格(不要用制表符)
- 2、冒號:字典中的keys在YAML中的表現(xiàn)形式是一個以冒號結(jié)尾的字符串,value的表現(xiàn)形式是冒號后面空一格然后寫value
key: value
在python中,上面的將映射為下面的字典
{'key': 'value'}
- 3、短橫杠:用一個短橫杠加一個空格來表示列表項(xiàng),多個項(xiàng)使用同一個縮進(jìn)級別作為同一列表的一部分。
my_list:
- value_one
- value_two
- vlaue_three
在python中,上面的將映射為下面的結(jié)構(gòu)
{'my_list':['value_one','value_two','value_three']}
三、常用狀態(tài)模塊的語法
先介紹兩個命令
salt '*' sys.list_state_functions #查看可用的狀態(tài)模塊
salt '*' sys.list_state_functions pkg #查看狀態(tài)模塊中可用的函數(shù)
- cmd 和 archive 狀態(tài)模塊常用函數(shù)
extract_myapp:
archive.extracted:
- name: /usr/src #解壓文件在minion上的位置
# 解壓zip文件
# - use_cmd_unzip: True
# - source: salt://src/nginx-1.12.1.zip #要解壓的文件的位置
- source: salt://src/nginx-1.12.2.tar.gz #要解壓的文件的位置
- user: root
- group: root
- if_missing: /usr/src/nginx-1.12.2
cmd_test:
cmd.run:
- cwd: /usr/src #執(zhí)行命令的目錄
- name: pwd && date #多條命令一定要用&&,不要一條一條執(zhí)行
- file 狀態(tài)模塊的常用函數(shù)
# file.managed: 下發(fā)文件到指定minion,確保文件存在
/usr/src/vsftpd.sls: # 發(fā)送到minion上的位置
file.managed:
- source:
- salt://vsftpd.sls
- user: root
- group: root
- mode: 644
# file.directory: 在指定minion上創(chuàng)建文件夾
/tmp/mk_salt:
file.directory:
- user: root
- group: root
- mode: 755
- makedirs: True
# file.recurse: 下發(fā)整個目錄
/root/httpd: #發(fā)送到minion上的目錄位置
file.recurse:
- source: salt://service/httpd
- include_empty: True
# file.symlink: 建立軟連接
/tmp/test: # 鏈接文件位置
file.symlink:
- target: /root/httpd/test # 源文件位置
- pkg 狀態(tài)模塊的常用函數(shù)
install_vsftpd:
pkg.installed: # yum安裝軟件
- pkgs:
- vsftpd
- ftp
- lftp
- sources: #指定rpm包的位置
- httpd: salt://rpm/httpd.rpm
- service 狀態(tài)模塊常用函數(shù)
run_vsftpd:
service.running:
- name: vsftpd #啟動的服務(wù)名
- enable: True #是否開機(jī)自啟
- reload: True
- cron 狀態(tài)模塊常用函數(shù)
netdate times.aliyun.com &>/dev/null:
cron.present:
- user: root
- minute: '6'
- hour: '5'
- daymonth: '6'
- month: '12'
- dayweek: 5
- user 狀態(tài)模塊常用函數(shù)
add_user:
user.present:
- name: hong #要添加的用戶名
- fullname: This is test user #用戶說明信息
- shell: /bin/zsh
- createhome: True # 創(chuàng)建家目錄,F(xiàn)alse時不創(chuàng)建
- password: $1$f7Mff5j4$H/10mh4IkqgY9y39EKHTj1 # 用戶密碼,用 openssl passwd -l '密碼' 命令來生成
- groups: # 用戶附加組
- root
- daemon
- 使用 require 和 watch 進(jìn)行排序控制
??require:只有以來的步驟操作成功后才開始進(jìn)行本步驟
??watch:一旦檢測到 vsftpd.conf 文件發(fā)生變化,就重新加載 vsftpd 服務(wù)
install_vsftpd:
pkg.installed:
- pkgs:
- vsftpd
- ftp
- lftp
run_vsftpd:
service.running:
- name: vsftpd #啟動的服務(wù)名
- enable: True #是否開機(jī)自啟
- reload: True
- require:
- pkg: install_vsftpd
- watch:
- file: vsftpd_conf
vsftpd_conf:
file.managed:
- name: /etc/vsftpd/vsftpd.conf
- source: salt://vsftpd.conf
- user: root
- group: root
- mode: 600
四、使用狀態(tài)模塊yum安裝 LAMP 環(huán)境
apache_install:
pkg.installed:
- name: httpd
mysql_install:
pkg.installed:
- pkgs:
- mysql-server
- mysql
- mysql-devel
php_install:
pkg.installed:
- pkgs:
- php
- php-common
- php-gd
- php-mbstring
- php-mcrypt
- php-devel
- php-xml
- php-soap
- require:
- pkg: apache_install
httpd_conf:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd.conf
- user: root
- group: root
- mode: 644
- require:
- pkg: apache_install
php_conf:
file.managed:
- name: /etc/php.ini
- source: salt://php.ini
- user: root
- group: root
- mode: 644
- require:
- pkg: php_install
mysql_conf:
file.managed:
- name: /etc/my.cnf
- source: salt://my.cnf
- user: root
- group: root
- mode: 644
- require:
- pkg: mysql_install
apache_run:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- pkg: apache_install
- watch:
- file: httpd_conf
- file: php_conf
mysql_run:
service.running:
- name: mysqld
- enable: True
- reload: True
- require:
- pkg: mysql_install
- watch:
- file: mysql_conf



LAMP狀態(tài)模塊部署結(jié)果