学了三天的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
vim dns.sls //内容
/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作为模板文件
运行: salt '*' state.highstate
==================================================================
案例二: 自动化部署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
//lamp配置文件如下:
#包安装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
- watch_in: # watch_in方法:上级模块file被service模块所关注,如果file状态改变,service模块就重启.- - service: mysql-service
- service.running:
- name: mysqld
- enable: True
vim
/srv/salt/top.sls
//注意top.sls的路径
#指定项目根路径
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
修改了配置文件后,根据依赖关系服务重启.(这里显示minion服务器mysql启动失败,是因为试验机器上不小心误删了mysql.sock文件.)
file_roots:
base:
- /srv/salt/
dev:
- /srv/salt/dev
test:
- /srv/salt/test
prod:
- /srv/salt/prod
mkdir /srv/salt/{dev,test,prod}
base:
'*':
- - init.dns //如果写成带一个点的形式,那么点前面是目录名字,后面是sls文件名字。
mkdir init
cd init
vim dns.sls //内容
/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
- watch_in: # watch_in方法:上级模块file被service模块所关注,如果file状态改变,service模块就重启.
- - service: mysql-service
- service.running:
- name: mysqld
- enable: True
vim
/srv/salt/top.sls
//注意top.sls的路径
#指定项目根路径
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
修改了配置文件后,根据依赖关系服务重启.(这里显示minion服务器mysql启动失败,是因为试验机器上不小心误删了mysql.sock文件.)