學了三天的saltstack,今天實際配置批量部署lamp(yum 安裝)
環境: base, dev(開發環境), test(測試環境), prod(生產環境)
vim /etc/salt/master
file_roots:
base:
- /srv/salt/
dev:
- /srv/salt/dev
test:
- /srv/salt/test
prod:
- /srv/salt/prod
mkdir /srv/salt/{dev,test,prod}
案例一:初始化配置
vim /srv/salt/top.sls //內容如下
base:
'*':
- - init.dns //如果寫成帶一個點的形式,那麼點前面是目錄名字,後面是sls文件名字。
mkdir init
cd init
/etc/resolve.conf:
file.managed:
- source: salt://init/files/resolv.conf //說明 salt://爲當前環境(base)的主目錄(/srv/salt/)下。
- user: root
- group: root
- mode: 644
mkdir /srv/salt/init/files //在此目錄下放resolv.conf作爲模板文件
==================================================================
案例二: 自動化部署lamp環境
三個模塊:
pkg 安裝軟件包
file 管理配置文件
service 服務管理
思路: lamp需要安裝的軟件包有 httpd, php, mysql, mysql-server, php-mysql, php-pdo
預設:我們把這個lamp的安裝項目放到dev環境下
cd /srv/salt/dev/
mkdir /srv/salt/dev/files/ (放配置文件)
vim /srv/salt/dev/lamp.sls
#包安裝ID
lamp-pkg-install:
pkg.installed:
- names:
- php
- mysql
- php-cli
- php-common
- php-mysql
- php-pdo
#apache ID
apache-service:
pkg.installed:
- name: httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/httpd.conf
- user: root
- group: root
- mode: 644
- require: #require方法: file這個操作的時候,文件改動需要依賴於pkg這個包安裝完成,如果這個包沒有安裝成功,後面的file操作就會失敗
- pkg: apache-service
service.running:
- name: httpd
- enable: True
- reload: True
- watch: #watch方法:service這個模塊關注file模塊,如果file狀態改變,service重載reload.
- file: apache-service
#mysql ID
- mysql-service:
- pkg.installed:
- - name: mysql-server
- - require_in: # require_in 方法: pkg的執行狀態被file所以來,如果我執行不成功,file就不執行.
- - file: mysql-service
file.managed:
- name: /etc/my.cnf
- source: salt://files/my.cnf
- user: root
- group: root
- mode: 644
- - service: mysql-service
- service.running:
- name: mysqld
- enable: True
#指定項目根路徑
dev:
'web2.coohx.com':
- lamp
salt 'web2*' state.highstate
處理狀態之間關係用到的幾個重要的方法:
require: 我依賴某個狀態 (常用於包安裝)
require_in: 我被某個狀態所依賴
watch: 我關注某個狀態 (常用於文件改動)
watch_in: 我被某個狀態所關注
[root@web1 salt]# salt 'web2*' state.highstate
web2.coohx.com:
....
...
----------
ID: apache-service
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: True
Comment: File /etc/httpd/conf/httpd.conf updated
Started: 19:22:16.063742
Duration: 56.123 ms
Changes:
----------
diff:
---
+++
@@ -273,7 +273,7 @@
# You will have to access it by its address anyway, and this will make
# redirections work in a sensible way.
#
-#ServerName www.example.com:80
+ServerName www.coohx.com:80
#
# UseCanonicalName: Determines how Apache constructs self-referencing
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: Service reloaded
Started: 19:22:16.189186
Duration: 267.497 ms
Changes:
----------
httpd:
True
----------
ID: mysql-service
Function: pkg.installed
Name: mysql-server
Result: True
Comment: Package mysql-server is already installed.
Started: 19:22:16.457774
Duration: 4.411 ms
Changes:
----------
ID: mysql-service
Function: file.managed
Name: /etc/my.cnf
Result: True
Comment: File /etc/my.cnf updated
Started: 19:22:16.463750
Duration: 25.095 ms
Changes:
----------
diff:
---
+++
@@ -13,6 +13,8 @@
# If you want to know which options a program supports, run the program
# with the "--help" option.
+#web2.coohx.com
+
# The following options will be passed to all MySQL clients
[client]
#password = your_password
@@ -24,7 +26,7 @@
# The MySQL server
[mysqld]
port = 3306
-socket = /var/lib/mysql/mysql.sock
+socket = /tmp/mysql.sock
character_set_server = utf8
skip-locking
key_buffer_size = 256M
----------
ID: mysql-service
Function: service.running
Name: mysqld
Result: False
Comment: Failed to restart the service
Started: 19:22:16.548901
Duration: 2260.008 ms
Changes:
----------
mysqld:
False
Summary
-------------
Succeeded: 11 (changed=4)
Failed: 1
-------------
Total states run: 12